消息组件
2022-06-17 15:51:03 16 举报
AI智能生成
如何封装消息组件大纲
作者其他创作
大纲/内容
解决消息重发的问题
为什么消息重发
Producer在发送消息时比如遇到网络问题时,发送后因超时得不到服务器的ack,从而进行重发
RocketMQ对于消费时一直无法消费的消息,超过一定重试次数后,会将消息写入私信队列,避免分区被卡住。
如何解决
利用redis给消息分配一个全局id,
建立一个消息表,consumer消费之前,拿到消息做insert操作,用消息id做唯一主键,重复消费会导致主键冲突,携程的QMQ实现方式
消费端处理消息的业务逻辑保持幂等性
MQTT协议给出服务质量标准
mq
Kafka At least once
RocketMQ At least once
RabbitMQ At least once
RocketMQ At least once
RabbitMQ At least once
Exactly once:恰好一次。消息在传递时,只会被送达一次,不允许丢失也不允许重复,这个是最高的等级。
At least once: 至少一次。消息在传递时,至少会被送达一次。也就是说,不允许丢消息,但是允许有少量重复消息出现。
At most once: 至多一次。消息在传递时,最多会被送达一次。换一个说法就是,没什么消息可靠性保证,允许丢消息。一般都是一些对消息可靠性要求不太高的监控场景使用,比如每分钟上报一次机房温度数据,可以接受数据少量丢失。
组件能做什么
消息队列本身不能处理和避免重复消费的情况
强制增加约束会导致整体组件特别臃肿
消息顺序
参考:RocketMQ通过轮询所有队列的方式来确定消息被发送到哪一个队列(负载均衡策略),在获取到路由信息以后,会根据MessageQueueSelector实现的算法来选择一个队列,同一个OrderId获取到的肯定是同一个队列。
组件能做什么
1、约定一个新的路由规则和约定一个参数,作为一个ID,消费,生产消息时方法均以代理对象的方式注册到容器,然后增强方法,走自己自定义的路由去选择队列来,来保证顺序(总结一句话,统一放入一个queue中,队列本身就是有顺序的)
2、增加消息版本号的概念,根据版本号和消息ID,可以确定顺序,但消费非首条消息时需要消费方重试
消息组件解决最终一致性的问题
建议用seata ,因为万一消息消息一直失败,需要自己从死信队列中人工重试
消息监听
埋点
监控
消息重试
rocketMq若配置了重试规则,则引用,若非rocketMq,则默认建立一个重试队列,模仿rocketMq重试
消息区分
消息发送
Producer轮询某topic下的所有队列的方式来实现发送方的负载均衡,基本都以roundbin的方式
消息消费
怎么去兼容,怎么去区分
0 条评论
下一页