Ruby使用RabbitMQ(进阶)
看本篇文章之前, 务必先看之前的文章Ruby使用RabbitMQ(基础)里面说到了一些基础内容.
下面, 来讲一下更加复杂且常用的方法和注意事项;
概念
在rabbitmq 中生产者会把消息发送给 exchange
,
然后 exchange
再发送给queue, queue再发送给消费者;
exchange没有queue
如果 exchange 没有 queue,那么消息会被丢弃;
当然, 一般情况下, 都会绑定一个queue, 让它持久化.
这样, 消息就不会丢失了
exchange 新加入一个 queue-01 , 这个 queue-01 不会收到之前发送过的消息;
一个exchange多个queue
通过上面的图, 我们可以知道消息都是先经由exchange, 才分发给各个queue的;
那么, 到底要怎么分发消息呢?
这就涉及到 exchange
的类型, 它有四种类型;
- direct (默认类型)
- topic
- headers
- fanout
具体的分析, 在下面的 Exchanges 一节.
一个queue多个消费者
其中要注意的是, 消费者在同一个queue中属于竞争关系;
如果queue中有6条消息, 3个消费者;
那么, 3个消费者会每个人收到2条消息;
Exchanges
在上文, 我们提到了Exchange.
它会根据不同的类型来分发消息;
注意: exchange 并不会保存消息, queue 保存消息
类型
- fanout
- direct (默认类型)
- topic
- headers
fanout
fanout
是最简单的exchange类型;
它把接受到的消息, 转发给全部的queue;
# 生产者
exchange = channel.fanout('fanout-test-02', durable: true)
30.times do |n|
exchange.publish("fanout-message: #{
n}")
end
# 消费者
exchange = channel.fanout('fanout-test-02', durable