RabbitMQ基础知识总结
关键词
- 异步
- 削峰
- 解耦
简介
RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件
名词介绍
- Producer:消息生产者。投递消息
- Consumer:消息消费者。接收消息
- Exchange:消息交换机。根据策略和路由分发消息
- Queue:消息队列载体。消息被分发到一个或多个队列
- Binding: 绑定交换机和消息队列
- Binding Key:绑定交换机和消息队列的Key
- Routing Key:生产者发送消息给交换机时指定,必须与Binding Key搭配使用
- Broker:消息队列服务器实体
- vhost:虚拟主机。一个Broker里可以开多个vhost,用作不同用户权限分离
消息 (Message)
消息一般由消息头和消息体组成。消息体是不透明的。消息头由一系列的可选属性组成,包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)
生产者和消费者 (Producer & Consumer)
生产者把消息投递给交换机,交换机分发给对应的队列,消费者监听队列接收消息
消息队列 (Queue)
RabbitMQ的消息只能存储在队列中
当消息分发到队列后,消息将会一直存储在队列直到被消费
消息交换机 (Exchange)
消息必须通过交换机分发到对应的队列中
direct和topic模式下,队列和交换机通过Binding Key绑定,生产者通过Routing Key发送给匹配Binding Key的队列
交换机有4种类型,不同类型对应不同路由策略:direct,fanout, topic, headers
direct (默认)
路由到Routing Key和Binding Key完全匹配的队列
fanout
路由到交换器绑定的所有队列
topic
topic模式较灵活,也是路由到Routing Key和Binding Key匹配的队列,但这里的匹配规则比较灵活
- Routing Key和Binding Key都是被“.”分割的单词组
- Binding Key存在特殊字符“*”匹配任意一个单词
- Binding Key存在特殊字符“#”匹配任意个单词(可以为零)
- 例如: com.cn.c可以匹配com.cn.*或com.#
headers
headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,RabbitMQ会获取到该消息的 headers(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。