1、简介
RabbitMQ 是由Erlang开发的 AMQP(Advanved Message Queue)的开源实现;消息投送时使用 “至少一次交付”模式,来保证消息的投送成功率。
AMQP:是一种进程间传递异步消息的网络协议
几个概念说明:
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息的载体,每个消息都会被投到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序.
Consumer:消息消费者,就是接受消息的程序.
Channel:消息通道,在客户端的每个连接里,可建立多个channel.
2、RabbitMq工作模式
2.1 simple 模式
消息生产者将消息放入队列
消息消费者监听,消息队列中有消息就消费,自动从队列中删除(隐患:消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)
2.2 work工作模式(资源的竞争)
消息生产者将消息放入队列
但是会有多个消费者,同时监听同一个队列,来消费消息。C1,C2同时抢队列的消息内容,谁先抢到谁负责处理(隐患:高并发情况下,默认会出现一个消息被多个消费者共同使用情况,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)
2.3 publish/subscribe发布订阅(共享资源)
每个消费者监听自己的队列
x是broker内的交换机,消息生产者将消息发送给交换机,由交换机来转发消息到绑定的队列
2.4 routing路由模式
消息生产者将消息发送给交换机,交换机根据路由匹配对应的消息队列,然后对应的消费者才能消费消息;
2.5 topic 主题模式(路由模式的一种)
* # 都是通配符,* 是匹配单个字符,#匹配字符
2.6 rpc模式
RPC就是远程调用方式,Rabbitmq来实现的异步调用,流程如下:
1、客户端(消费生产者)向 RPC队列发送rpc调用消息,同时监听rpc响应队列
2、服务端监听RPC请求队列,收到消息后执行自身逻辑,得到方法结果并发送到响应队列中
3、客户端(消费生产者)监听响应队列,接收rpc调用结果
队列交互 根据 replyTo(为请求创建匿名互斥队列) 和 correlationId (请求的唯一值,客户端收到响应结果时 校验使用)来实现
3、Exchange 类型
3.1 Direct
直连模式,要求消息与指定的路由键完全匹配
3.2 Topic
模糊匹配,路由键模糊匹配某种规则 ;符号“#”匹配一个或多个词,符号“*”只能匹配一个词。
3.3 Fanout
不处理路由键,队列与交换机绑定即可。广播式发送消息
3.4 Headers
不处理路由键,发送消息中 headers属性进行匹配;队列与交换机绑定是指定一组键值对,消息的headers与键值对匹配,完全匹配则路由到该队列,否则不处理
4、相关作用和使用场景
解耦:服务间调用 由直接调用改为mq中发起调用,如发短信,或者 还款信息更改
异步:一个业务场景完成后,可以同时触发其他场景并行执行;用户下单时,发起三方数据检查或发起审核
削峰:请求量增大时,来平缓处理消息;如果 埋点处理或者 抢购活动处理 ,或者延迟队列处理
5、其他
怎么保证消息不丢失
ack确认,开启持久化
重复消费问题
参考: