异步通信rabbitmq

1、消息队列

    消息队列是一种应用间通信的方式。应用A只关心往队列中塞入消息,应用B只关心从队列中中读取消息。是一种解耦合的常用手段。

    消息队列是一种异步通信模式。降低接口响应时间,提高服务性能。最常见的使用场景就是下单、减库存。如果是同步模式,接口响应时间=下单+库存。用了消息队列之后,接口响应时间=下单,基本上是提高了一倍的性能。

2、 AMQP

RabbitMQ是一个由elrang开发AMQP的开源实现

AMQP:Advanced Message Queue Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,而无需关注语言限制,具有很好的跨平台性。

3、RabbitMQ

特点:

  • 可靠性。使用了持久化、传输确认、发送确认机制来保证消息的可靠性
  • 灵活的路由。提供了多种类型的exchange,用户可以根据自己的需要选择使用
  • 跨平台行。无视客户端语言的限制
  • 高可用。提供了镜像队列,来保证消息的有效性
  • 集群模式
  • 多种协议。比如STOMP、MQTT等
  • ...

如下是两张RabbitMQ的简易架构图



3.1、基本概念

message:MQ通讯消息报文

publisher:消息生产者,负责产生消息的客户端程序

broker:简单来说就是消息队列服务器实体

exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

Virtual Host:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

consumer:消息消费者,负责处理消息的客户端程序

3.2、消息队列的使用过程如下:

(1)客户端连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。

(5)客户端投递消息到exchange。

exchange收到消息后,就根据消息的routingKey路由到某个queue。

3.3、exchange类型

MQ的消息是发送到exchange,由exchange根据routingKey进行路由转发。不同类型的exchange,拥有不同的转发策略。

3.3.1、direct

只有在key完全匹配的时候,才会进行转发。比如:只有在key=abc时,才会路由到queue1;只有在key=def时,才会路由到queue2


3.3.2、fanout

如其名广播模式。该类型是不关注key的,只要有queue被binding在该exchange上,则该queue就能接受发送到该exchange上的消息

3.3.3、topic

类似一种正则匹配模式。符号”#”匹配一个或多个词,符号”*”匹配正好一个词。比如:”abc.#”匹配”abc.def.ghi”,”def.*”只匹配”def.abc”。在

key=abc.def.ghi时,消息路由到queue1;在key=def.abc时,消息路由到queue2。


3.4、消息的持久化

    RabbitMQ支持持久化操作,也就是把数据写在磁盘中,预防数据丢失。 如果不做持久化操作,在服务重启后,之前未来得及处理的数据就丢失了。

    消息队列持久化分为三个部分:

  • exchange持久化,声明时设置durable=true
  • queue持久化,声明时设置durable=true
  • message持久化,发送消息时指定delivery_model = 2

如果exchange和queue都是持久化的,那么它们之前的binding也是持久化的。如果一个是持久化,一个是非持久化,这种状态是不允许进行binding操作的。

后续,敬请期待!!!