开发三年遇到的分布式十大坑,并发知识体系大全

本文探讨了在开发分布式系统时遇到的十个关键问题,包括消息丢失、消息乱序、消息积压、消息过期失效和队列写满等。针对这些问题,文章提供了详细的解决方案,如设置RabbitMQ的deliveryMode和确认模式,以及处理Kafka消息丢失的策略。此外,文章还介绍了分布式缓存中的坑,如Redis数据丢失和避免脑裂的方法。最后,讨论了分库分表过程中遇到的挑战,如如何自动进行分库分表和生成全局唯一ID。
摘要由CSDN通过智能技术生成
  • 发送消息的时候将消息的 deliveryMode 设置为 2 。

  • 开启生产者 confirm 模式,可以重试发送消息。

(3)消费者丢失消息

==============

这三年被分布式坑惨了,曝光十大坑

消费者丢失消息

消费者刚拿到数据,还没开始处理消息,结果进程因为异常退出了,消费者没有机会再次拿到消息。

解决方案

  • 关闭 RabbitMQ 的自动 ack,每次生产者将消息写入消息队列后,就自动回传一个 ack给生产者。

  • 消费者处理完消息再主动 ack,告诉消息队列我处理完了。

问题: 那这种主动 ack 有什么漏洞了?如果 主动 ack 的时候挂了,怎么办?

则可能会被再次消费,这个时候就需要幂等处理了。

问题: 如果这条消息一直被重复消费怎么办?

则需要有加上重试次数的监测,如果超过一定次数则将消息丢失,记录到异常表或发送异常通知给值班人员。

(4)RabbitMQ 消息丢失总结

======================

这三年被分布式坑惨了,曝光十大坑

RabbitMQ 丢失消息的处理方案

(5)Kafka 消息丢失

=================

**场景:**Kafka 的某个 broker(节点)宕机了,重新选举 leader (写入的节点)。如果 leader 挂了,follower 还有些数据未同步完,则 follower 成为 leader 后,消息队列会丢失一部分数据。

解决方案

  • 给 topic 设置 replication.factor 参数,值必须大于 1,要求每个 partition 必须有至少 2 个副本。

  • 给 kafka 服务端设置 min.insyc.replicas 必须大于 1,表示一个 leader 至少一个 follower 还跟自己保持联系。

3. 消息队列的坑之消息乱序

===================

坑: 用户先下单成功,然后取消订单,如果顺序颠倒,则最后数据库里面会有一条下单成功的订单。

RabbitMQ 场景:

  • 生产者向消息队列按照顺序发送了 2 条消息,消息1:增加数据 A,消息2:删除数据 A。

  • 期望结果:数据 A 被删除。

  • 但是如果有两个消费者,消费顺序是:消息2、消息 1。则最后结果是增加了数据 A。

这三年被分布式坑惨了,曝光十大坑

RabbitMQ消息乱序场景

这三年被分布式坑惨了,曝光十大坑

RabbitMQ 消息乱序场景

RabbitMQ 解决方案:

  • 将 Queue 进行拆分,创建多个内存 Queue,消息 1 和 消息 2 进入同一个 Queue。

  • 创建多个消费者,每一个消费者对应一个 Queue。

这三年被分布式坑惨了,曝光十大坑

RabbitMQ 解决方案

Kafka 场景:

  • 创建了 topic,有 3 个 partition。

  • 创建一条订单记录,订单 id 作为 key,订单相关的消息都丢到同一个 partition 中,同一个生产者创建的消息,顺序是正确的。

  • 为了快速消费消息,会创建多个消费者去处理消息,而为了提高效率,每个消费者可能会创建多个线程来并行的去拿消息及处理消息,处理消息的顺序可能就乱序了。

这三年被分布式坑惨了,曝光十大坑

Kafka 消息丢失场景

Kafka 解决方案:<

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值