Rabbitmq_example
介绍
Rabbitmq学习路线 课程时长总计:39小时
学习路径
- 入门:https://coding.imooc.com/class/chapter/461.html#Anchor (课程时长:21小时)
- 进阶:https://coding.imooc.com/class/chapter/262.html#Anchor (课程时长:14小时)
- 精通:https://class.imooc.com/sale/javaarchitect (其中rabbit部分 时长:4小时)
Rabbit知识路线
- Rabbit基本使用
- Rabbiit消息可靠性
- Rabbit集群可靠性
- Rabbit最终一致性实现
Rabbit基本使用
- 语言:erlang 。 协议:AMQP
- 组件:
- Broker:接收和分发消息应用
- Virtual Host:虚拟Broker,将多个单元隔离开
- Connection :publisher/consumer 和broker之间的TCP连接
- channel:connection内部建立的逻辑连接。
- Routing key:路由键,用来指示信息的路由转发,相当于快递的地址
- Queue : 消息队列。
- Binding: exchange和 queue之间的虚拟连接
- Exchange:交换机,路由转发
- Direct Exchange :routing key 和 binding key 一致,发送到对应的队列
- Fanout Exchange : 分发到所有的queue中
- Topic Exchange :
- 全匹配,与Direct类似
- Binding key 中的 # :匹配任意个数的word
- Binding key 中的 ×: 匹配任意一个word
Rabbiit消息可靠性
-
发送端确认机制(rabbit是否真的收到消息)
- 单条同步确认
- 多条同步确认
- 异步确认
-
发送端返回机制(消息是否被正确的路由)
- Return Listener 会被调用
- Mandatory 为true, 会处理无法路由的消息;为false,直接丢弃无法路由的消息
-
消费端限流机制
- QoS,前提是不使用自动确认,保证一定数目的消息未确认前,不消费新的消息
- prefetchCount:针对一个消费端最多推送多少未确认消息
- global :true ,针对整个消费端,false,针对当前channel
- prefetchsize:0 (单个消息大小限制,一般为0)
-
消费端确认机制
- 自动ACK,消费端收到消息后,会自动签收消息
- 手动ACK,消费端收到消息后,需要显式签收消息
- 重回队列 :一般不建议
-
消费端过期机制
- 消息TTL:设置了单条消息的过期时间
- 队列TTL:设置了队列中所有消息的过期时间
- TTL应长于服务的平均重启时间
-
死信队列
- 死信消息形成原因:
- 消息被拒绝 并且 requeue = false
- 消息过期
- 队列达到最大长度
- 设置方法:
- Exchange: dlx.exchange
- Queue:dlx.queue
- Routing key:#
- x-dead-letter-exchange =dlx.exchange
- 死信消息形成原因:
-
Spring AMQP的使用
- 异步消息监听容器
- 原始实现:自我实现线程池,回调方法,并注册回调方法
- SimpleMessageListenerContainer
- 设置同时监听多个队列,自动启动,自动配置RabbitMQ
- 设置消费者数量(最大数量,最小数量,批量消费)
- 设置消费确认模式,是否重回队列,异常捕获。
- 设置是否独占
- 设置具体的监听器和消息转换器
- MessageConverter:用来收发消息和自动转换消息
- Jackson2JsonMessageConverter
- 用来转换json格式消息
- 配合ClassMapper 可以直接转换为POJO对象
- 自定义MessageConverter
- 实现MessageConverter接口
- 重写toMessage,fromMessage方法
- 支持动态设置,运行中修改监听器设置
- MessageLisenerAdapter
- 普通模式:实现HandleMessage 方法
- 进阶模式:自定义“队列名-方法名”映射关系
- MessageLisenerAdapter
- SimpleMessageListenerContainer
- Springboot:自动实现可配置的线程池,并自动注册回调方法
- 原始实现:自我实现线程池,回调方法,并注册回调方法
- 原生提供RabbitTemplate,收发消息
- 相比于basicPublish,能实现自动消息转换
- 原生提供RabbitAdmin,队列,交换机声明
- 声明式提供队列,交换机,绑定关系的注册方法
- 将Exchang,Queue,Binding声明为bean
- 将RabbitAdmin 声明为Bean
- Exchang,Queue,Binding 即可自动创建
- 声明式提供队列,交换机,绑定关系的注册方法
- 异步消息监听容器
-
Springboot Rabbit 使用
- Spring boot Config原生支持RabbitMQ
- 隐式建立Connection,Channel
- 使用RabbitListener 使用注解声明,对业务代码无侵入
- @RabbitListener 注解
- @exchange:自动声明Exchange
- @Queue : 自动声明队列
- @QueueBinding: 自动声明绑定关系
- @RabbitListener 注解
- Spring boot Config原生支持RabbitMQ
Rabbiit集群可靠性
- Rabbit容量不足 =>
- 通过Scale-out 扩展规模
- Rabbit数据无副本 =>
- 通过镜像队列,将数据冗余至多个节点。
- Rabbit可用性低 =>
- KeepAlived +HaProxy 作为热备解决方案
Rabbiit最终一致性实现方案
- 基本BASE,以及CAP的理论
- 设计相关
- 发送失败重试
- 消费失败重试
- 死信告警
- 失败消息数据表设计
- 消息ID
- 对应的服务名称
- 消息类型(接收,发送,死信)
- exchange (交换机)
- routing_key( 路由)
- queue(队列)
- sequence(序号)
- payload(消息内容)
- 整体流程
- 发送消息
- 消息持久化
- 发送成功
- 确认回调
- 发送确认
- 删除消息
- 发送确认
- 返回回调
- 重新持久化
- 确认回调
- 发送失败
- 定时任务轮询查询未成功消息
- 超过次数限制
- 通过邮件短信的方式进行报警
- 未超过次数限制
- 记录重发次数
- 重新发送消息
- 记录重发次数
- 超过次数限制
- 定时任务轮询查询未成功消息
- 发送成功
- 消息持久化
- 发送消息
消息中间件作用
- 异步处理
- 系统解耦
- 流量削峰和流控
- 流量控制