消息队列常见面试题

一.如何处理重复消息

首先分析产生原因:
假设我们消费者拿到了消息并且消费了业务逻辑也走完了,但是消费者挂了没有更新 offset,另外一个消费者顶上来了发现offset没有更新,消息又重写发了一遍消费者把业务逻辑又执行了一遍。

如何解决

1.幂等 从业务上来规避

幂等性:多次请求得到的结果是一致的

利用唯一ID去重。记录关键的key 比如订单ID加入又重复的消息过来先进行判断这个ID是不是已经被处理过了

2.数据库的版本号 乐观锁

将版本号作为前置条件,只有满足了版本号的要求才能够更新

3.业务主键的约束

数据库层面业务主键的约束,如果有一条相同的记录了,后续重复的数据就是进不去的

二.消息队列中的消息发生了堆积

哪些场景会出现消息堆积

  1. 消费者处理不过来

  2. 消费者消费出现了问题


总得来说就是消费者消费消息的速度慢了

  • 处理消费者处理速度太慢
    • 增加消费者数量:水平扩展,多加机器
    • 优化消费者性能代码优化,不需要处理的逻辑直接优化掉
    • 生成者增加限流逻辑:设置batch.size来控制发送消息的速度
    • 负载均衡:确保消息在消费者之间是公平分配,避免个别消费者过载

做好try catch ,如果消费端挂了 做好相关数据记录方便后续分析。

先定位消费慢的原因:如果是bug就解决bug,同时可以临时扩容增加消费速率

限流和降级

三.kafka消息丢失问题

kafka是用来实现异步消息通讯的一个中间件

Producer Consumer Broker组成

  1. 生产者确认机制acks:配置acks参数来决定生产者收到多少个副本的确认后认定为消息发送成功
  2. 配置多个副本,如果一个broker丢失,其他副本可以接管工作,从而保证消息不丢失
  3. 消费者设置为手动提交偏移量 enable.auto.commit=false
  4. 启用幂等生产者和事务
  5. 服务器端:持久化设置为同步刷盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值