# 《并发设计模式》第24章-生产者消费者模式-面向C端的个人文库系统崩了
作者:冰河
星球: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)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:了解生产者消费者模式的使用场景,重点掌握生产者消费者模式在实际项目场景中的应用,并能够结合自身项目实际场景思考如何将生产者消费者模式灵活应用到自身实际项目中。
大家好,我是冰河~~
其实大家对生产者消费者模式并不陌生了,生产者和消费者模式中有三个重要角色,生产者、任务队列、消费者。生产者提交任务到队列,消费者从队列中取出任务进行处理。市面上比较成熟的消息中间件,像RocketMQ、RabbitMQ、Kafka以及ActiveMQ等,都是基于生产者和消费者模式进行设计的,也在大量的项目中得到的广泛的应用。
# 一、故事背景
公司生产环境平时平稳运行的个人文库系统,这天晚上突然崩了。此时的小菜正在梦中与周公交流着什么,突然一阵急促的手机铃声打断了他跟周公的交谈。此时的小菜艰难的睁开眼,拿起手机放到耳边:“喂,。。。”,还没等小菜说完,电话那头就传来了急促的声音:“喂,小菜啊,公司线上的个人文库系统崩了,需要马上排查和恢复问题,很紧急,你看看,我这里重启服务都不行,现在使用的人数还比较多”。原来是运维的打来电话,说是公司线上的个人文库系统崩了。
“嗯,我看看”,说着小菜便揉了揉眼睛,艰难的从床上起来,打开自己的电脑便排查起问题。过了10多分钟,电话又响了,“喂,小菜,怎么样,找到问题了吗?修复了吗?”。
其实此时的小菜根本没有定位的问题所在,回应到:“别急,我正在看,目前还没定位到问题”。
“算了,我重新构建、部署和发布下项目试试”,运维急促的说到。
“好,你先这样处理下吧”,小菜回应到。
不一会,电话又响了:“喂,小菜啊,我重新构建、部署和发布了项目,目前暂时可以了,但是就是有点慢,勉强能用,你再排查下是啥问题,我这边先应对下”。
“好的”。
于是,小菜继续排查代码问题,可排查来、排查去也没定位到问题所在,眼看天都快亮了,小菜决定先不排查问题了,先睡觉,不然到公司根本无法正常工作了,于是小菜便再次躺在床上睡着了。。。
# 二、求助老王
第二天,气喘吁吁的跑到公司,“还好没迟到”,小菜心里想着。于是,来到自己的工位,将电脑放到工位上,继续排查昨晚运维反馈的问题。但无论小菜怎么分析问题,怎么定位问题,但还是不知问题所在,眼看马上就中午了,小菜的心情也越来越急躁,“哎,这到底是啥问题啊”。仍旧是搞不定,
此时,小菜听到了老王正在与产品经理沟通着什么需求。于是,小菜觉得还是求助老王吧。等老王与产品经理沟通完毕,小菜走到老王的工位对老王说:“老大,昨晚运维打电话跟我说,生产环境的个人文库系统崩了,开始让我排查和修复问题,我没定位到问题,运维重新构建项目、部署和发布了,勉强可以使用,说是人比较多的时候,使用起来比较慢,我昨天没找出问题,今天到公司还是没找到问题,可以帮我分析下吗?”。
“好,我看看”,老王回应到。
于是老王便跟着小菜来到了小菜的工位,老王坐下看起了个人文库项目的代码。要不说老王是真牛逼呢?没一会儿,便对小菜说:“这个个人文库系统代码写的确实有点问题,人数多了性能问题就暴露出来了”。
“啊,老大,你是怎么看出来的呢?”。
“我也是分析出来的,走,去会议室,我给你讲讲”。
“好的”。
于是小菜便拿着电脑跟老王一起走进了会议室。。。
# 三、个人文库核心需求
“为了便于你理解,我还是写几个接口和类来模拟个人文库系统,实现流程与个人文库系统相似”。
“好的”,小菜回应到。
对于个人文库系统来说,用户可以将自己的文档上传到文库中进行管理,个人文库系统会存储这些文档,并且会存储用户的业务数据。另外,个人文库系统后续根据用户的需要,可以根据文档的名称、文档里的关键词进行检索,以便快速定位和搜索用户上传过的文档,这就需要为上传的文档简历索引。所以,对于个人文库项目来说,核心业务有三个,分别是:存储文档、存储业务数据、建立文档索引,如图24-1所示。
而这三个核心功能的数据,要分别存储到不同的服务器上,比如存储文档时,要将文档存储到文件服务器。存储业务数据时,要将业务数据存储到数据库服务器。建立文档索引时,需要将索引文档存储到搜索引擎服务器,如图24-2所示。
# 查看全文
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码