AWS:为运行在多个实例上的多个工作进程广播通知



我在Amazon EC2中有多个应用程序实例,每个实例运行几个工作进程。我想要的是每个工作进程都订阅一些通知(例如:配置更改)。这个通知基本上应该是广播消息,这样一旦它被发送,每个 worker都会收到它。

我知道SQS不支持消息广播。通过类似的问题/线程,我看到了使用SNS而不是SQS的建议。由于以下原因,我不确定这是否适用于我:

  • 应用程序实例是自动伸缩组的一部分,因此可以动态添加和删除它们。在这种情况下,一旦实例终止,我看不到任何明确的方法来取消订阅每个工人(每个实例有多个工人),这意味着我将在一段时间后结束与死亡订阅者的混乱。用于订阅的
  • 协议也不清楚。HTTP端点似乎是唯一的选项,这意味着我的每个worker都应该在自己的端口上运行HTTP服务器。看起来我应该只监听实例公共IP,这增加了一层复杂性和不安全性。

目前我有一个基于第三方的解决方案-我使用的是0MQ发布/订阅服务器。但是我正在寻找AWS提供的一些现成的解决方案。

谢谢,Vovan

想到的开箱即用的AWS解决方案是创建一个SNS主题,然后对于每个实例,当实例启动时,它将创建自己的SQS队列并将该队列订阅到SNS主题,以便每个单独的队列获得您发布到SNS的每个消息的广播副本。

你想在实例终止时取消订阅并删除这些队列,这可以通过生命周期钩子来完成。

如果您不想使用服务器来管理生命周期钩子(将启动或终止事件发布到SNS或SQS)的处理,您可以创建一个AWS API Gateway端点来触发AWS Lambda函数,然后使用https将API Gateway端点订阅到SNS主题,在Lambda中处理清理任务,而不需要服务器。

这是几个服务一起工作,可能听起来有点复杂,但会非常便宜,需要很少的维护和关注。

我知道这是一个旧的线程,但我想分享我的经验。kineesis有一个5读/秒的节流阀。因此,如果您有10个节点以每秒1秒的速度轮询流中的事件,那么您将处于恒定的节流状态。Kinesis看起来主要用于只有几个读取器的大量写入,这不太适合广播到许多节点的用例。

我想到的另一个解决方案是使用Amazon Kinesis。这里的含义是,每个订阅者必须维护自己的检查点,以便只接收最近的通知。

Redis是一个方便的解决方案广播消息到所有订阅者的主题。它很方便,因为它可以用作快速原型的docker容器,但它也由AWS作为多节点集群的托管服务提供。

最新更新