是否可以在不使用公共回调的情况下收听 AWS SNS 通知?

Sim*_*mon 6 amazon-web-services node.js amazon-sns

我刚刚开始使用 SNS,据我所知,您不能简单地订阅发布者并收听事件。你必须我)。创建一个可公开访问的回调(url/email/sms),ii)。将其注册到服务和 iii)。构建特定于回调类型的消费者。

我想使用与此类似的 API:

const client = new SnsClient({
  region: 'eu-west-1',
  topicArn: 'XXX'
})
client.on('connection', (connection) => {
  connection.on('notification', (notification) => {
    // do some work with notification
  })
})
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我想让 X 个 Web 服务器侦听单个事件(扇出)。

例如,我的工作人员可能是私有子网上的 EC2 实例,因此可用订阅:“http(s)”、“email”、“sms”将不起作用**。“SQS”可以工作,但你必须为每个实例设置一个队列,它使用长轮询而不是推送。“应用程序”和“拉姆达”不适用。

AWS SNS 适合这个用例吗?如果没有,是否有替代的 AWS 服务?

** 您也许可以让 https 工作,但只能使用过于复杂的角色/dns。

编辑: 我认为我想做的类似于Google Cloud PubSub SubscriptionRabbitMQ,但使用本机 (AWS) 而不是 3rd 方服务。

Mic*_*bot 4

“SQS”可以工作,但您必须为每个实例设置一个队列,并且它使用长轮询而不是推送。

SQS 正是在 AWS 中实现您所描述的内容的方法。SNS 不支持某种connection.on('notification',...操作方式,但这正是 SQS 长轮询在实践中的工作原理。

不要对“长轮询”这个短语感到困惑。是的,从技术上来说就是这样,但是这在很大程度上是一个合法的推送操作,发生在长轮询中——例如,如果您对一个空队列进行 20 秒的长轮询 5 秒,则到达的下一条消息将立即让您的长轮询返回该消息。现在。再过 15 秒就不行了。即使您要求更多,您也不会坐等更多。长轮询本质上是 SQS 中的推送包装器。

请注意,您不必预先定义扇出队列。每个监听器都可以为自己创建一个队列,将队列订阅到主题,然后开始监听。

或者...AWS IoT 中有消息代理。有些人可能会说这是一个有点不正统的应用程序,但它似乎支持一个主题的多个订阅者。

消息代理维护所有客户端会话和每个会话的订阅的列表。当针对主题发布消息时,代理会检查具有映射到该主题的订阅的会话。然后,代理将发布消息转发到具有当前连接的客户端的所有会话。

http://docs.aws.amazon.com/iot/latest/developerguide/iot-message-broker.html

它支持基于 TCP 的 MQTT 和基于 Web 套接字的 MQTT,这两种情况都支持 TLS。