RabbitMQ使用入门

一、 四个组件

1522556158179

  • P: producer,消息生产者
  • X: exchange,所有消息先送达到这里,然后他再按Queue的定义规则,将消息分类发送给对应的queue
  • queue: 图中红色部分则为queue.他们申明自己所要消息的规则,然后从exchange获取对应的消息。另一端则将该消息推送给对应的comsumer 。queue可以设置durable,这样可以保证RabbitMQ挂后,不丢数据,但是有一定时间窗口,没落盘的数据,可能还是会丢。
  • C: comsumer,也叫Receiver 从指定的queue中获取消息,并执行一系列动作。Receiver可以开通ACK机制,这样Receiver挂后,依然可以让其它Receiver消费消息

二、两种大的使用方式

2.1 不使用exchange

也不叫不使用exchange。生产的消息,都要先发送到exchange。只是在发送消息的时候,不指定具体的exchange类型。这种方式下,又有两种使用方式

  • 简单的工作队列模式
  • 实现RPC
2.1.1 简单的工作队列模式

1522679173763
生产者生产消息(比如发布任务)直接到指定队列,消费者(worker) 消费(执行任务)。这种方式的好处是,能让任务的处理变的异步。同时当任务过多时,可以开启多个consumer(执行任务),来提高任务执行的并发性

2.1.2实现RPC

如果一个项任务的执行,或者一个请求的调用,不需要拿到返回值,那使用上述的工作模式,就能满足需求。但有时,我们需要拿到一个请求,或者一个方法调用的结果。而这个请求或调用,发生在远端,也就是RPC。要如何利用RabbitMQ实现能拿到结果的RPC调用呢?上述简单工作队列模式,已经成功的将请求送达到远程的任务执行端,为了拿到结果,我们继续利用工作队列这种机制,来次反向通信,拿结果不就OK了吗?
1522679694523
这种方式实现RPC的关键点如下:

  • client发起RPC请求时,要指定接收response的队列名(通过reply_to指定),这样server程序就知道该将结果发送到哪个队列
  • client发起RPC请求时,要指定本次请求的requestId(通过correlation_id指定),一个requestId串联一组request & response。这样client才能从response队列中分辨,某次request对应的response.

2.2 使用exchange

producer将消息发送到exchange
receiver通过queue来读取数据
queue通过跟exchange绑定,从而可以获取exchange中的数据

2.2.1 exchange的几种模式:

fanout:广播模式,将exchange中的消息,发送给所有的queue。
1522676918175
如上图,exchange的消息,会发送到所有队列
direct:路由模式。producer会按route key,将消息发送到exchange。receiver使用自己关注的route key。就可以获取对应route key的数据。
1522676888571
如上图,发送route key为orange的消息会被送到Q1, 而black和green的消息会被送到Q2
topic:同direct类似,区别在于route key的使用上更灵活。producer可以使用以点号作为分割的route key,比如“quick.orange.fox”。这使得receiver在使用route Key上具有了一定灵活性。他可以使用类似正则表达式的方式,去匹配自己感兴趣的消息。

  • '*'号能匹配任意一个单词
  • '#'号能匹配0个或多个单词
    1522676701220
    如上图,route key为“quick.orange.fox”的消息,会被Q1接受

参考资料

https://www.rabbitmq.com/getstarted.html