如何在弹性beanstalk应用程序中将特定实例订阅到SNS主题?

好的,所以我有一个可伸缩Web层的弹性beanstalk应用程序,在ELB后面提供服务。 长话短说,我需要能够在我的networking层中订阅特定的实例到SNS主题。 我使用标准方法获取实例ip地址是安全的吗(详见python这里我怎样才能得到eth0在Python中的IP地址?),然后简单地订阅一个SNS主题,使用该ip作为http订户?

为什么? 好问题…

我的数据模型是由许多对象组成的,其中许多对象可能有一组用户可能希望能够观察这些对象。 我的应用程序中的这个Web层负责处理客户端应用程序的套接字接口(使用socket.io)。

在系统中创build用户时,对用户来说也是一个SNS主题,允许在用户感兴趣的对象发生变化时将通知推送给该用户。 按照我打算设置的方式,客户端应用程序将通过socket.io连接到EB,此时连接到的服务器实例将订阅该用户的SNS主题。 然后,当有趣的对象发生变化时,通知将被发布到关联的用户主题,从而通知服务器实例客户端应用程序已打开连接,然后可以向套接字发送消息。

我相信重要的是特定的实例订阅,而不是Web层的外部CNAME或IP,因为客户端应用程序连接到特定的实例,所以只有该实例可以通过它的套接字发送消息。 订阅负载均衡器将不太合适,因为通知可能会传递给用户未连接到的实例。

我相信顶端的问题是我所需要的,但如果我的推理看起来有缺陷,我可以开放创造性的解决scheme。

这种架构不适合您的使用情况。

  1. 创build“每个用户”的SNS主题不会缩放,
  2. 让您的后端EC2实例订阅需要这些后端EC2实例具有公共端点,
  3. 由于EC2实例被创build和终止,陈旧的订阅将继续存在,并且必须被pipe理/删除,
  4. 另外,如果该EC2实例将被终止(由于缩小或其他故障),将用户locking到特定的EC2实例将无法正常工作。

相反,请尝试:

  1. 允许您的客户端连接连接到负载均衡器,然后根据需要允许连接跳转EC2实例。
  2. 使用其他机制(如Redis pub / sub)来pipe理将消息传递给EC2实例,从而传递给客户端。