首页 > 解决方案 > 向负载均衡器后面的所有实例发送消息

问题描述

当发生某些事情时,我需要通知负载均衡器后面的所有机器。

例如,我在缓存数据的负载均衡器后面有机器,如果数据发生变化,我想通知机器,以便它们可以转储缓存。

我觉得好像我遗漏了一些东西,因为我似乎过于复杂了我与负载均衡器后面的所有机器的对话。

--

我考虑过的选项

社交网络

这样做的问题是,每台机器都需要通过 HTTPS 公开访问。

SNS 直连机器

机器会在启动时使用带有 SNS 的 EC2 URL 订阅自己。为了实现这一点,我需要要么

  1. 从任何地方(不仅仅是负载均衡器)打开这些机器到 http
  2. 创建一个安全组,让 SNS IP 范围通过 HTTPS 进入机器。
    • 这个安全组可能是静态的(从我收集的数据来看,自 2014 年以来,IP 似乎没有改变)
    • 如果我想确保此列表始终是最新的,我可以创建一个计划的 lambda,它从 AWS 提供的 json 文件更新此安全组。

通过带有扇出的 LB 的 SNS

负载均衡器 URL 将订阅 SNS。当收到通知时,其中一台机器会收到通知。

该机器将使用 AWS API 查看它所属的自动缩放组,以查找连接到同一负载均衡器的其他机器,然后使用其内部 URL 向其他机器发送相同的消息。

带扇出的 SQS

每台机器都将是一个队列工作者,其中一台将接收消息并以与上述 SNS 扇出相同的方式转发到其他机器。

Redis 发布订阅

我可以设置一个 Redis 集群,每个节点都订阅并接收更新。考虑到手头的任务(特别是考虑到我在许多地区和 AZ 开展业务),这似乎是一个昂贵的选择。

Websocket MQTT 主题

每个节点都会订阅一个 MQTT 主题并以这种方式接收更新。并非我使用的每个区域都支持 IOT Core,因此我需要在每个区域托管我自己的代理,或者让每个区域连接到它们最近的受支持(甚至单个)区域。不确定它的稳定性,但似乎它可能是一个不错的选择。

我想像 Pusher 之类的第 3 方 websocket 服务可以用于此目的。

轮询更新

每个节点包含 x 个缓存项目,我必须单独轮询每个项目或构建一些方法来确定哪些项目已更改为批量请求。

不过这似乎有点过分了——假设有 50 个项目,轮询间隔为 10 秒

每项每分钟 6 个请求 6 * 50 * 60 * 24 = 每天对某些 Web 服务/lambda 等的 432000 个请求。对于这个用例来说,这似乎是一个糟糕的选择,因为这些请求中的大多数会说没有任何变化。推送/订阅模型似乎比拉取/获取模型更好。

也许我也可以使用长轮询?

Dynamodb 流

导致缓存清除的更改是在全局 DynamoDB 表(不属于此服务或不为该服务所知)中进行的,因此我可能允许访问从每个区域的该表中读取流并通过该路由侦听更改。这将这两种服务紧密结合在一起,尽管我并不热衷于此。

标签: amazon-web-servicesload-balancingpublish-subscribe

解决方案


推荐阅读