消息队列介绍
学前小思考:什么场景下会用到消息队列?
举例:修改商品
假如我们需要修改商品的价格,而微服务中有修改商品微服务和查询商品微服务,并且有各自独立的数据库。因此,修改商品价格步骤如下:
- 同步调用方式(耗时80ms)
其中序号为修改商品价格的步骤:(5ms、30ms为假设的耗费时间)
①为发起修改请求;
②为服务端响应修改;
③修改成功返回响应;
④修改了A表,要同步修改B表,因此通知查询微服务修改B表;
⑤查询微服务修改B表;
⑥修改成功返回响应;
⑦返回修改微服务的响应;
⑧返回浏览器,响应用户,修改成功;
- 异步调用方式(耗时45ms)
同步调用:A服务调用B服务,需要等待B服务执行完毕的返回值,A服务才可以继续往下执行;
-
同步调用可以通过REST和RCP完成
-
REST:ribbon、feign
-
RCP:dubbo
-
异步调用:A服务调用B服务,无需等待B服务的执行结果,也就是说在B服务执行的同时A服务可以继续往下执行;
- 通过消息队列实现调用
一、消息队列
如上提到的异步调用,我们只需把调用查询微服务的消息存在消息队列中,不管查询微服务是正常状态或宕机状态,都可实现调用。
消息队列概念:MQ全称为Message Queue,消息队列是一种应用程序对应用程序的通信方式。应用程序通过读写出入队列的消息来进行通信,而不是通过直接调用批次来通信。
常见消息队列中间件:
RabbitMQ、ActiveMQ、RocketMQ、Kafka
- RabbitMQ 稳定可靠,数据一致,支持多协议,有消息确认,基于erlang语言;
- Kafka 高吞吐,高性能,快速持久化,无消息确认,无消息遗漏,可能会有重复消息,依赖于zookeeper,成本高;
- ActiveMQ 不够灵活轻巧,对队列较多情况支持不好;
- RocketMQ 性能好,高吞吐,高可用性,支持大规模分布式,协议支持单一(阿里的产品);
二、RabbitMQ基本介绍
- RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。
- AMQP,即Advanced Message Queuing Protocol, 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。
- 主要特性:
- 保证可靠性:使用一些机制来保证可靠性,如持久化、传输确认、发布确认
- 灵活的路由功能
- 可伸缩性:支持消息集群,多台RabbitMQ服务器可以组成一个集群
- 高可用性:RabbitMQ集群中的某个节点出现问题时队列任然可用
- 支持多种协议
- 支持多语言客户端
- 提供良好的管理界面
- 提供跟踪机制:如果消息出现异常,可以通过跟踪机制分析异常原因
- 提供插件机制:可通过插件进行多方面扩展