1、为什么要使用消息中间件
比如客户端发送一个请求给订单(order)系统,订单系统发送请求给库存系统,需要减库存。
传统的实现方案:用户下单,订单处理完之后更改库存,库存更改完之后返回处理结果
使用线程的解决方案:用户下单,订单系统开辟线程去调用库存,同时返回下订单的结果
最终解决方案:只用一个独立的系统来处理他们的消息
2、RabbitMQ和AMQP介绍
MQ:顾名思义message Queue消息队列,队列的特点是先进先出,只是消息对列里面
存放的内容是消息而已
RabbitMQ是一个基于AMQP协议的企业级消息中间件,服务端语言由Erlang语言(面向
并发编程)编写,对高并发有着天然的优势,客户端支持非常多的语言。
AMQP:即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准
高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此
协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语
言等条件的限制。Erlang中的实现有RabbitMQ等。
AMQP协议中的基本概念:
1)Broker: 接收和分发消息的应用,我们在介绍消息中间件的时候所说的消息系统就是Message Broker
2)Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的
分组中,类似于网络中 的namespace概念。当多个不同的用户使用同一个RabbitMQ
server提供的服务时,可以划分出多个vhost, 每个用户在自己的vhost创建exchange/
queue等。
3)Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在
client端进行,Broker 不会断开连接,除非出现网络故障或broker服务出现问题
4)Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立
TCP Connection的开 销将是巨大的,效率也较低。Channel是在connection内部建立的
逻辑连接,如果应用程序支持多线程,通 常每个thread创建单独的channel进行通讯,
AMQP method包含了channel id帮助客户端和message broker 识别channel,所以
channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立
TCP connection的开销。
5)Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing
key,分发消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-
subscribe) and fanout (multicast)。
6)Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
7)Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到 exchange中的查询表中,用于message的分发依据。