RabbitMQ简介
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用,在易用性、扩展性、高可用性等方面表现不俗。
AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。
RabbitMQ消息队列工作流程
首先生产者(Producer)将消息携带着绑定键值(routing key)发给交换机(Exchange),交换机根据一定的路由规则将收到的消息分发给与该交换机绑定的队列中,交换机、队列都可以有多个,消费者(Consumer)监听队列就可以接收来自该队列的消息。
交换机(Exchange)
RabbitMQ中交换机有四种类型,不同的交换机类型有不同的路由规则,分别为direct、fanout、headers、topic。
直连交换机(Directed)
直连型交换机(direct exchange)是根据消息携带的路由键将消息投递给对应绑定键的队列。也就是说首先队列绑定到交换机上赋予该绑定一个(binding key),当生产者发送消息携带路由键(rounting key)到交换机时,如果这两个key一致,交换机就会将消息路由给该队列。直连交换机的队列通常是循环分发任务给多个消费者可以称作轮询。举一个例子假如有6条数据需要处理,有5个消费者,生产者-多消费者模型,队列将消息发给消费者,这里并不是5个消费者都全部接收这6条数据,而是6条数据由5个消费者共同处理,循环一轮后,第六条数据又选择一个消费者去处理。这样也叫做负载均衡,不过是消费者之间的负载均衡。
默认交换机(Default)
默认交换机实质上就是一个没有名字(空字符串)的直连交换机,当创建一个队列时,会自动绑定默认的交换机,并且routing-key和queue的name一样。
通配符交换机(Topic)
交换机会把消息发送到一个或者多个满足通配符规则的routing-key的queue。其中 * 匹配一个word,# 匹配多个word和路径,路径之间通过 . 隔开。如满足a.*.c的routing-key有a.hello.c;满足#.hello的routing-key有a.b.c.helo。
扇形交换机(Fanout)
该交换机会把消息发送到所有binding到该交换机上的queue。这种是publisher/subcribe模式。用来做广播最好。交换机会无视掉绑定的路由键。
队列(Queue)
RabbitMQ中队列就是用来存储消息的,生产者将消息发给交换机,交换机本身是不存储消息的,交换机通过一定的路由规则将消息发送给队列,消费者订阅队列获取消息。
路由规则
生产者将消息发给交换机的时候会指定一个routing key,指定消息的路由规则,队列和交换机绑定后也会有一个binding key,正是因为有了这个routing key,才决定了这个消息最终发送到到哪个队列。