# 《并发设计模式》第28章-生产者消费者模式-消息堆积问题解决方案

作者:冰河
星球: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)

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

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

大家好,我是冰河~~

在基于生产者消费者模式开发实际项目时,当单位时间内,如果生产者生产数据的速度大于消费者消费数据的速度,就有可能产生消息堆积问题。消息堆积问题一旦处理不好,可能会给系统造成致命的问题。所以,我们要了解消息堆积的常见解决方案,尽最大程度避免由于消息堆积问题为系统带来的影响。

# 一、故事背景

上一章,我们主要分析了产生消息堆积的问题,究其根本原因,还是在单位时间内,生产者生产数据的速度大于消费者消费数据的速度,阻塞队列中的数据会慢慢积压,在一段时间内,达到一定程度,可能会产生各种问题。那如何解决消息堆积的问题呢。与分析消息堆积问题的原因一样,对于消息堆积的解决方案来说,我们也可以细分场景来说。

总体上来说,我们可以基于每天生产多消费少、业务高峰队列满、队列过小被打满三种场景来分析

# 二、每天生产多消费少

每天生产多消费少指的是以天为单位,每天生产者生产的数据量大于消费者消费的数据量,如图28-1所示。


假设生产者每天生产20000条数据,而消费者每天只能消费15000条数据,这种场景下,只能增加消费者的数量,让消费者并行消费阻塞队列中的数据。

# 三、业务高峰队列满

业务高峰队列满指的是虽然消费者每天消费的数据总量比生产者生产的数据总量多,但是在系统高峰期时,生产者生产数据的速度过快,阻塞队列被填满了待处理的任务,如图28-2所示。


假设生产者每天生产20000条数据,消费者每天可消费25000条数据,但由于生产者在业务高峰期时生产数据的速度过快,阻塞队列很容易被填满,此时,可以增加阻塞队列的大小,使其在业务高峰期时不被填满即可。

# 四、队列过小被填满

队列过小被打满指的是消费者每天消费的数据总量比生产者生产的数据总量多,但由于某些原因,阻塞队列的大小无法设置的足够大,业务高峰期生产者生产数据的速度过快,阻塞队列被填满。如图28-3所示。


假设生产者每天生产20000条数据,消费者每天可消费25000条数据,由于某些原因,阻塞队列最大只能设置为100,无法设置的足够大,此时可以对生产者进行限流,使得生产者在业务高峰期生产数据的速度慢一点,不至于填满阻塞队列即可。

# 查看全文

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