Disruptor-net 3.3.0
Disruptor 介绍
Disruptor 是LMX开源出来的java编写的一个并发消息处理器,在队列中一边生产者放入消息,另外一边消费者并行取出处理,其核心是根据现代CPU硬件缓存特点发明不同于通用LinkedList或Queue的新型数据结构RingBuffer
LMX 系统每秒处理600万订单,这是个神话!,其业务模式是:In Memory+Event Source+Disruptor
Disruptor 框架解决了锁,伪共享带来的性能影响
为什么队列干扰了缓存呢?解释是这样的: 为了将数据放入队列,你需要写入队列,类似地,为了从队列取出数据,你需要移除队列也是一种写,客户端也许不只一次写入同样数据结构,处理写通常需要锁,但是如果锁使用了,会引起切换到底层系统的场景(线程上下文切换—个人理解), 当这个发生后,处理器会丢失它的缓存中的数据。—摘自jdon
关于Disruptor 原理介绍网上很多,可以参考 马丁.福勒 的关于Disruptor 架构介绍,以及其他资料很多的。
Disruptor 使用场景说明
任何一个技术方案都有个使用场景的Disruptor也不例外,此框架的使用场景总结如下:
补充个前提:那就是接到的消息量巨大,如果每秒不上万,十万,百万,那还是不要使用这个框架了,你的消费处理不要太延迟,如果你把这个框架用于往
数据库写数据就不那么适当了。
1、处理CQRS架构风格的command命令(jdon framework底层也是用的disruptor)
2、接收消息并处理场景,如,短信,邮件发送服务
3、业务流水线模式
4、队列使用场景也是Disruptor使用,反过来则未必
Disruptor-net介绍
Disruptor-net 是我在公司利用空余时间把java 版本的Disruptor移植到net 平台上,经过测试后,分享出来,如果有需要的童鞋可以下载下来使用,我上传了全部源码,你也可以修改,但请保留我的博客园地址链接,在使用过程中如果有问题请在博客园回复,我会处理并回复的。
网上有个Disruptor-net项目,这个项目是个老外写的,但目前版本是2.10.0比较老,更新也慢;Disruptor java版本更新很快目前是3.2.0,我的Disruptor-net 也是基于这个版本移植过来的,重用了网上的2.10.0版本的策略调度(对于task及其策略调度网上有个parallel-extensions-extras项目,提供了task及其调度多种算法实现,其实在使用的Disriptor-net 的时候基于策略使用net 默认的就可以了),原子操作两个模块,呵呵,算是资源重用啦,java 版3.2.0 变动很大,很多类名及类的功能与2.10.0完全不一样,增加了多个waitFor策略,ringBuffer也增加很多功能,在移植过程发现java里的接口命名都不加I前缀的,这个看起来很别扭,java 与 NET在具体实现上还是有很大的区别的,其中java里有很多C,C++的影子,java 目前不支持闭包,NET已经开始支持闭包,这在一定程度上提供间接的语法,为了与java版本的保持一致(便于以后升级维护)我在ringBuffer类,只增加了少量的函数闭包风格写法,其他基本上遵循原版的风格(包括注释,我发现eclipse里的java注释,是有格式化而且可以连接跳转,这点比vs里注释友好多了)
基本上主流程上的每个类,都通过功能单元测试,性能单元测试(我使用的是Nunit.net ),感觉比VS 自带的那个测试工具方便点。测试结果是ringBuffer并发处理能力远远超过BlockingCollection的并发处理能力,我的机器是 thinkpad x201i 4核 4G内存,极端情况下4个CPU全部100%,但内存占用量并不大。
性能测试(机器配置 thinkpad x201i 4核 4G内存)
有意思的是,Disrupt-net 测试与Disruptor-Java相差比较大, Disrupt-net最好ops出现8位数,Disruptor-Java平均在7-8位数作用,看了下这两种不同平台测试时间算法是有区别的java用system.millitime 前后两次相减,而NET使用DateTime.Now前后两次相减,则ops可以达到每秒 9位数,此项目里测试全部使用Stopwatch计算时间。
1亿个消息流水线程模式
测试结果:
每秒消息处理量,运行20次,如下图:
这种模式下BlockingCollection处理能力,太慢了一次处理大概需要150秒,ops每秒只有不到70万,所以不贴图了。
当然这种测试结果因硬件环境而不同!
总的来说,Disruptot的处理能力是惊人的,按照 ,In Memory+Event Source+Disruptor 这种架构风格处理业务,每秒处理600万订单,也是可能的。
这个版本作为技术研究用,代码在 https://github.com/bingyang001/disruptor-net-3.3.0-alpha
Disruptor-net 3.3.0的更多相关文章
- Disruptor深入解读
将系统性能优化到极致,永远是程序爱好者所努力的一个方向.在java并发领域,也有很多的实践与创新,小到乐观锁.CAS,大到netty线程模型.纤程Quasar.kilim等.Disruptor是一个轻 ...
- Disruptor学习笔记(一):基本原理和概念
一.Disruptor基本原理 在多线程开发中,我们常常遇到这样一种场景:一些线程接受用户请求,另外一些线程处理这些请求.比如日志处理中的日志输入和告警.这种典型的生产者消费者场景十分常见,而生产者消 ...
- disruptor实操作手冊(二)
多消费者场景 上一篇文章介绍了怎样构建一个简单的disruptorproject之后.应该有相当一部分客官骂娘了,确实这种范例在其他地方多的是. 从这篇開始,介绍一些不一样的东西. 一,多个消费者: ...
- 聊聊Disruptor 和 Aeron 这两个开源库
Disruptor The best way to understand what the Disruptor is, is to compare it to something well under ...
- Twitter Storm中Bolt消息传递路径之源码解读
本文初次发表于storm-cn的google groups中,现以blog的方式再次发表,表明本人徽沪一郎确实读过这些代码,:). Bolt作为task被executor执行,而executor是一个 ...
- disruptor--Introduction
The best way to understand what the Disruptor is, is to compare it to something well understood and ...
- Mybatis集成ehcache
Mybatis集成ehcache 1.为什么需要缓存 拉高程序的性能 2. 什么样的数据需要缓存 很少被修改或根本不改的数据 业务场景比如:耗时较高的统计分析sql.电话账单查询sql等 3. ehc ...
- ssh集成
导入pom依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- Shiro简介、入门案例、web容器的集成
目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...
- Mybatis整合(Redis、Ehcache)实现二级缓存
目的: Mybatis整合Ehcache实现二级缓存 Mybatis整合Redis实现二级缓存 Mybatis整合ehcache实现二级缓存 ssm中整合ehcache 在POM中导入相关依赖 < ...
随机推荐
- 有关bootstrap之排版
1.标题 HTML中的所有标题标签,从<h1> 到 <h6> 均可用.另外,还提供了.h1 到.h6 class,为的是给inline属性的文本赋予标题的样式. 在标题内还可以 ...
- 【Win10 应用开发】集成语音命令
记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语 ...
- 【Win 10开发】协议-上篇:自定义应用协议
就像系统许多内置应用可以通过URI来启动(如ms-settings-bluetooth:可以打开蓝牙设置页),我们自己开发的应用程序,如果需要的话,可以为应用程序自定义一个协议.应用程序协议在安装时会 ...
- 【.NET深呼吸】清理对象引用,有一个问题容易被忽略
大家知道,托管代码一个重要的特点是自动管理内存,即我们常说的垃圾回收机制,那些高大上的理论我就不重复了,有兴趣的朋友可以翻书.我这个有个毛病——不喜欢很严肃地去说一些理论的东西,所以我不多介绍了. 一 ...
- jQuery源码分析系列(30) : Ajax 整体结构
开头引用一段 想起一句话:前端研究,研究个屁~ 的确如此呀.补充下联:前端设计,设计个屁~ 前端目前最大的困境是,如 HTML 一样,无论你承不承认,市场上并不太需要 HTML 高手 其实这里引发一个 ...
- 深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器
× 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的 ...
- 【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http:/ ...
- JSON入门指南--客户端处理JSON
在传统的Web开发过程中,前端工程师或者后台工程师会在页面上写后台的相关代码,比如在ASP.NET MVC4里面写如下代码: @Html.TextBoxFor(m => m.UserName, ...
- 出操队形(LIS)
题目来源:微策略2013年校园招聘面试一面试题 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较 ...
- Android样式之selector
日常开发当中,难免会出现这样一种情况,为一个按钮.TextView...设置一个点击状态的颜色改变,可能是background背景的改变,也可能是字体颜色的改变,简单点说:默认状态下,字体颜色或者背景 ...