负载平衡多实例集群背后的事件源

时间:2018-05-22 00:41:18

标签: amazon-web-services go amazon-sqs amazon-sns

我写了一个简单的Web应用程序来打印http request via Eventsource。然而,当我在部署在典型的ECS集群中时,即在负载平衡器后面的至少两个实例上,如果用户连接到一个实例并且另一个实例接收到挂钩(假设加载)平衡器调度两个不同的实例),请求将不会显示。

在将其他(有状态的)应用程序安装到在负载均衡器后面部署旋转新实例的AWS扩展样式之前,我已经看到过这种问题。它有名字吗?有关如何修复程序以使其适合AWS模型的任何建议吗?我想钩子需要写入某个数据存储区并且事件源发布者需要轮询或者更喜欢它的事件?

3 个答案:

答案 0 :(得分:3)

负载均衡多实例集群背后的EventSource SSE

  

拉取请求:https://github.com/unee-t/showhook/pull/1

负载均衡器后面的服务器需要随时了解/events。当在相邻服务器上收到事件时,该服务器必须通知该组收到的事件。

EventSource Golang Server

使用示例

获取存储库。

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文件。

  1. http://0.0.0.0:9000
  2. http://0.0.0.0:9001
  3. 在第三个标签中点击页面上的/hook链接。请注意,前两个选项卡将收到EventSource通知。

    更新了main.go App Server

    /hook-neighbor事件处理程序上向邻居添加HTTP调用。您可以向现有Go代码添加代码,以通知相邻服务器了解该事件。这将允许任何客户端接收事件,无论EventSource('/events')上订阅的服务器是什么。

    动态添加新的事件服务器

    当您需要向上和向下扩展时,您需要添加/删除服务器。让服务器了解新邻居的一种简单方法是使用服务发现。您可以考虑添加服务发现,例如etcdconsul

    你有一个好的开始!我用类似的方法构建了PubNub Network

答案 1 :(得分:0)

我个人认为,您应该找到一项关键技术(推送通知,PubNub,Aws IOT,Firebase),以帮助您解决此问题,而不是建立自己的问题。

这些HTTP实例是有状态的,因此您需要能够在它们之间共享状态。 扩展持久连接很困难,并且在它前面使用循环负载平衡器变得更加困难。 我建议您寻找能够为您完成所有这些工作的服务。

如果你想自己动手,我建议你研究一下:

  • Redis。每个用户使用一个队列。
  • Rabbit MQ - 为每个用户创建一个队列。我不认为这会扩展,但也许它适用于您的情况。
  • 对群集框架使用某种排序方式。我不知道GO。像Erlang / Elixir或Akka这样的平台支持群集。通常,您可以连接到群集的任何节点,并将消息传递给您。

使用请求/响应/轮询模型,这些实时系统无法很好地扩展。如果您不需要扩展,只需将数据存储在mysql或REDIS中并进行轮询。

答案 2 :(得分:0)

SNS + SQS扇出

我认为,这是一个可以使用 Fanout 模式使用 SNS + SQS 彻底解决的问题。您可以通过创建一个 SNS主题来构建该主题,在该主题中,一项服务将发布特定的消息(根本不关心消费者-这有助于分离),并且您将有队列订阅该主题,而其他服务将在该队列中订阅。能够按照自己的节奏消费相同的消息。因此,是的,这将解决许多接收方(或订户)的问题。

SNS + SQS Fanout

会是这样的:

  

您在SNS上有一个主题( TopicX

     

服务B 有自己的队列( QueueB ); QueueB 已订阅 TopicX

     

服务C 有自己的队列( QueueC ); QueueC 已订阅 TopicX

     

服务A 执行的操作需要在您的网络中共享

     

服务A Message1 发布到 TopicX

     

队列B 收到 Message1

     

QueueC 收到 Message1

     

ServiceB 使用 Message1

     

ServiceB QueueB

中删除 Message1      

ServiceC 使用 Message1

     

ServiceC QueueC

中删除 Message1

检查https://docs.aws.amazon.com/sns/latest/dg/SNS_Scenarios.html以获得有关此模式的更多详细信息。