使用WebSockets和AWS构建Web应用程序

时间:2017-01-25 15:08:10

标签: amazon-web-services web-applications amazon-ec2 websocket

我正在尝试创建一个协作Web应用程序,其中多个用户可以在各种(共享)项目上一起工作。到目前为止,我有一个JavaScript客户端和一个本地jWebSocket服务器。

为了在部署时保持可扩展性,我想到了两个选择:

选项1

我可以使用AWS IoT而不是多个jWebSocket服务器。发布项目的更改很容易,我只需要发布到例如/project/{project-id}。但传统的请求 - 响应机制将如何运作?

Sketch of option 1

问题:可以通过发布到不同的主题(例如/server/1)来访问EC2实例处理请求。但是当JS客户端连接到AWS IoT时,它不知道发送请求的任何EC2实例。我如何将每个客户端分配给实例/主题?

选项2

AWS Application Load Balancer后面的多个EC2实例上运行jWebSocket服务器。平衡器只是将每个客户端分配给服务器,传统的请求 - 响应流程不会成为问题。但是如何推动变革?

Sketch of option 2

问题:由于每台服务器都有自己的连接客户端集,因此无法将更改推送到连接到其他服务器的客户端。

说明

  • 混合使用jWebSocket向AWS IoT发送请求以接收事件似乎是一个草率的解决方案。
  • 我假设我可以通过编程方式调整每个cognito身份的IoT策略,以允许/拒绝订阅特定项目。
  • 使用AWS Lambda并完全放弃服务器是不可取的,因为Lambda引入了high latency(如果您已经提供了不同的体验,请分享)。

相关帖子

IoT request response protocol

感谢您在此问题上给我的任何想法。

1 个答案:

答案 0 :(得分:0)

我已经知道了。 this question中的第一个建议指出了我正确的方向。该解决方案允许所有客户端与他们最初连接的服务器保持直接WebSocket连接,而无需订阅特定主题。

Servers push messages for unknown clients to the server in charge.

它的工作原理如下:

  1. 当客户端连接到服务器时,服务器订阅客户端的频道
  2. 如果服务器需要向未连接的客户端发送消息,则将该消息发布到客户端的通道
  3. (您猜对了)订阅该频道的服务器可以代表第一台服务器处理该消息
  4. "推"在图中描述了this SaaS,但当然可以被任何其他消息服务替换。