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

6
我正在尝试创建一个协作式的网络应用,多个用户可以共同在各种项目上工作。到目前为止,我拥有一个JavaScript客户端和一个本地的jWebSocket服务器。
为了保持可伸缩性,在部署时,我考虑了两个选项:
选项一:我可以使用AWS IoT代替多个jWebSocket服务器。发布项目的更改很容易,我只需要发布到例如/project/{project-id}。但是传统的请求-响应机制如何工作呢?

Sketch of option 1

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

选项2

AWS应用负载均衡器后面的多个EC2实例上运行jWebSocket服务器。负载均衡器将简单地将每个客户端分配给一个服务器,并且传统的请求-响应流程不会成为问题。但是如何推送更改呢?

Sketch of option 2

问题: 每个服务器都有自己的一组连接客户端,因此它无法向连接到另一个服务器的客户端推送更改。

备注

  • 混合使用jWebSocket发送请求和AWS IoT接收事件似乎是一个不太好的解决方案。
  • 我认为可以通过编程方式调整IoT策略,以允许/拒绝对特定项目的订阅。
  • 由于Lambda引入的高延迟,使用AWS Lambda并完全放弃服务器不是一个选项(如果您有不同的经验,请分享)。

相关帖子

IoT请求响应协议

感谢您在此问题上提供的任何想法。


我在 Elastic Beanstalk 上运行了一个 WebSockets 应用程序(稍微修改了 nginx.conf 以支持它),并遇到了类似的部署问题。由于 WebSockets 的持久性质,我们最终使用了集群化的 akka 实例来发布消息。在部署时,我们会向 JS 客户端推送一条消息,指示其重新连接。非常期待您提出的解决方案,因为我们的解决方案还不够完美。 - Dave Maple
感谢您让我了解EBS和Akka(我之前并不知道)。您能简要描述一下您最终采用的架构吗?在请求-响应方式下,您是否能够向所有客户端发布消息(即使它们连接到不同的服务器)? - Double M
旁注:Elastic Beanstalk实际上只是“EB”的缩写。EBS是Elastic Block Store的缩写。 - Michael - sqlbot
我猜AWS IoT并不像你想象的那样工作。你的客户端发布消息到IoT主题。IoT规则订阅IoT主题(例如project/+),并可以执行操作,如调用lambda函数(http://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html)。但是没有直接与EC2实例通信的操作。在AWS IoT中,没有直接订阅主题的方法。只有IoT规则可以订阅和触发操作。除此之外,我可以推荐IoT服务用于Websocket应用程序。 - hellomichibye
感谢您提供的宝贵信息。不过,这与文档所说的不一致:"消息代理使用主题将发布客户端的消息路由到订阅客户端。" 您知道是否有类似的服务可以帮助我实现上述功能吗? - Double M
显示剩余3条评论
1个回答

0

我懂了。这个问题中最早的建议指引我走向正确的方向。解决方案允许所有客户端保持直接的WebSocket连接到他们最初连接的服务器,而不需要订阅特定的主题。

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

它的工作原理如下:
  1. 当客户端连接到服务器时,服务器订阅客户端的频道
  2. 如果服务器需要向未连接的客户端发送消息,则将该消息发布到客户端的频道
  3. (你猜对了)订阅频道的服务器可以代表第一个服务器处理消息

图中的“Pusher”描述了this SaaS,但当然可以用任何其他消息服务替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接