何为RabbitMQ
1. MQ:MessageQueue (消息队列),一种应用程序用”写”与”检索”的方法把数据(消息)以队列形式传递给另一个应用程序的工具。特点:不需要专用连接。MQ以”消费——生产者”模型为结构:一端不停写入消息,另一端则可以读取或者订阅消息。MQ遵循AMQP协议(高级消息队列协议)
2. MQ关键概念:
a) Broker:消息队列服务器实体。
b) Exchange:消息交换机。指定消息按什么规则,路由到哪个队列。
c) Queue:消息队列的载体。每一个消息都会被投入到一个或者多个队列中。
d) Binding:绑定,把Exchange和queue按照路由规则绑定
e) Routing key:路由关键字,Exchange据此进行消息投递。
f) Vhost:虚拟主机,一个Broker有多个vhost,用作不同用户的权限分离。
g) Producer:消息生产者,发送消息的程序
h) Consumer:消息消费者,接收消息的程序
i) Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
3. MQ使用过程:
a) 客户端连接到消息队列服务器,打开一个channel。
b) 客户端声明一个exchange,并设置相关属性。
c) 客户端声明一个queue,并设置相关属性。
d) 客户端使用routingkey,在exchange和queue之间建立好绑定关系。
e) 客户端投递消息到exchange。
exchange接收到消息后,就根据key和已经设置的binding,进行消息路由,将消息投递到一或多个队列里。
Exchange有三种类型:
a) Direct:完全根据key进行投递的叫做Direct交换机。例如:绑定时设置routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的消息才会被投递到消息队列中。
b) Topic:对key进行模拟匹配后进行投递的叫做Topic交换机。符号”#”匹配一个或者多个词,符号”*”匹配正好一个词,例如:”abc.#”匹配”abc.def.ghi”,”abc.*”只配置”abc.def”。
c) Fanout:采用广播模式,一个消息进来时投递到与该交换机绑定的所有队列。
4. RabbitMQ支持消息的持久化,即数据写在磁盘上,数据比较安全。具体包括
a) Exchange持久化,在声明是指定durable=1。
b) Queue持久化,在声明是指定durable=1。
c) 消息持久化,在投递是指定delivery_mode=2(1为非持久化)。
Exchange和Queue都是持久化的,那么它们之间的Binding也是持久化的。若二者之间有一个是持久化一个是非持久化,则不允许建立Binding。