简介
rabbitMq采用Erlang语言实现的消息队列。
特点
可靠性:使用一些机制保证消息可靠性,如持久化,传输确认。
灵活路由:在消息进入队列之前通过交换器来路由信息。RabbitMq提供内置交换机。
扩展性:多个RabbitMq节点可以组成一个集群,也可以根据实际业务情况动态的扩展集群中的节点,
高可用:队列可以在集群中的机器上设置镜像使得再部分节点出现问题下任然可用。
支持多种协议:他除了原生的AMQP协议还支持STOMP,MQTT等多种消息中间件的协议,
多语言客户端:它支持常用的几个语言。例如java,python等。
易用的管理页面:它提供了一个易用的用户界面,使得用户可以监控和管理消息,集群中的节点等。
插件机制:他提供了许多插件,以实现多方面进行扩展。
核心概念
RabbitMQ整体上是一个生产者消费者模型。主要接受存储和转发消息。就像一个包裹寄到邮局,邮局负责暂存,邮寄送到目标手上。
消息
消息一般分为消息头,消息体。消息头内容由可选数据生成(路由键,相对其他消息的优先权)。消息体则是不透明的。
交换机
在rabbitmq中消息不是直接被投递到Queue(消息队列)中。中间还必须经过Exchange交换机这一层。交换机会负责把消息放在对应的Queue。
交换机接受生产者的消息,将消息路由到服务器的队列中。如果路由不到。返回给提供者。或者或者直接丢弃。
交换机有4种类型
direct 默认的。
fanout
topic
headers
交换机示意图:
生产者将消息发给交换机的时候一般会指定RountingKey路由键。用来指定路由规则,这个路由键需要与交换机类型和绑定健联合使用才能最终生效。
rabbitMQ中通过Binding(绑定)。将交换机与消息队列关联起来。再绑定的时候一般会指定一个绑定键。这样rabbitMQ就知道如何正确的将消息路由到队列中。
生产者将消息发送给交换机是。需要以额路由键,当路由键和路由键匹配时。消息就会被路由进对应的队列。在绑定多个队到同一个交换器的时候。这些绑定允许使用相同的路由键。
Queue消息队列
消息队列保存着消息知道发送给消费者。一个消息可以投到一个或多个队列中等待消费者连接这个队列将其取走。
rabbitMq中消息只能存在队列中。这一点和kafka消息中间件不同。kafka见消息存储在topic主题这个层面逻辑。而相应的队列逻辑只是实际文件的位移标识。
多个消费者可以订阅同一个队列。这是队列中的消息就会被分摊,即轮询处理。不是发送给所有的消费者可以避免被重复消费
rabbitMq不支持队列层面的广播消费。
Broker消息中间件的服务节点
broker可以看作mq服务的实例。看作时一台mq服务器。
交换机类型
fanout
路由规则:直接把所有发送到这个交换机的消息发送到所有绑定的队列中不做任何操作。减缓及中最快的。这个类型常用来广播消息。
direct
这个交换机会将消息路由到路由键RountKey和绑定键Bindingkey完全匹配的队列中去
如上图:如果发送的信息,信息头中的路由键为warning,那么消息对发送到1号和2号队列。
topic
使用了带“.”的字符串。它相当于是一个可以模糊查询的direct。



