我有点困惑 . 我正在尝试实现主题交换,但我不确定需要什么 .
我想要几个路由键和1个主题交换(默认的amq.topic) . 我的钥匙就像:
-
customer.appA.created
-
customer.appB.created
-
customer . * . created
我希望我的队列是持久的,但是我需要1个'customer'队列或2个队列用于appA和appB吗?我让我的出版商想通了; connect, exchange declare, basic publish .
但我说'm struggling with the consumers. Let's我想打开3个控制台,每个控制台对应一个前面提到的路由键 .
我目前的消费者有: connect, exchange declare, queue bind, basic consume . 它们连接到持久的'customer'队列 . 但是,我的消息正在循环到每个控制台/消费者,而不是使用路由键 .
所以我的问题;
-
对于典型的主题交换设置;你需要多少个队列?
-
我的消费者可以通过交换绑定逃脱,还是必须包含队列交互?
-
单个消息是否可能出现在2个主题交换的消费者中(或者您是否需要扇出)?
2 回答
首先要做的事情是:交易所不向消费者提供 . 它向Queue发送消息以匹配路由kyes .
如果您有多个消费者,那么每个消费者都需要一个队列 .
您需要将使用者绑定到队列,如果队列不存在则创建并绑定 .
是的,仅当消费者拥有自己的(具有相同路由密钥的单独队列绑定)时 . 否则它将是循环方式 .
所以最好的方法是拥有消费者自己的队列和所需的路由密钥...... !!!
这取决于您的应用需求 . 您可以从一个队列开始实现简单的FIFO堆栈,然后添加更多队列以获取更多粒度消息 .
AMQP交换的想法是获取已发布的消息并将它们放到一个或多个队列(甚至是其他交换机或在某些条件下完全丢弃) . 消费者只能使用队列,而发布者只能使用交换 .
在将消息路由到与路由密钥相同的队列名称时,可能会对Default Exchange产生一些误解,并且有时会将其解释为发布到队列,这是不正确的 .
我猜你在谈论将一条消息复制到多个队列(虽然有一些错误的情况,当你真的可能有多个消费者正在处理单个消息时) .
如果是这样 - 当然 . 您可以为队列创建多个绑定以获取不同的消息 . 这是一个小例子:
让您使用三个不同的路由键
customer.appA.created
,customer.appB.created
和`customer.appC.created将三条消息发布到主题交换 .您可以通过使用精确路由密钥绑定队列来创建单独的队列来收集特定消息 -
customer.appA.created
,customer.appB.created
等,或者如您所述,使用通配符路由密钥customer.*.created
绑定队列 .要仅为appA和appB收集消息,您可以创建具有两个绑定
customer.appA.created
和customer.appB.created
的队列,因此您将在一个队列中输入两个消息 .