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

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

  1. 少儿编程python线上课程-北京Python程序开发课程

    课程详情 大数据及机器学习必备语言,推荐9-13岁青少年学习. 帮助孩子掌握Python语言的主要核心基本语法.掌握Python面向对象开发的基本概念.掌握Python和Pygame进行2D游戏开发. ...

  2. 「开发者说」车辆管理上钉钉,云上管车小程序开发分享

    本篇文章的供稿人为云上管车研发工程师刘奇云,内容主要为钉钉小程序开发相关,概览本文大概需要3分钟,精读本文需要10分钟 "随着经济社会数字化发展水平的提升,协同办公日趋常态化.云上管车通过与 ...

  3. 推荐一本书:《Visual C++程序开发范例宝典》——你可以找到你想要的实例

    废话少说,先上<Visual C++程序开发范例宝典>的目录: 目录: 第1章 窗体与界面设计 1 1.1 菜单应用实例 2 实例001 在系统菜单中添加菜单项 2 实例002 带图标的程 ...

  4. andorid 手机APP应用程序开发介绍

    注意:此处的应用程序是一个app应用程序,而不是我们通常指的移动应用程序. 1.结束比较 本机应用 传统的本机应用程序开发模型中有两个主要系统,即iOS和Android,开发自己的应用程序需要使用每种 ...

  5. 【Vuforia AR Unity 2018.3.12f1】MikuAR安卓程序开发实践(三)代码终结篇_2019.4.24

    Unity平台 + Vuforia SDK实现的AR程序开发 模型的三大操作(平移 旋转 缩放)代码 一.平移 二.旋转缩放 三.操作代码解析 模型的选定(射线法) 食用方法 自发光组件 食用方法 V ...

  6. 云中数据_简化云中的应用程序开发

    云中数据 Everett Toews是Rackspace的一名开发倡导者,他每天在这里工作,以使OpenStack变得更广泛,并使Rackspace Cloud特别易于开发人员和操作员使用. 他是O' ...

  7. 微信小程序开发工具介绍及安装(中)

    小程序开发工具的安装方法 微信小程序开发工具的安装方法相对简单,并且适用于多个操作系统平台.以下是关于Windows.macOS和Linux三个平台上安装微信小程序开发工具的步骤和注意事项的详细介绍. ...

  8. 微信小程序开发公司的技术发展及行业现状

    微信小程序开发公司的技术发展及行业现状 作者:北京朗毓圣元科技 近些年,伴随着互联网,尤其是移动互联网的蓬勃发展,带动了微信小程序开发公司数量的爆炸式增长,依托于微信小程序的丰富应用场景,可以满足传统 ...

  9. 微信小程序开发流程的两种方法科普

    现在微信小程序早已渗透我们日常生活的方方面面,很多商家看到了小程序带来的巨大流量,也想开发一个自己的小程序.所以今天就跟大家科普下微信小程序开发流程,你会发现这个开发过程其实非常简单. 1. 在微信公 ...

最新文章

  1. Microsoft Teams快速上手系列-08Teams中的内部防火墙
  2. mysql dba系统学习(5)二进制日志binlog之一
  3. SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法
  4. 【项目经理之修炼】 全文索引
  5. Google 投资了京东
  6. 【算法】排序_基数排序
  7. Web前端程序员简历模板
  8. composer 安装php endroid/qrcode二维码应用,二维码里面添加logo
  9. Java微信支付退款异常
  10. 数据分析面试【统计学】-----假设检验知识点归纳
  11. proximal Algorithm
  12. 闪存文件系统(Flash File System)
  13. 安装heg时找不到java,记录安装HEG的坑
  14. Android基础新手教程——4.1.3 Activity登堂入室
  15. 我将进化成一条狗(6)——3D显示
  16. debian修改源的方法
  17. Xilinx推荐使用ODDR原语输出高质量时钟
  18. 使用nid修改dbname和dbid
  19. unity中Time.delaTime简单解释
  20. 蓝桥杯算法训练VIP-旅行家的预算

热门文章

  1. LOJ2195 旅行
  2. sublime代码片段
  3. linux查看文件大小
  4. 转-- iOS 30多个iOS常用动画,带详细注释
  5. C++中的三种继承public,protected,private(转)
  6. Weblogic EJB 学习笔记(3)精
  7. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?
  8. 简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?
  9. 学习笔记——本地事务ACID四大特性
  10. .net aspose.words 域加载图片_使用Python批量替换csdn文章的图片链接