消息队列常见问题脑图
2021-05-15 17:35:35 0 举报
AI智能生成
消息队列常见问题脑图
作者其他创作
大纲/内容
优点
削峰填谷
异步处理,简化业务流程,提升性能,(发放积分,优惠券等不重要的流程)
解耦,譬如数据团队分析数据,数据团队系统故障不影响秒杀系统,提升系统整体鲁棒性
降低消息延迟
监控消息延迟
消息队列自带工具
kafka consumer-group.sh工具 bin目录下
JMX jconsole 连接comsumer 进程
生成监控消息
定时 循环写入消息队列,业务正常消息,判断时间差阈值 程序告警
降低消息延迟方案
消费端层面
优化消费代码性能
增加消费者或者topic对应的partition数量
线程池异步并行处理 ps: 避免消费线程空转的问题,无消息,CPU会被跑满,解决:1、拉不到消息等一段时间再拉,2、按照一定时间步长递增拉取消息;
消息队列层面
消息中间件消息存储优化
存储介质 本地磁盘 读性能 远大于 数据库;因为有Page Cache顺序读
零拷贝
读取消息实际拷贝四次:1、磁盘->内核缓冲区 2、内核缓冲区->用户缓冲区 3、用户缓冲区 ->socket缓冲区 4、socket缓冲区->网卡缓冲区
操作系统提供Send File函数减少拷贝次数,支持 内核缓冲区 -> socket缓冲区;减少一次拷贝过程,提升性能 ;
Linux 2.1时候,已经支持磁盘 -> socket缓冲区,实现真正的零拷贝
java nio的FileChannel类提供 transferto 方法提供SendFile功能;
操作系统提供Send File函数减少拷贝次数,支持 内核缓冲区 -> socket缓冲区;减少一次拷贝过程,提升性能 ;
Linux 2.1时候,已经支持磁盘 -> socket缓冲区,实现真正的零拷贝
java nio的FileChannel类提供 transferto 方法提供SendFile功能;
消息投递,消息只消费一次
消息丢失
生成者写入消息队列过程
网络抖动
解决: 失败消息重发,重试2~3次
消息在队列中存储场景
kafka 消息存储在Page Cache中,异步刷盘前,掉电,消息丢失
解决:生产者设置选项,acks =all ;
集群方式部署kafka,多副本备份数据,保证消息尽量不丢失,Leader 会同步数据给foller,leader发生掉电,kafka会从foller消费消息;减少消息丢失可能;但:leader 同步到foller过程发生掉电,还是会丢失消息,解决:leader和 ISR(in-sync-replicas)都接收成功,才认为消息发送成功
集群方式部署kafka,多副本备份数据,保证消息尽量不丢失,Leader 会同步数据给foller,leader发生掉电,kafka会从foller消费消息;减少消息丢失可能;但:leader 同步到foller过程发生掉电,还是会丢失消息,解决:leader和 ISR(in-sync-replicas)都接收成功,才认为消息发送成功
消息完全不能丢的场景:集群方式解决消息丢失问题,配置所有的ISR foller 都接收消息成功,才返回成功,即acks =all
对消息丢失有一定容忍度的场景:无需部署集群,配置只发送给一个foller就可以返回成功
消息被消费的过程
消息接收
网络抖动
处理消息
消息业务处理执行异常后,更新了消息进度
更新消息进度
保证消息正常接收和正常处理后,再执行更新消息进度
消息生产、消费幂等保证
生产端
kafka 消息队列服务端会存储<生产者ID,最后一条消息id>,根据消息id做幂等判断,不严格幂等
消费端
通用方式,消息唯一id,持久化,消费时候判断唯一id的幂等校验,写消息id和业务处理保证再同一个事务操作;避免消息处理成功,写消息id失败,导致重复消费的问题;
看业务场景是否需要严格要求,也可以简单处理,不考虑事务
看业务场景是否需要严格要求,也可以简单处理,不考虑事务
业务层:乐观锁,消息内容带版本号,更新数据库时候带版本号;
收藏
0 条评论
下一页