好的,我有一个具有可扩展 Web 层的 Elastic beanstalk 应用程序,由 ELB 提供支持。长话短说,我需要能够将 Web 层中的特定实例订阅到 SNS 主题。使用标准方法获取实例 IP 地址(详见此处如何在 Python 中获取 eth0 的 IP 地址?)然后使用该 IP 作为 http 订阅者订阅 SNS 主题是否安全?
为什么?好问题……
我的数据模型由许多对象组成,其中许多对象可以附加一组用户,这些用户可能希望能够观察这些对象。我的应用程序中的这个 Web 层负责处理客户端应用程序的套接字接口(使用 socket.io)。
在系统中创建用户时,也会为该用户创建一个 SNS 主题,当用户感兴趣的对象发生变化时,可以向该用户推送通知。我计划设置的方式是,客户端应用程序将通过 socket.io 连接到 EB,此时它所连接的服务器实例将订阅该用户的 SNS 主题。然后,当感兴趣的对象发生变化时,通知将发布到相关用户的主题,从而通知客户端应用程序已打开连接的服务器实例,然后可以通过套接字发送消息。
我认为订阅特定实例而不是 Web 层的外部 CNAME 或 IP 很重要,因为客户端应用程序连接到特定实例,因此只有该实例可以通过其套接字发送消息。订阅负载平衡器并不好,因为通知可能会传递到用户未连接的实例。
我相信上面的问题就是我所需要的,但如果我的推理似乎有缺陷,我愿意接受创造性的解决方案?
答案1
这种架构不太适合您的用例。
- “按用户”创建 SNS 主题无法扩展,
- 订阅后端 EC2 实例需要这些后端 EC2 实例具有公共端点,
- 随着 EC2 实例的创建和终止,过期的订阅仍会保留,必须进行管理/删除,
- 此外,如果 EC2 实例被终止(由于缩减或其他故障),将用户锁定到特定的 EC2 实例将无法正常工作。
相反,尝试:
- 允许您的客户端连接连接到负载均衡器,然后允许连接根据需要跳转 EC2 实例。
- 使用另一种机制(例如 Redis pub/sub)来管理将消息发送到 EC2 实例,从而发送到客户端。