.Net中的并行编程-5.流水线模型实战
自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口)。。。。
上篇文章《.Net中的并行编程-4.实现高性能异步队列》介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了处理多线程问题及基于异步队列底层数据结构的解决方案。
需求如下:1.提供数据服写入服务供上层应用调用,数据写入服务处理的吞吐量要达到60w/s每秒,也就是用户每秒发送60w的数据然后通过数据写入服务写到数据库中(数据库为公司自主研发的实时数据库)。
2.尽量简化上层应用调用服务的复杂度。
一、分析性能瓶颈
1.实时数据库要求传入的数据需要带有ID(类似于关系库中的自增主键),但用户只传Name,需要根据Name去实时数据找到对应的数据ID,所以该地方频繁的与数据库交互是最大的瓶颈。
2.由于数据库原始的.Net API是基于底层C++ API 进行的二次开发,需要.Net和C++编程模型之间的转换(比如.Ne中存数数据用的是List,C++是数组,所以要把.Net中的List对象 转换为c++中的数组对象),而这个转换耗时相当大,所以数据转换操作也是性能瓶颈之一。
二 、解决方案
1.对于性能瓶颈1可以使用本地缓存,本地缓存维护了name和数据库ID直接的映射关系,所以查找id时,只要去本地缓存查找即可。由于该缓存读远远大于写,所以缓存部分使用了普通的Dictionary加上读写锁,读取数据时只要获取读锁,跟新数据时加上写锁,所以设计出以下流程。

2.对于性能瓶颈2可以采用并行的方式解决,我们并行模型主要分为三种:数据并行,任务并行,和流水线并行,关于这三种模型的基本介绍可以参照《Intel Threading Building Blocks 编程指南》第二章 并行思维。有的以上基础理论的支持,所以设计出以下模型。

上图中,每个操作都是在单独的线程中进行的,操作与操作之间采用队列进行解耦。由于流水线模型是典型的空间换时间,每个操作之间累积了大量数据,所以一旦程序出现崩溃,那么导致队列内的数据全部丢失,所以还要保证系统的高容错,由于采用了上篇文章中的队列而且在开始编码的时候已经考虑到了系统异常处理的细节,所以异常处理和多线程编程的复杂度也大大降低,并且每个操作处理的线程数也可动态适配(其实最理想的情况是根据每个操作的处理能力以及CPU利用率等进行动态负载均衡,由于配置的线程数已尽满足了需求所以动态负载均衡没有进行开发)。
三、关于扩展性
如果未来数据量要增加,那么相应的处理能力也要增加。那么最简单的方案就是动态增加每个处理操作的线程数,由于操作之间采用队列进行通信,那必然会设计到锁的问题,而且同时的进行多线程入队和多线程出队会造成频繁的上下文切换并造成性能下降,所以为了避免这种多线程竞争了情况,可采用多流水线,每个流水线的流程都跟上图一样,对于流水线直之间的负载均衡可以采用加权平均轮训,哈希求余等算法。
补充:
流水线模型的总体时间取决于最耗时的操作环节,所以再采用流水线模型时要尽量减少最耗时操作环节的时间,如在本案例中最耗时的环节是写入数据库部分,所以在进行编码和设计时对该部分进行了重点优化。
.Net中的并行编程-5.流水线模型实战的更多相关文章
- .Net中的并行编程-1.路线图(转)
大神,大神,膜拜膜拜,原文地址:http://www.cnblogs.com/zw369/p/3834559.html 目录 .Net中的并行编程-1.路线图 分析.Net里线程同步机制 .Net中的 ...
- .Net中的并行编程-6.常用优化策略
本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略. 一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...
- .Net中的并行编程-4.实现高性能异步队列
上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...
- .Net中的并行编程-2.ConcurrentStack的实现与分析
在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...
- .Net中的并行编程-3.ConcurrentQueue实现与分析
在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...
- Python中的并行编程速度
这里主要想记录下今天碰到的一个小知识点:Python中的并行编程速率如何? 我想把AutoTool做一个并行化改造,主要目的当然是想提高多任务的执行速度.第一反应就是想到用多线程执行不同模块任务,但是 ...
- .Net中的并行编程-1.路线图
最近半年一直研究用.net进行并行程序的开发与设计,再研究的过程中颇有收获,所以画了一个图总结了一下并行编程的基础知识点,这些知识点是并行编程的基础,有助于我们编程高性能的程序,里面的某些结构实现机制 ...
- .NET Framework 4 中的并行编程9---线程安全集合类
原文转载自:http://www.cnblogs.com/xray2005/archive/2011/10/11/2206745.html 在.Net 4中,新增System.Collections. ...
- .Net中的并行编程-7.基于BlockingCollection实现高性能异步队列
三年前写过基于ConcurrentQueue的异步队列,今天在整理代码的时候发现当时另外一种实现方式-使用BlockingCollection实现,这种方式目前依然在实际项目中使用.关于Blockin ...
随机推荐
- Python中的运算符
说完常用的数据类型,再来说下运算符.运算符用于将各种类型的数据进行运算,让静态的数据跑起来. 编程语言中的运算大致分为以下几个大类: 算术运算, 用于加减乘除等数学运算 赋值运算,用于接收运算符或方法 ...
- CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
最近在测试的过程中, 发现了SpringBoar的一个问题: SpringBoard[53] <Error>: CGContextTranslateCTM: invalid context ...
- 12步创建高性能Web APP
现在,Web App 日益重视用户的交互体验,了解性能优化的方式则可以有效提高用户体验.阅读和实践下面的性能优化技巧,可以帮你改善应用的流畅度.渲染时间和其他方面的性能表现. 概述 对 Web App ...
- 【目录】开源Math.NET基础数学类库使用总目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.开源Math.NET数学组件文章 1.开源Math.NET基础数学类库使用(01)综合介绍 2.开源Math.NET ...
- Cocos2d-x 3.2 学习笔记(十四)保卫萝卜之界面UI
保卫萝卜~上一篇说了使用CocoStudio制作主界面,这里来完善主界面动画及后续界面(主题界面ThemeUI.场景选择界面SelectMapUI),主要涉及的控件PageView. 学习要 ...
- Unity3D默认的快捷键
shift +方向键 向“向方向键前进” Windows系统Unity3D中的快捷键 组合键 键 功能 File 文件 Ctrl N New Scene 新建场景 Ctrl ...
- Azure ARM (1) UI初探
<Windows Azure Platform 系列文章目录> 在笔者之前的文章中,我们使用国内由世纪互联运维的Azure China,管理界面地址是:https://manage.win ...
- JS和jQuery中的事件总结(一)
学而时习之,小白现在天天写页面,基础知识还是要恶补的. 进入正题,什么是事件(此处单独对jQuery.JS)?就是JS和Html之间的交互时呢,用户和浏览器操作页面时的动作(其实是为引发的效果的执行操 ...
- html/css基础篇——html代码编写过程中的几个警惕点
本文想说的警惕点与浏览器兼容无关,主要是几个本人在项目中遇到的几个小问题的总结,问题虽小,但是却有时很困扰人,在此记录一下,如果后期有此类问题会持续添加到这里. 1.内联标签之间的空格 正常情况下书写 ...
- 跨平台的.NET运行环境 Mono 3.2发布
Mono是由Xamarin主办的一个开源项目平台,旨在让开发人员轻松构建跨平台的应用程序.Mono是基于ECMA标准来创建.NET框架,包括C#编译器和公共语言运行时(CLR),可以让.NET应用程序 ...