自己在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.流水线模型实战的更多相关文章

  1. .Net中的并行编程-1.路线图(转)

    大神,大神,膜拜膜拜,原文地址:http://www.cnblogs.com/zw369/p/3834559.html 目录 .Net中的并行编程-1.路线图 分析.Net里线程同步机制 .Net中的 ...

  2. .Net中的并行编程-6.常用优化策略

                本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...

  3. .Net中的并行编程-4.实现高性能异步队列

    上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...

  4. .Net中的并行编程-2.ConcurrentStack的实现与分析

    在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...

  5. .Net中的并行编程-3.ConcurrentQueue实现与分析

    在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...

  6. Python中的并行编程速度

    这里主要想记录下今天碰到的一个小知识点:Python中的并行编程速率如何? 我想把AutoTool做一个并行化改造,主要目的当然是想提高多任务的执行速度.第一反应就是想到用多线程执行不同模块任务,但是 ...

  7. .Net中的并行编程-1.路线图

    最近半年一直研究用.net进行并行程序的开发与设计,再研究的过程中颇有收获,所以画了一个图总结了一下并行编程的基础知识点,这些知识点是并行编程的基础,有助于我们编程高性能的程序,里面的某些结构实现机制 ...

  8. .NET Framework 4 中的并行编程9---线程安全集合类

    原文转载自:http://www.cnblogs.com/xray2005/archive/2011/10/11/2206745.html 在.Net 4中,新增System.Collections. ...

  9. .Net中的并行编程-7.基于BlockingCollection实现高性能异步队列

    三年前写过基于ConcurrentQueue的异步队列,今天在整理代码的时候发现当时另外一种实现方式-使用BlockingCollection实现,这种方式目前依然在实际项目中使用.关于Blockin ...

随机推荐

  1. js中NAN、NULL、undefined的区别

    NaN:保留字(表明数据类型不是数字) undefined:对象属性或方法不存在,或声明了变量但从未赋值.即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对其 ...

  2. fabric upgrade from old crashlystic stuck in build

    提示build,一直没有反应. 问题:工程中原有的shell命令屏蔽掉了

  3. .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引

    系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...

  4. tomcat本地部署war包的方式

    最近学习java,在本地tomcat部署时,主要采取以下方式: 一.本地构建生成war包 在本地项目中的terminal下,使用命令 “mvn clean install”或 先执行“mvn clea ...

  5. OCP-052 & 053部分答案解析

    OCP~052 . GRANT ANY OBJECT PRIVILEGE(授予任何对象权限):允许被授权人将其本身不拥有的对象的对象权限授予他人,但不能授予自己. . ENABLE VALIDATE ...

  6. Struts2整合Hibernate3实现用户登录功能

    所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...

  7. Java Class文件详解

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) Java Class文件中包含以下信息: [+]view code ClassFile { u4 magic;  ...

  8. oracle分页

    sqlStmt = sqlCon.createStatement(); strSQL sql="select * from (select rownum rno,content from ( ...

  9. windows下配置Faster-RCNN

    mark一个 http://yun.baidu.com/share/link?shareid=1018944597&uk=1543560377 http://blog.csdn.net/sin ...

  10. php的<?php ?>标签匹配

    在公司实习了没有多久就开始和同事发现了一个问题,就是之前的人写过的项目经常莫名其妙的出错,仔细的看项目的源代码的时候发现项目中并没有逻辑上的错误,而且各种关系以及数据都没有问题,这是为什么呢.再次认真 ...