什么是RabbitMQ?
RabbitMQ是用erlang语言开发的,基于AMQP(Advanced Message Queuing Protocol,即高级消息队列协议)实现的开源的消息队列中间件,也是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息,将生产者发送的消息以某种规则传递给消费者。
优点和劣势
优点
- 异步:将非实时必要的功能异步化,用以优化系统性能
- 削峰:在大流量的访问下,限制消息队列的大小,一次性只存储一定数量的消息
- 解耦:功能与功能、系统与系统之间解耦,让功能实现更加令灵活
劣势
- 多引入一个中间件,就会让系统更加复杂
- 一致性问题
- 需要保证消息不被重复消费
- 需要保证消息可靠性传输
核心概念
- 生产者(Producer):发送消息的应用。
- 消费者(Consumer):接收消息的应用。
- 队列(Queue):存储消息的缓存。
- 消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
- 连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
- 通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
- 交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
- 绑定(Binding):绑定是队列和交换机的一个关联连接。
- 路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。
消息传递过程
生产者将Message传递给Exchange,再由Exchange将Message传递给Queue,最终Consumer到Queue中取Message
一个生产者向一个交换机发送消息,再由交换机发送给多个队列,每个队列再发消息给消费者
Exchange(交换机)
交换机有四种类型
Direct
直接交换机通过消息上的路由键直接对消息进行分发。
将交换机与队列进行绑定,使用routingkey=abc,此后生产者生成消息时带的routingkey也必须等于abc,才能成功
Fanout
一个扇出交换机会将消息发送到所有和它进行绑定的队列上。(广播模式)
Topic
这个交换机会将路由键和绑定上的模式进行通配符匹配。
交换机与队列绑定的routingkey规则有两种,例如routingkey=abc,abc.*(单个词匹配,*能代表任意的一个词)、abc.#(多个词匹配,#能代表一个或多个词)
Headers
消息头交换机使用消息头的属性进行消息路由。(几乎不用)
业务运用场景
- 发送手机验证码,邮件
- 日志处理
- 消息通讯