我写了一个简单的Web应用程序来打印http request via Eventsource。然而,当我在部署在典型的ECS集群中时,即在负载平衡器后面的至少两个实例上,如果用户连接到一个实例并且另一个实例接收到挂钩(假设加载)平衡器调度两个不同的实例),请求将不会显示。
在将其他(有状态的)应用程序安装到在负载均衡器后面部署旋转新实例的AWS扩展样式之前,我已经看到过这种问题。它有名字吗?有关如何修复程序以使其适合AWS模型的任何建议吗?我想钩子需要写入某个数据存储区并且事件源发布者需要轮询或者更喜欢它的事件?
答案 0 :(得分:3)
负载均衡器后面的服务器需要随时了解/events
。当在相邻服务器上收到事件时,该服务器必须通知该组收到的事件。
获取存储库。
git clone git@github.com:stephenlb/showhook.git
cd showhook
您必须使用make
设置项目。
make build
make network
现在您可以运行容器了。请注意,我们有一个带有二进制文件的12MB容器。我们通过在Dockerfile中创建构建容器和运行时容器来使容器变小。这使容器从400MB减少到12MB。
PORT=9000 NEIGHBORS=192.168.0.1:9001 make start
PORT=9001 NEIGHBORS=192.168.0.1:9000 make start
现在打开浏览器加载html文件。
在第三个标签中点击页面上的/hook
链接。请注意,前两个选项卡将收到EventSource通知。
main.go
App Server 在/hook-neighbor
事件处理程序上向邻居添加HTTP调用。您可以向现有Go代码添加代码,以通知相邻服务器了解该事件。这将允许任何客户端接收事件,无论EventSource('/events')
上订阅的服务器是什么。
当您需要向上和向下扩展时,您需要添加/删除服务器。让服务器了解新邻居的一种简单方法是使用服务发现。您可以考虑添加服务发现,例如etcd和consul。
你有一个好的开始!我用类似的方法构建了PubNub Network。
答案 1 :(得分:0)
我个人认为,您应该找到一项关键技术(推送通知,PubNub,Aws IOT,Firebase),以帮助您解决此问题,而不是建立自己的问题。
这些HTTP实例是有状态的,因此您需要能够在它们之间共享状态。 扩展持久连接很困难,并且在它前面使用循环负载平衡器变得更加困难。 我建议您寻找能够为您完成所有这些工作的服务。
如果你想自己动手,我建议你研究一下:
使用请求/响应/轮询模型,这些实时系统无法很好地扩展。如果您不需要扩展,只需将数据存储在mysql或REDIS中并进行轮询。
答案 2 :(得分:0)
我认为,这是一个可以使用 Fanout 模式使用 SNS + SQS 彻底解决的问题。您可以通过创建一个 SNS主题来构建该主题,在该主题中,一项服务将发布特定的消息(根本不关心消费者-这有助于分离),并且您将有队列订阅该主题,而其他服务将在该队列中订阅。能够按照自己的节奏消费相同的消息。因此,是的,这将解决许多接收方(或订户)的问题。
会是这样的:
您在SNS上有一个主题( TopicX )
服务B 有自己的队列( QueueB ); QueueB 已订阅 TopicX
服务C 有自己的队列( QueueC ); QueueC 已订阅 TopicX
服务A 执行的操作需要在您的网络中共享
服务A 将 Message1 发布到 TopicX
队列B 收到 Message1
QueueC 收到 Message1
ServiceB 使用 Message1
ServiceB 从 QueueB
中删除 Message1ServiceC 使用 Message1
ServiceC 从 QueueC
中删除 Message1
检查https://docs.aws.amazon.com/sns/latest/dg/SNS_Scenarios.html以获得有关此模式的更多详细信息。