为什么要用mq
- 解藕
- 异步化提升效率
- 流量削峰
为什么用rabbitMq
- erlang语言天生优势,高并发高可用
- 拥有持久化的机制
- 社区活跃度高
- 易用的可视化后台
使用场景
- 服务间异步通信:商品修改通知其他服务
- 流量削峰:登陆后续流程通过mq实现
mq的缺点
- 引入系统增多,可用性降低
- 系统复杂度提升
引入mq需要保证消息不能重复消费,保证消息不能丢失,有些场合还要保证消息的顺序执行 - 一致性问题
如果mq消费时数据库写库失败等场景如何保证事务最终一致性
基础组件
broker
broker即rabbit服务
producer
发送消息的应用
exchange
producer 并不会直接将消息发送到 queue 上,而是将消息发送给 exchange,由 exchange 按照一定规则转发给指定queue
queue
queue 用来存储 producer 发送的消息
consumer
consumer是接收并处理消息的应用
connection
connection是消费者、生产者和broker间建立的tcp连接
channel
channel即信道,一个connection包含多个channel,因为tcp连接建立和销毁开销比较大,所以每个线程创建一个channel负责和broker通信,channel之间是完全隔离的
virual host
virtual host是一个虚拟主机的概念,一个broker中可以有多个virtual host,每个virtual host都有自己的exchange和queue,同一个virtual host中的exchange和queue不能重名,不同的virtual host之间不作限制
消息发送过程
单queue比较简单略过
多queue的情况下,每个queue会通过binding key与某个exchage绑定,生产者指定消息的routing key,
exchage通过routing key,bingding key和路由规则决定把消息推送给哪个queue
每一类exchange有自己的路由规则
- Fanout Exchange
忽略key对比,直接把消息推送到下游所有queue - Direct Exchange(default Exchange)
当rouing key和binding key完全相同时才推送到该queue - Topic Exchange
routing key和bingding key按照规则匹配成功的才推送 - Headers Exchange
queue通过参数绑定exchange,生产者可以再消息的Headers中添加参数来推送到对应的queue中,该模式用的比较少
routing key命名规则: 以.分割的数字或者字母
key匹配规则
- * 匹配一个数字或者字母
- # 匹配0~N个数字或者字母