引入 MQ
消息中间件最直接的目的:系统解耦以及流量控制(削峰填谷)
-
系统解耦: 上下游系统之间的通信相互依赖,利用
MQ
消息队列可以隔离上下游环境变化带来的不稳定因素。 -
流量控制: 超高并发场景中,引入
MQ
可以实现流量 “削峰填谷” 的作用以及服务异步处理,不至于打崩服务。
引入 MQ
同样带来其他问题:数据一致性。
在分布式系统中,如果两个节点之间存在数据同步,就会带来数据一致性的问题。消息生产端发送消息到
MQ
再到消息消费端需要保证消息不丢失。
所以在使用 MQ
消息队列时,需要考虑这 3 个问题:
-
如何知道有消息丢失?
-
哪些环节可能丢消息?
-
如何确保消息不丢失?
1、如何知道有消息丢失?
如何感知消息是否丢失了?可总结如下:
-
他人反馈: 运营、
PM
反馈消息丢失。 -
监控报警: 监控指定指标,即时报警人工调整。
Kafka
集群异常、Broker
宕机、Broker
磁盘挂载问题、消费者异常导致消息积压等都会给用户直接感觉是消息丢失了。
案例:舆情分析中数据采集同步
-
PM
可自己下发采集调度指令,去采集特定数据。 -
PM
可通过ES
近实时查询对应数据,若没相应数据可再次下发指令。
当感知消息丢失了,那就需要一种机制来检查消息是否丢失。
检索消息
运维工具有:
-
查看
Kafka
消费位置:
> 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://gitee.com/zhijiantianya/ruoyi-vue-pro>
> * 视频教程:<https://doc.iocoder.cn/video/>
# 查看某个topic的message数量
$ ./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test_topic
> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://gitee.com/zhijiantianya/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>
# 查看consumer Group列表
$ ./kafka-consumer-groups.sh --list --bootstrap-server 192.168.88.108:9092
# 查看 offset 消费情况
$ ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-1152 --de