【问题标题】:Migrate from AMQP to Amazon SNS/SQS - need to understand concepts从 AMQP 迁移到 Amazon SNS/SQS - 需要了解概念
【发布时间】:2017-10-22 23:44:05
【问题描述】:

我在 RabbitMQ 和 AMQP 协议方面经验丰富,并且已经构建了一个包含命令、请求和事件模式的系统。

现在我要构建一个在 AWS Lambda 上运行的系统,因此使用 SNS、SQS 等。我想了解这些东西之间的“映射”。

什么是 AMQP 中的交换等价物?路由键的等价物是什么?

如何在 SNS 和 SQS 中为扇出、直接和主题​​交换(或类似)设置队列绑定?

其他人是如何处理这个问题的?在我看来,RabbitMQ 是一个为满足消息总线通常需求而构建的工具,其中 AWS 提供块,您必须自己设置/构建功能。我说的对吗?

【问题讨论】:

    标签: rabbitmq migration amqp amazon-sqs amazon-sns


    【解决方案1】:

    AMQP 中的交换等价物是什么?

    最接近的概念可能是 SNS,因为您可以配置一个 SNS topic 以发布到 n 个 SQS 队列。然后,当您写入该主题时,每个订阅的队列都会收到一条消息。如果您愿意,也可以将消息直接写入 SQS 队列。

    路由键的等价物是什么?

    没有真正的等价物。除了主题到队列的绑定之外,SNS 到 SQS 的绑定不允许任何额外的过滤/控制。您可以通过拥有多个 SNS 主题来近似路由,即每个主题都是一个“路由键”。

    如何在 SNS 和 SQS 中为扇出、直接和主题​​交换(或类似)设置队列绑定?

    • Fanout:写入 SNS 主题,每个订阅的队列都会收到相同的消息。
    • 直接:直接写入 SQS 队列或仅订阅了这些队列的 SNS 主题。
    • 主题:创建 SNS 主题并相应地订阅队列。

    其他人是如何处理这个问题的?

    我在 AWS 消息传递之前使用过 RabbitMQ,所以我经历了相同的学习曲线。 AWS 没有提供尽可能多的交换/路由功能,但根据我的经验,您可以通过 SNS 主题和 SQS 队列的某种组合足够接近

    【讨论】:

    • 谢谢 - 您的回答与我目前的发现非常吻合。所以基本上,据我了解,SNS 主题的行为类似于 AMQP 中的扇出交换。在我的特定用例中,我需要这个:我们有几台机器在收到消息时执行一项工作(我们只是说打印机),并在工作完成时发送一条消息。在 AMQP 中,我只有一个 Job.Start 交换和每台机器的路由密钥。然后我可以在一项服务中记录所有 Job.Start 流量,并让机器使用它们的路由密钥接收消息。
    • 但是为了在这里做同样的事情,我想我必须发送一个名为 job-start 的 SNS 主题,主题是机器 ID,然后有一个订阅的 Lambda该 SNS 主题,获取消息并将新消息直接发送到 job-start- - 这会是一个解决方案吗?对于基于消息的 RPC 操作,您会怎么做?
    • 它有点晚了,但它可能仍然有帮助。我遇到了一个类似的问题,我需要离开 rabbitMQ,我选择使用 Aws 去 SNS/SQS。这不是最简单的任务,但最后我整理了一个 Symfony 包来支持我的需求。我不确定您使用的是什么框架,但欢迎您查看项目并调整代码以满足您的需求。本质上,代码是一个大的 Pu/Sub,它允许消费者(sqs)订阅发布者(sns),这就是我管理路由的方式。 packagist.org/packages/beyerz/aws-queue-bundle
    • 只是想通过更新来扩充这个出色的答案,回复:“SNS 到 SQS 的绑定不允许任何额外的过滤/控制”-截至 2019 年 8 月,您现在可以附加对订阅的“过滤策略”,它应该允许一个近似的路由键行为。见:docs.aws.amazon.com/sns/latest/dg/sns-message-filtering.html
    【解决方案2】:

    看起来,带有 MQTT 的 AWS IoT 服务提供了我需要的东西,以便执行类似于 RabbitMQ 提供的路由规则!

    【讨论】:

    • 您必须实施自定义队列,因为 AWS-IoT 不允许保存任何数据。它更像是基于 MQTT 代理构建的发布/订阅系统
    • 啊 - 我可以看到物联网不会保留消息......但我想我可以订阅 SQS 队列到物联网代理吗? docs.aws.amazon.com/iot/latest/developerguide/sqs-rule.html 我想我可以相信 lamdas 和其他 AWS 订阅者将始终接收来自 IoT 代理的消息,但外部参与者(如机器或支付系统)将需要创建自己的 SQS 队列并将其订阅到我的IoT topic 然后开始消费,避免数据丢失?
    • @user2967920 我刚刚做了一些测试,在两台计算机上有一个本地 MQTT 客户端,并连接到我基于 AWS IoT 的 MQTT 代理并订阅和发布。即使我断开了其中一台计算机的连接,当我在几分钟后将其重新联机时,它仍然会收到与其订阅匹配的消息。所以我猜想在 AWS 上订阅 MQTT 主题时存在某种缓冲区/队列。不过,无论我使用的是 QoS 0 还是 1,我都看不到行为有任何显着差异。
    • 您是否为客户端使用任何 SDK?在 QoS 方面,最多一次 (0) 至少一次 (1) 恰好一次 (2)。你在用影子吗?您的断开连接和重新连接相隔多少分钟?
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 2020-08-29
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多