流水线上的思考——异步程序开发模型(2)

上一期我们讲了一个简单的流水线处理流程,正如我们在上期最后所说那样,这个简单的流水线处理流程对于后续有慢设备操作的业务来说,性能有可能偏低。今天我们来讨论一下如何提高性能的方法。
首先让我们来大致区分一下一般业务的处理方式。目前我遇到的业务处理有两种方式:
1:业务之间无关联关系。
这种方式的特点在于业务之间不具备前后关系和关联关系。两个业务,哪一个业务放在前面处理,都不会影响到后续处理的结果。例如日志服务器等等。
2:业务之间有关联关系。
这种方式的特点就在于业务之间具有一定的关联性,业务处理的顺序不能打乱,必须执行完1以后再执行2。要不然处理的结果将完全出错,或者直接处理出错等等。例如和金钱相关的一些业务。
这两种处理方式,我们需要分开讨论。
今天我们先来讨论第一种方式(业务之间无关联关系)。我们可以先设计一个业务场景,然后针对这个场景来说明我们的处理方式。
业务场景:
我们设计一个日志服务器,这个日志服务器用来接收其它服务器发送来的日志信息,并将日志信息写入到日志数据库中。对于这个日志服务器来说,哪个服务器的日志先写入或者后写入,没有什么必须的要求。
根据上一篇原理,我们可以设计出类似下图的流水线处理方式:
通过上图,我们就已经做出了一个日志服务器的大致骨架。但是当您运行这个程序的时候,你会发现当大量日志信息发送给日志服务器的时候,CPU的利用率依然不高。那么如何提高CPU的利用率的? ——线程池!您想到的一定和我想到的是一样的。线程池对于这种类型的业务来说的确是个不错的选择。如果您不知道什么叫做线程池的话……好吧,看来你要去先补一补课了,去看看我之前写的一篇文章《IOCP线程池的开发》。如果您已经了解了线程池,那么上面的流水线处理方式将变成这样的。
通过这样的改进,我们在原来的单线程日志服务器的基础之上,修改成了一个多线程的日志服务器。经过测试,这种方式对于日志服务器来说性能提升不是一星半点的概念。
好了,我们回过头来看看我们今天设计的这种并行流水线处理方式。
我们先站在业务的角度来看业务处理流程:
1IOCP上接收到一个客户端的业务请求,
2:业务被放入业务请求队列。
3:业务请求队列和业务处理队列进行置换。
4:业务处理队列将相应的请求通过IOCP发送给业务处理线程池进行处理。
如果我们站在线程的角度来看业务处理流程:
1IOCP中的一个线程将业务写入业务分发线程中的业务请求队列。
2:业务分发线程将业务请求队列和业务处理队列置换。
3:业务分发线程将业务分发给IOCP线程池进行业务处理。
通过以上的描述,我们发现,既然我们最后都要将业务请求分发给IOCP线程池,那么我们为什么要先将业务发送给业务分发线程,然后再由这个分发线程分发给线程池呢?这样做不是脱了裤子放屁么?这个业务分发线程是否可以取消掉呢?
我觉得,这个问题可以看这个分发线程的处理业务:如果分发线程的作用只是简单的将业务分发给线程池,而没有其它业务的话,那么这个分发线程是完全可以取消的;但如果这个分发线程除了处理分发以外,还要对于一些外围业务进行相应处理的话,我还是建议保留这个分发线程。
例如我曾经做过的一个项目,这个分发线程的作用是有两个功能:
1:将相关业务分发给线程池进行处理。
2:对于一些上线、下线、心跳的外围业务进行简单处理。
对于这样的项目来说,如果有个分发线程的话,处理起来会相对地方便很多。
好,我们来总结一下今天讨论的结果。这个结果应该是分两个。
1:对于使用分发线程的情况:
2:对于不使用分发线程的情况:
在业务线程池中中的业务分发处理部分,如果业务类型比较多时,建议大家可以采用业务编号和处理函数映射的方法。如果业务类型较少时,可以直接使用switch  case来做。
好了,今天的讨论就是这些了,下次我们将讨论业务之间有关联关系的处理方法。今天讨论的东西只是我的一些看法,如果有好的方法,希望大家能直接回复或者在QQ上告诉我,我的QQ是:513479626
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/1142138如需转载请自行联系原作者

fxh7622

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ReentrantLock 锁相关笔记

为什么80%的码农都做不了架构师?>>> ReentrantLock重入锁简单理解就是对同一个线程而言,它可以重复的获取锁。例如这个线程可以连续获取两次锁,但是释放锁的次数也一定要是两次 Lock locknew ReentrantLock(true);//公平锁 Lock …

计算机启动程序bios_如何构建自己的计算机,第三部分:准备BIOS

计算机启动程序biosSo you’ve carefully picked out some parts and built a computer, but it doesn’t really do anything…yet. Before we hop into installing your operating system, we need to take a quick look at the BIOS and prepare it for our operating syste…

kindle图书免费下载_如何在Kindle上免费签出图书馆书籍

kindle图书免费下载Tired of paying so much for ebooks? Most libraries these days let you check out eBooks, for free, just like regular books. 厌倦了为电子书支付这么多钱? 如今,大多数图书馆都让您免费阅读电子书,就像普通书籍一样…

总结之:CentOS 6.4系统裁减详解及装载网卡步骤

前言 随着接触Linux的慢慢深入、对Linux也有了一个基本认识了吧,慢慢的接触系统内核、系统配置文件、在了解Linux的系统启动流程后,现在来总结一下一个简单的Linux系统的裁减方法和步骤,一个只有内核文件和几个简单的命令的小Linux系统&am…

android 设备占用_如何查看正在占用Android设备的空间

android 设备占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how yo…

mysql密码正确却提示错误, 不输入密码反而能登录

今天部署阿里云服务器, 发现之前可以连接的mysql服务器突然连接不上了, 密码我确认是正确的,但登录时就是显示密码错误, 很崩溃, 差点气得我就想重装mysql了。 好在经过几番苦寻找到了以下能解决我问题的资料, 成功解决了我的问题, 万分感谢,…

php旧版本windows_Windows的旧版本中如何进行多任务处理?

php旧版本windowsConsidering that DOS was a single-tasking OS and the ties it had with early versions of Windows, just how did earlier versions of Windows manage to accomplish multi-tasking? Today’s SuperUser Q&A post looks at the answers to this ques…

docker swarm的应用----docker集群的构建

一、docker安装 这里我们安装docker-ce 的18.03版本 yum -y remove docker 删除原有版本 #安装依赖包 [rootDocker ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 #添加docker的CE版本的yum源配置文件 [rootDocker ~]# curl https://download.docker…

微信小程序 fire_如何在Fire TV和Fire TV Stick上侧面加载应用程序

微信小程序 fireAmazon’s Fire TV and Fire TV stick technically runs Android…but you wouldn’t know it from looking. Amazon has a wall of content for its set-top box, and doesn’t want Google (with its own competing platform) to crash the party. But even t…

设备无法获得谷歌运行怎么办_因此,您刚刚获得了Google主页。 怎么办?

设备无法获得谷歌运行怎么办So you scored a Google Home for Christmas. That’s awesome because this is a killer little smart speaker that can do a lot of different things—in fact, it can be a little overwhelming. The good news is that we’ve got you covered…

IDEA Maven创建多个Module相互依赖

1、前言 在大型企业项目中,系统架构复杂多变,一个项目根本无法支撑起所有业务。为了提高项目扩展性、灵活性、重用性,封装性,将项目分为多个Module是非常必要的。 这里就不说IDEA如何安装了,安装好IDEA后需要修改maven…

速达5000出现计算成本数据溢出的问题

算成本提示某货品成本溢出处理方法,该问题是由于货品成本异常,成本上亿或者负亿造成的; 1.首先通过语句:select * into tmp_goods from l_goods where ABS(aprice)>100000,把成本价格超过10万的货品资料取出&#x…

收银员英文缩写_如何在没有收银员的苹果商店购买东西

收银员英文缩写If you visit an Apple Store in the hopes of buying a new iPhone, iPad, or MacBook, you have to talk to an Apple employee, since all the expensive products are kept in the back. However, if it’s just an accessory you want, you can buy it with…

php表单提交完返回,表单内容不清空解决方法

2019独角兽企业重金招聘Python工程师标准>>> 我们经常在注册的时候,填写一大推信息以后在提交注册的时候,因为某一项信息不正确,在返回的时候之前的填写的内容全部没有了,这样会导致用户丧失再次填写的信息&#xff0c…

word标尺灰色_如何在Microsoft Word中使用标尺

word标尺灰色Word’s rulers let you control the margins of your page and the indentation of paragraphs. They’re great for precisely lining up images, text, and other elements. If you’re printing a document, the rulers can help ensure that what you see on …

Matplotlib学习---用matplotlib画误差线(errorbar)

误差线用于显示数据的不确定程度,误差一般使用标准差(Standard Deviation)或标准误差(Standard Error)。 标准差(SD):是方差的算术平方根。如果是总体标准差,那么用σ表示…

Android One和Android Go有什么区别?

In 2014, Google announced a lineup of low-cost, low-spec phones called Android One. In 2017, they announced Android Go, specifically designed for low-cost, low-spec phones. So…what’s the difference? 2014年,Google宣布了一系列名为Android One的低…

outlook advanced find 快捷键不起作用

症状:用户反应按outlook advanced find的快捷键时无效,快捷键为CtrlShiftF。第一感觉是肯定跟别的软件有冲突了,观察了下,发现用户正在使用sougou拼音输入法,于是点其属性查看,果然发现与其的简繁切换冲突了…

21-while里的break简单用法

break是结束循环,break之后、循环体内代码不再执行。 while True:yn input(Continue(y/n): )if yn in [n,N]:breakprint(running......) 结果输出: 转载于:https://www.cnblogs.com/hejianping/p/10861816.html

视频造假_如何发现“深造假”面部切换视频

视频造假Recently, Reddit has been making news again with a subreddit in w hich people use a machine learning tool called “Deep Fake” to automatically replace one person’s face with another in a video. Obviously, since this is the internet, people are us…