|
| 1 | +## RabbitMQ 消息队列 |
| 2 | + |
| 3 | +> RabbitMQ是流行的开源消息队列系统,用erlang语言开发,完整的实现了AMPQ(高级消息队列协议) |
| 4 | +
|
| 5 | +## AMQP协议 |
| 6 | + |
| 7 | +> AMQP,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,同样,消息使用者也不用知道发送者的存在。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全 |
| 8 | +
|
| 9 | +## 系统架构 |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +消息队列的使用过程大概如下: |
| 15 | + |
| 16 | +(1)客户端连接到消息队列服务器,打开一个channel。 |
| 17 | +(2)客户端声明一个exchange,并设置相关属性。 |
| 18 | +(3)客户端声明一个queue,并设置相关属性。 |
| 19 | +(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。 |
| 20 | +(5)客户端投递消息到exchange。exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里 |
| 21 | + |
| 22 | +## Rabbitmq中几个概念的解释 |
| 23 | + |
| 24 | +- **生产者 ** |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +生产者就是产生消息并向RabbitMq队列发送消息 |
| 29 | + |
| 30 | +- **消费者** |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +等待RabbitMq消息到来并处理消息 |
| 35 | + |
| 36 | +- **Queue**(队列) |
| 37 | + |
| 38 | + |
| 39 | +Queue(队列), 依存于RabbitMQ内部,消息存在队列中。它指定消息按什么规则,路由到哪个队列 |
| 40 | + |
| 41 | +- **交换器(exchange)** |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中.它指定消息按什么规则,路由到哪个队列 |
| 46 | + |
| 47 | +- **binding 绑定** |
| 48 | + |
| 49 | + |
| 50 | + |
| 51 | +它的作用就是把exchange和queue按照路由规则绑定起来 |
| 52 | + |
| 53 | +- routing key 路由关键字 |
| 54 | + |
| 55 | +exchange根据这个关键字将消息投放到对应的队列中去。 |
| 56 | + |
| 57 | +- **Binding key** |
| 58 | + |
| 59 | +在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key;生产者将消息发送给Exchange时,一般会指定一个routing key;当binding key与routing key相匹配时,消息将会被路由到对应的Queue中 |
| 60 | + |
| 61 | +- **虚拟主机** |
| 62 | + |
| 63 | +一个虚拟主机持有一组交换机、队列和绑定。隔离不同的队列和用户的权限管理。 |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +- **channel 消息通道** |
| 68 | + |
| 69 | +在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务 |
| 70 | + |
| 71 | +-Exchange type 交换模式 |
| 72 | + |
| 73 | +RabbitMQ提供了四种Exchange模式:fanout,direct,topic,header |
| 74 | + |
| 75 | +一、 **Fanout** |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | +它采取广播模式,消息进来时,将会被投递到与改交换机绑定的所有队列中。 |
| 80 | +所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上.Fanout Exchange 不需要处理RouteKey 。只需要简单的将队列绑定到exchange |
| 81 | + |
| 82 | +二、**Direct ** |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | +Direct模式,消息传递时,RouteKey必须完全匹配,才会被队列接收,否则该消息会被抛弃。 |
| 87 | + |
| 88 | +三. **Topic ** |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +Exchange 将RouteKey 和某Topic 进行模糊匹配。此时队列需要绑定一个Topic。可以使用通配符进行模糊匹配,符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“log.#”能够匹配到“log.info.oa”,但是“log.*” 只会匹配到“log.error |
0 commit comments