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

Is it possible to listen to AWS SNS notifications without using public callbacks?

我刚刚开始使用 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
  })
})

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

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

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

** 您或许可以让 https 正常工作,但前提是过于复杂 roles/dns。

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

"SQS" could work but you have to set a queue up for each instance and it uses long polling rather than push.

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

不要被词组混淆 "long polling." 是的,从技术上讲就是这样,但它是在长轮询中发生的非常合法的推送操作——如果你是,比方说,5秒进入针对空队列的 20 秒长轮询,下一条到达的消息将 立即 导致您的长轮询 return 那条消息。现在。不会再过 15 秒。你不会坐在那里等待更多,即使你要求更多。长轮询本质上是 SQS 中的推送包装器。

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

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

The message broker maintains a list of all client sessions and the subscriptions for each session. When a message is published on a topic, the broker checks for sessions with subscriptions that map to the topic. The broker then forwards the publish message to all sessions that have a currently connected client.

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

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

编辑:找到这个 npm 包:https://www.npmjs.com/package/sqs-consumer 允许你这样写:

consumer.on('message_received', function(message){
  console.log(message)
})

来这里寻找与OP相同的东西。 SNS 有订阅者选项,但正如您所说,您必须手动创建订阅者并处理所有这些废话。不要使用长轮询。我将探索 RXDB 或某种类型的消息队列,如 ZeroMQ 或 RabbitMQ。或者如果它的实现足够简单,只需另一个带有 websockets 的节点服务器。