【问题标题】:RabbitMQ AMQP queue designRabbitMQ AMQP 队列设计
【发布时间】:2012-09-23 02:30:35
【问题描述】:

以下是队列的理想设计:

  • P 生产者。插入数据的应用程序
  • X 交换。
  • C1-C3 消费者。从队列中读取的应用程序

队列详情:

  • A.就像队列日志一样,如果没有客户端绑定,则消息将被丢弃。
  • 乙。这是一个工作队列。如果有条件匹配,它会做一些事情。
  • C.也是一个工作队列。它将转换数据

A 是可选的,但 B.C. 将一直在队列中,直到某个客户端进程连接它。

问题是确定我应该使用哪种类型的交换。 它是扇出、直接还是主题?因为如果没有客户端连接,我希望 A 队列丢弃消息,但 B & C 应该始终保留消息。

生产者应该向交易所写入一次,还是使用不同的路由键或主题多次写入?

【问题讨论】:

    标签: queue rabbitmq message-queue amqp


    【解决方案1】:

    回答问题:我是否希望所有队列都接收所有消息?

    如果答案是肯定的,那么您应该使用扇出。如果答案是否定的,那么您应该使用直接或主题。 direct 或 topic 的全部意义在于队列本身只会接收基于路由键与绑定键匹配的消息。

    队列 A 应该由消费者 C1 实例化,并设置为自动删除和非持久性。这样当 C1 断开连接时,队列将被删除,消息将被丢弃。

    相反,队列 B 和 C 应该在交换时被实例化,无论是单独的,还是由生产者进行的。应该设置为非自动删除并且可能是持久的。如果您使用的是持久队列,您可能希望拥有持久消息(如果队列 A 不存在,请不要担心,即使持久消息在这里也不会成为问题)。这样,一旦生产者开始发送消息,队列就会开始排队,不会丢失任何消息,即使消费者尚未运行。

    是否使用直接或主题交流是个人喜好。我知道直接交换应该更快,而主题交换允许路由/绑定键有很大的灵活性。

    我不是 100% 你最后一个问题的意思。每条消息只能写入一次交换。如果使用扇出,交换将负责正确地将消息路由到队列,就是这样。如果您使用的是直接交换或主题交换,那么它可以通过绑定键来确保每个队列都接收到正确的消息。您不需要发送带有多个路由键的消息,如果您希望做类似的事情,那么您的理解就会倒退。但是你可以从一个队列中拥有多个绑定键到交换。

    简单的例子。 X 是直接交换。 B有黑色装订键,C有1个黑色装订键和1个白色装订键。 P 发送带有黑色或白色路由键的消息。如果是黑色则 B 和 C 都会收到消息,如果是白色则只有 C 会收到。

    【讨论】:

    • 生产者创建队列可以吗?它不会引入耦合吗?
    • 是否可以让多个消费者连接到 B 和 C 并且只处理每条消息一次? (我的意思是,如果 B 上有 2 个消费者,则消息只由其中一个处理)
    • 从技术上讲,消费者创建队列没有问题。但它是一个特定的用例,我上面描述的那个。这取决于,如果您希望队列从一开始就处于活动状态,您可以手动创建一次。鉴于从生产者那里创建它同样容易。我认为这里没有什么大问题。
    • 如果多个消费者连接到同一个队列,那么该队列中的消息将只被其中一个消费者消费。它以循环方式完成。因此,您可以并行处理消息。该队列仅包含消息的一份副本,因此它只能由一个专门连接到该队列的消费者处理一次。阅读 RMQ 文档中的工作队列。
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2013-03-07
    • 2021-06-14
    • 2011-03-26
    相关资源
    最近更新 更多