【问题标题】:Is it possible to listen to AWS SNS notifications without using public callbacks?是否可以在不使用公共回调的情况下收听 AWS SNS 通知?
【发布时间】:2019-08-23 16:47:20
【问题描述】:

我刚刚开始使用 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 工作,但只能使用过于复杂的角色/dns。

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

【问题讨论】:

  • 你问的是fanout scenario吗?
  • @AlexBlex 有点像,但我对 connection 更感兴趣。我不想为我的实例创建回调和订阅者。我只想拥有一个“类似套接字”的连接。我的直觉是我需要一种不同的产品,但无法确定合适的 AWS 产品。似乎没有必要为每个实例建立一个单独的队列。
  • 那么,您可能需要详细说明什么是“socket like”连接。 pubsub 和 rabbit 都要求所有消费者订阅。订阅非常“类似于套接字”。
  • @AlexBlex 据我所知,为了使用 SNS,您需要注册订阅者回调。这需要你 i)。发布公共 URL(针对每个节点)和 ii)。在 SNS 上注册。如果您有动态数量的节点,那么设置/删除的工作量很大。我宁愿只启动一个节点,与发布者建立连接,然后收听事件。 PubSub 确实需要命名订阅,但它比 SNS 更简单,而且 RabbitMQ 允许您连接并使用在交换器上发送的消息。

标签: node.js amazon-web-services amazon-sns


【解决方案1】:

“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

它支持 MQTT over TCP 和 MQTT over web sockets,在这两种情况下都支持 TLS。

【讨论】:

  • IoT Message Broker 看起来很有趣,但也有它自己的问题……注册“设备”和分发客户端证书并不能简化事情。接受回答。干杯。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多