RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上。web
学过websocket的来理解rabbitMQ应该是很是简单的了,websocket是基于服务器和页面之间的通讯协议,一次握手,屡次通讯。 而rabbitMQ就像是服务器之间的socket,一个服务器连上MQ监听,而另外一个服务器只要经过MQ发送消息就能被监听服务器所接收。服务器
可是MQ和socket仍是有区别的,socket至关因而页面直接监听服务器。而MQ就是服务器之间的中转站,例如邮箱,一我的投递信件给邮箱,另外一我的去邮箱取,他们中间没有直接的关系,因此耦合度相比socket小了不少。websocket
上图是最简单的MQ关系,生产者-MQ队列-消费者网络
别啥固定式使用场景了,说的透彻一点,他就是服务器之间通讯的,前面博文中提到的Httpclient也能够作到,可是这个相对于其余通讯在中间作了一个中间仓库。并发
好处1:下降了两台服务器之间的耦合,哪怕是一台服务器挂了,另一台服务器也不会报错或者休克,反正他监听的是MQ,只要服务器恢复再从新连上MQ发送消息,监听服务器就能再次接收。socket
好处2:MQ做为一个仓库,自己就提供了很是强大的功能,例如再也不是简单的一对一功能,还能一对多,多对一,本身脑补保险箱场景,只要有特定的密码,谁都能存,谁都能取。也就是说能实现群发消息和以此衍生的功能。 高并发
好处3:如今广泛化的持久化功能,当MQ挂掉能够存储在磁盘等下重启恢复。(须要设置)blog
上图的E就是交换器,经过关键字绑定,若是生产者给的消息中指定类型是ERROR,就给队列1,若是是INFO或者WARN就给队列2。固然也能够一个关键字绑定两个队列。(INFO等字段本身能够定义,也能够用*,#来匹配。*(星号)表示一个单词#(井号)表示零个或者多个单词。 好比ok.yes能够被ok.*匹配到)队列
生产者发送一条消息给交换机——交换机根据关键字匹配到对应的队列——将消息存入队列——消费者从队列中取出消息使用。开发
MQ不能进行批量的消息处理,你看到的传输再多也只是消息被一条一条的存入队列,消费者从队列中一条一条的取出。这kafKa有区别,因此在效率上比不上kafKa,可是MQ主打的是稳定。
每次消费者取出消息时会通知队列,我拿到了,当队列接收到这条消息,就会把消息删除,这是默认的ACK机制。若是在接收消息以后,消费者挂掉,或者任何状况没有返回ack,队列中这条消息将不会删除,能够一直存着,等待其余消费者来取。 注意,可是若是设置不返回ack,在不断的发送消息到队列又不删除,会致使MQ仓库boom~~~~