消息队列
一、什么是消息队列
消息是指在应用程序之间传输的数据,消息可以非常的简单,比如只包含文本字符串,也可以很复杂,包含嵌入对象。消息队列是应用间通信的方式,消息发送之后可以立即返回,有消息系统来确保消息的可靠传递,消息发布者只需要把消息发送给MQ,不用管谁来取。消费者从MQ中去消息,不用管谁发布的,这样消费者和生产者都不知道对方的存在。
二、为什么要使用消息队列
消息队列是一种应用间的异步协作机制。
以常见的订单系统为例,用户点击下单按钮后的业务逻辑包括:扣减库存,生成相应的单据,发红包,发短信通知,在业务发展的初期这些逻辑可能会放在一起执行,但是随着业务订单量的增长,需要提升系统服务的性能,这个时候就可以把一些不需要立即生成的拆分出来异步执行,比如发红包,发短信这些场景可以用MQ,在下单的主流程(扣减库存,生成相应的单据)完成之后发送一条消息到MQ让主流程快速完结,而有另外的单线程拉取MQ的消息,当发现MQ中有发红包或者发短信的消息,执行相应的业务逻辑。
三、RabbitMQ的特点
RabbitMQ是一个有Erlang语言开发的AMQP的开源实现
AMQP:Advanced Meassage Queue,高级消息队列协议。他是应用层协议的一个开放标准,为面向消息的中间设计,基于此协议的客户端和中间件可以传输消息,并不受产品,开发语言等条件的限制。
RabbitMQ最初起源于金融系统,用于分布式系统中存储转发消息,在易用性,扩展性,高可用等方面表现不俗。
RabbitMQ特点:
-
可靠性(Reliablitiy):
RabbitMQ使用一些机制来保障可靠性,如持久化,传输确认,发布确认 -
灵活的路由:
在消息进入队列之前,通过Exchange来路由消息的,对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现,针对于更复杂的路由功能,可以将多个Exchange绑定在一起,也可以通过插件机制实现自己的Exchange -
消息集群
多个MQ服务器可以做成一个集群,形成一个逻辑Broker -
高可用
队列可以在集群中的机器上进行镜像,使得在部分节点出现问题依然可以使用 -
多种协议
RabbitMQ支持多种协议,比如STOMP,MQTT等等。 -
多语言客户端
RabbitMQ几乎支持所有常用语言,Java、.NET、Ruby等等。 -
管理界面
RabbitMQ提供了易用的用户界面,用户可以监控和管理消息Broker的许多方面。 -
跟踪机制
如果消息发生异常,使用者可以找出发生了什么。 -
插件机制
RabbitMQ提供了很多插件,来从多个方面进行扩展,也可以编写自己的插件。
消息队列的应用以及好处
消息队列的应用场景:
- 比如点菜,服务员点菜很快,但是厨师做饭慢,服务员只需要把菜单给厨师,然后继续去点菜,不需要等厨师做完。菜单就相当于消息,放菜单的地方就是消息队列。
- 比如业务需要发送短信,但是短信发送速度慢,这个时候我们可以用消息队列,把发送短信的相关信息封装成一个消息,放入队列,短信发送模块从队列中获取消息进行处理
消息队列的好处
-
提高系统的响应速度
使用消息队列,生产者只需要把消息扔到消息队列中,就可以立马相应用户,不需要再去等待处理结果 -
保证消息的传递
如果发送消息时,接受者不可用,消息队里会保留消息,直到成功传递 -
解耦
只要消息格式不变,即使接受者的接口,位置或者配置改变,也不会给发送者带来任何改变,消息发送者无需知道谁消费,使得系统设计更清晰