【问题标题】:What is better design approach for RabbitMQ? [closed]RabbitMQ 更好的设计方法是什么? [关闭]
【发布时间】:2020-02-20 10:46:51
【问题描述】:

过去几周我一直在玩RabbitMQ,并开发了以下设计模式

producer <--> Exchange <---> queues <---> consumer.

我使用了几个 RabbitMQ 客户端,例如 EasyNetQ 和 MassTransit。两个客户端都使用我的上述设计,但是它们之间的共同点是,如果Exchange 不存在,它会创建一个,类似地,如果队列不存在,那么它会相应地创建一个。

但是,我认为从生产者或消费者创建交换、队列和绑定是一种好的设计方法?

在 RabbitMQ 管理中手动创建交换和队列是否更有意义?那么防止Producer和Consumer在代码中创建上述内容呢?

但我更关心的是,如果交换和队列被删除,那么它也会破坏生产者和消费者吗?

你们有什么建议?

【问题讨论】:

    标签: c# rabbitmq masstransit


    【解决方案1】:

    您的生产者和消费者的 CD(持续部署)应负责创建这些资源,您的 CD 应检查资源是否存在,如果不存在则创建。

    您应该避免从代码中创建/删除资源,生产者和消费者实际上应该只是发布/消费,如果您使用云提供商,则根本不应该授权代码来操作资源。

    我会怎么做:

    • 应从设置文件中读取消费者/生产者使用的交换/队列信息。
    • 部署开始时,CD 应创建所需的交换/队列。
    • CD 应通过环境变量覆盖设置。
    • 生产者/消费者随后将处理 CD 提供的资源信息,这样 CD 可以确保双方使用相同的队列/交换信息。

    您还将减少沟通不畅、资源过度使用和资源操纵(如删除队列!)的风险。

    在生产中,除了少数真正知道自己在做什么的人之外,不应授权任何人/任何人编辑资源。

    【讨论】:

    • 感谢叶海亚的详细建议。抱歉我一无所知,CD 是什么?
    • 请 google CI/CD,基本上 CD 是持续部署的缩写,在您的代码成功合并、构建和单元测试后触发的自动化部署过程。
    • 嗯,我明白了。是的,我知道持续集成 :) 不确定首字母缩写词 CD :)
    • 我看到rabbitmq有能力管理这个rabbitmq.com/management-cli.html
    【解决方案2】:

    我相信这个问题有两个部分。我将尝试分别服用:

    拓扑

    在您的图表上,您的生产者将消息放入消费者的队列中。它根本不适用于 RabbitMQ:

    RabbitMQ 中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列。 (来自文档)

    因此,正如您所注意到的,您提到的消息传递中间件库总是创建一个队列和一个与该队列匹配的交换器,然后将它们绑定在一起。通过这样做,它们使您能够将消息“发布”到绑定到消费者队列的特定交换,因此您可以获得 send 功能。

    所以,在底层,它仍然是发布-订阅。

    使用图书馆或自己做事

    设置队列和交换是一项繁琐的工作。在某些情况下,您肯定希望在低级别进行控制并从代码中处理所有这些事情。

    但是,使用消息中间件,是 EasyNetQ、MassTransit 还是 NServiceBus 是非常有价值的。所有这些库都具有全面的拓扑管理功能,使开发人员能够专注于交付价值,而不是处理交换和队列。

    在许多情况下,使用基于类型的路由,就像这些库中的每一个一样,非常有意义。

    在这里,我会快速列出您需要在代码中执行的操作,或者如果您选择不使用消息传递中间件库,请手动执行:

    • 配置拓扑
    • 配置路由
    • 使用重试和重新传递处理异常
    • 控制消息消费者的作用域依赖项
    • 记录和跟踪
    • 调度
    • 长时间运行的进程和分布式事务

    该列表到目前为止并不全面,但它为您提供了想法。如果您准备好自己解决所有这些问题,那就去做吧。

    【讨论】:

    • 完全同意,MassTransit 旨在通过代码配置代理拓扑。外文等是古史。这就是为什么我们现在使用 EF 进行数据库迁移,代码总是正确的。 RabbitMQ 具有代理级策略,可用于在必要时应用控制。
    • 嗨,Alexey 谢谢你的回答。但是,您误解了我的图表。我从来没有提到过Producer会直接将消息放入消费者队列中? message broker (rabbitmq) 不是交换设置。我会更新我的问题。
    • 回应 Chris,我觉得您的方法使事情紧密耦合。这解释正确gigi.nullneuron.net/gigilabs/…
    • 我觉得文章中的No.4更有意义。您不能通过添加交换和队列来不断更新代码(发布者/消费者),然后在每次发生更改时重新部署?在小环境下可能没问题。但是一旦事情变得更大就会很麻烦。
    • @KJSR 对我来说,message broker 是基础架构部分。所以,我宁愿在那里写exchange,因为它现在是逻辑(消费者、队列)和物理(消息代理)实体的混合体。关于“小型”与“大型”系统,我可以向您保证,我和 Chris 都参与了非常大型系统的开发,我很高兴拓扑设置问题是我永远不需要触摸。
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多