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

时间:2017-08-07 11:19:55

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

我刚刚开始使用SNS,据我所知,你不能简单地订阅发布者并听取事件。你必须i)。创建一个可公开访问的回调(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&# 34;不会工作**。 " SQS"可以工作,但你必须为每个实例设置一个队列,它使用长轮询而不是推。 "应用"和" lambda"不适用。

AWS SNS适用于此用例吗?如果没有,是否有其他AWS服务?

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

修改 我认为我想要做的是类似于Google Cloud PubSub SubscriptionRabbitMQ但使用本机(AWS)而不是第三方服务。

2 个答案:

答案 0 :(得分:2)

  

" 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。

答案 1 :(得分:1)

编辑:找到了以下npm软件包:https://www.npmjs.com/package/sqs-consumer 允许您这样写:

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

在这里寻找与OP相同的东西。 SNS具有订阅者选项,但是就像您说的那样,您必须手动创建订阅者并处理所有这些废话。不要使用长轮询。我将探索诸如RXDB之类的消息或诸如ZeroMQ或RabbitMQ之类的消息队列。或者,如果实现起来非常简单,则只需另一个带有websocket的节点服务器即可。