一.如何处理重复消息
首先分析产生原因:
假设我们消费者拿到了消息并且消费了业务逻辑也走完了,但是消费者挂了没有更新 offset,另外一个消费者顶上来了发现offset没有更新,消息又重写发了一遍消费者把业务逻辑又执行了一遍。
如何解决
1.幂等 从业务上来规避
幂等性:多次请求得到的结果是一致的
利用唯一ID去重。记录关键的key 比如订单ID加入又重复的消息过来先进行判断这个ID是不是已经被处理过了
2.数据库的版本号 乐观锁
将版本号作为前置条件,只有满足了版本号的要求才能够更新
3.业务主键的约束
数据库层面业务主键的约束,如果有一条相同的记录了,后续重复的数据就是进不去的
二.消息队列中的消息发生了堆积
哪些场景会出现消息堆积
-
消费者处理不过来
-
消费者消费出现了问题
总得来说就是消费者消费消息的速度慢了
- 处理消费者处理速度太慢
- 增加消费者数量:水平扩展,多加机器
- 优化消费者性能:代码优化,不需要处理的逻辑直接优化掉
- 生成者增加限流逻辑:设置batch.size来控制发送消息的速度
- 负载均衡:确保消息在消费者之间是公平分配,避免个别消费者过载
做好try catch ,如果消费端挂了 做好相关数据记录方便后续分析。
先定位消费慢的原因:如果是bug就解决bug,同时可以临时扩容增加消费速率
限流和降级
三.kafka消息丢失问题
kafka是用来实现异步消息通讯的一个中间件
Producer Consumer Broker组成
- 生产者确认机制acks:配置acks参数来决定生产者收到多少个副本的确认后认定为消息发送成功
- 配置多个副本,如果一个broker丢失,其他副本可以接管工作,从而保证消息不丢失
- 消费者设置为手动提交偏移量 enable.auto.commit=false
- 启用幂等生产者和事务
- 服务器端:持久化设置为同步刷盘