【发布时间】:2017-06-10 19:57:18
【问题描述】:
我正在尝试创建一个协作网络应用程序,让多个用户可以在各种(共享)项目上一起工作。到目前为止,我有一个 JavaScript 客户端和一个本地 jWebSocket 服务器。
为了在部署时保持可扩展性,我想到了两个选择:
选项 1
我可以使用AWS IoT 而不是多个 jWebSocket 服务器。发布项目的更改很容易,我只需要发布到例如/project/{project-id}。但是传统的请求-响应机制是如何工作的呢?
问题:通过发布到不同的主题(例如/server/1)可以访问处理请求的 EC2 实例。但是当 JS 客户端连接到 AWS IoT 时,它不知道要向任何 EC2 实例发送请求。如何将每个客户端分配给一个实例/主题?
选项 2
在AWS Application Load Balancer 后面的多个 EC2 实例上运行 jWebSocket 服务器。平衡器只需将每个客户端分配给服务器,传统的请求-响应流程不会有问题。但是推动变革呢?
问题:因为每台服务器都有自己的一组连接的客户端,它无法将更改推送到连接到另一台服务器的客户端。
备注
- 混合使用 jWebSocket 发送请求和 AWS IoT 接收事件似乎是一个草率的解决方案。
- 我假设我可以通过编程方式调整每个认知身份的 IoT 策略,以允许/拒绝订阅特定项目。
- 由于 Lambda 引入了high latency,因此无法选择使用 AWS Lambda 并完全放弃服务器(如果您有不同的体验,请分享)。
相关帖子
感谢您在这个问题上给我的任何想法。
【问题讨论】:
-
我在 Elastic Beanstalk 上运行了一个 websockets 应用程序(修改了 nginx.conf 以支持它)并且在部署时遇到了类似的问题。由于 websocket 的持久性,我们最终使用了一个集群的 akka 实例来发布消息。在部署时,我们会向 JS 客户端推送一条消息,指示它重新连接。对您提出的解决方案非常感兴趣,因为我们的解决方案并不完美。
-
感谢您让我注意到 EBS 和 Akka(我也不知道)。你能画出你最终得到的架构吗?您是否能够以请求-响应方式工作,同时能够发布到所有客户端(即使连接到不同的服务器)?
-
旁注:Elastic Beanstalk 实际上只是“EB”。 EBS 是 Elastic Block Store 的首字母缩写。
-
我猜,AWS IoT 并没有按照您的想法运行。您的客户端将消息发布到 IoT 主题。物联网规则订阅物联网主题(例如项目/+)并可以采取诸如调用 lambda 函数(docs.aws.amazon.com/iot/latest/developerguide/…)之类的操作。但没有直接与 EC2 实例对话的操作。在 AWS IoT 中,无法直接订阅主题。只有 IoT 规则可以订阅和触发操作。除此之外,我还可以为 Websocket 应用推荐 IoT 服务。
-
感谢您提供宝贵的信息。不过,这与文档所说的不一致:"The message broker uses topics to route messages from publishing clients to subscribing clients." 你知道任何类似的服务可以让我实现上述目标吗?
标签: amazon-web-services web-applications amazon-ec2 websocket