# 《并发设计模式》第27章-生产者消费者模式-消息堆积问题场景分析

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:了解生产者消费者模式的使用场景,重点掌握生产者消费者模式消息堆积问题的场景,并能够结合自身项目实际场景思考如何将生产者消费者模式灵活应用到自身实际项目中。

大家好,我是冰河~~

在基于生产者消费者模式开发实际项目时,当单位时间内,如果生产者生产数据的速度大于消费者消费数据的速度,就有可能产生消息堆积问题。如果这种情况持续一段时间,达到一定程度后,可能会对系统造成很大的影响,甚至这种影响是致命的。

# 一、故事背景

在前面的文章中,小菜想基于生产者消费者模式来优化个人文库系统,奈何自己功力不够,无法落实优化工作。不过在老王耐心的指导下,手把手给小菜分析问题,从源码层面给出解决方案,这使得小菜后来得以再次基于生产者消费者模式优化个人文库系统。

但是,使用了生产者消费者模式,从技术结合业务的角度来说,我们要考虑这样一个问题,当单位时间内,生产者生产数据的速度大于消费者消费数据的速度时,就会产生消息堆积的问题,如果这种情况持续一段时间,达到一定程度,可能就会对系统造成很大的影响,甚至会造成系统崩溃宕机。

在实际业务场景下,消息堆积问题往往可以细分成不同的业务场景,本章,就对消息堆积问题细分的业务场景进行简单的介绍。

# 二、消息堆积的场景

从实际业务场景出发,可以将消息对接的场景细分为:生产过快-阻塞队列已满,生产一般-消费过慢和阻塞队列过小三种场景。

# 2.1 生产过快-消息队列阻塞

生产过快-阻塞队列已满的场景,说的是生产者生产数据的速度非常快,消费者消费数据的速度根本跟不上生产者生产数据的速度,最终导致阻塞队列中堆满了待处理的任务,如图27-1所示。


可以看到,当阻塞队列的大小为2000时,如果生产者每分钟生产550条数据,而消费者每分钟只能消费50条数据时,4分钟后,阻塞队列中就会堆满待处理的任务。

# 2.2 生产一般-消费过慢

生产一般-消费过慢的场景,说的是生产者生产数据的速度一般,消费者消费数据的速度过慢,远远跟不上生产者生产数据的速度,导致了消息堆积,如图27-2所示。


可以看到,当阻塞队列的大小为2000时,如果生产者每分钟生产280条数据,而消费者每分钟只能消费30条数据时,8分钟后,阻塞队列中就会堆满待处理的任务。

# 2.3 阻塞队列过小

阻塞队列过小的场景,说的是生产者和消费者的速度一般,消费者的速度还是会比生产者慢,但是阻塞队列过小,很容易造成阻塞队列被堆满待处理的任务,如图27-3所示。


可以看到,当阻塞队列的大小为100,如果生产者每分钟生产30条数据,而消费者每分钟只能消费20条数据,10分钟后,阻塞队列中就会堆满待处理的任务。

# 三、消息堆积的影响

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码