DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
[概述]
自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定。这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和高效。今天特意写篇blog来记录我的心得与大家分享。
[功能实现说明]
沿用上次的草图
目前DEMO图上的功能都已经实现。下面谈谈各部分的实现。
- 通信服务, 由DIOCP实现,担当与客户端的通信工作,负责接收数据包,处理粘包和数据回传的工作
- 数据分发队列, 由uWorkDispatcher单元实现, 其中利用 OTL中的无锁队列担当数据的缓存,在使用uJobPusher推送队列中的任务。
- 数据推送,由ZeroMQ完成,使用Push/Pull模式,由于第一次接触ZeroMQ,可能没有挖掘到ZeroMQ的潜力,导致现在进程之间传递都是线程操作,开始一直担心这个问题,迟迟没有下手,最后还是坚持用了,效果还不错。
- 逻辑处理进程,由主控台程序完成,里面主要收到数据分发队列中分发过来的任务后,进行逻辑处理,然后再将需要返回的数据,推送回通信服务进程(由uJobReceiver单元处理),并投递到DIOCP传输队列,该进程中使用到QWorkers。等一下我专门介绍这个方便的队列任务处理类。
- 客户端,由TCPClient实现数据的通信。
[QWorkers说明]
之前一直想设计一个这样的东西,几次下来都不如意,自从接触到QWorkers后,发现原来应该这样去设计。下面是我研究QWorkers画的一流程图。一个中午的吃饭的时间,基本上就可以理解80%,作者设计思路明确,使用简单,而且队列使用原子锁,也比使用临界高效不少。作者是QDAC开源项目的发起人。
主要作用,任务(可以单次任务,定时任务(比如每天12:00执行), 延时任务, 手动触发任务)的投递和执行。适合做逻辑运算任务。具体使用可以参考DEMO[DIOCP\Demos\MultiProcessor\processorWithQWorker]
[ZeroMQ]
ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。
推荐大家看两遍blog, 我就不多写了。
ZeroMQ研究与应用分析: ttp://www.cnblogs.com/rainbowzc/p/3357594.html
Delphi实战: http://my.oschina.net/zeroflamy/blog/109457
[关于DEMO]
程序使用XE5编译,
服务端(SERVER):DIOCP是支持D7-XE6的,所以Server可以用D7-XE6原理上是可以编译的,只是工程文件是XE5编译的,需要自己稍作处理
客户端(TCPClient): D7-XE6都应该没有问题。使用的标志控件(TcpClient),标准写法.
逻辑处理进程(processor):超级简单的处理进程。D7-XE6
逻辑处理进程(processorWithQWorker):由于使用了QWorkers,只能支持D2007以上的版本.
[关于解决方案的应用]
该框架主要用于ERP的三层框架。逻辑处理进程可以实现热拔插。可以启动多个。自动接收任务。底层稳定,持续几个月的服务端再也不是什么难事了….
后续会结合MyBean框架做一些例子的整合。
欢迎大家继续关注。
DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了的更多相关文章
- DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端
最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...
- 基于开源SuperSocket实现客户端和服务端通信项目实战
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
- 【DIOCP开源项目】实际应用案例
案例1 DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定.高效并且使用起来十分简单. 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希 ...
- BootCDN 开源项目免费 CDN 加速服务,Jquery插件库
2017-11-17 19:38:32 免费好用的在线 css js 文件引用 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 Jquery插件库 .
- DIOCP开源项目-Delphi高性能无锁队列(lock-free)
最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配.然而这一切都需要一个队列, 这几天都在关注无锁队列. ...
- DIOCP开源项目-DIOCP3的重生和稳定版本发布
DIOCP3的重生 从开始写DIOCP到现在已经有一年多的时间了,最近两个月以来一直有个想法做个 30 * 24 稳定的企业服务端架构,让程序员专注于逻辑实现就好.虽然DIOCP到现在通讯层已经很稳定 ...
- 项目ITP(三) 玩玩 服务端 到 app端
前言 系列文章:[传送门] 泡泡脚,写写博客,规律生活,睡个好觉,待会看会书. 正文 上面讲了二维码生成,及 手机端扫一扫,大家有兴趣去看看. 今天我们讲一下,百度云推送平台. 每天想着问题,问题只会 ...
- DIOCP开源项目-DIOCP3 大文件的传输DEMO<断点续传>
首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的 ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
随机推荐
- 【linux】linux 环境下 安装禅道(转载) -- 跟web服务器无关,无视apache、nginx!!!
下载地址:http://www.zentao.net/download/zentao10.0.beta-80076.html 参考文章 链接 :https://blog.csdn.net/xinxin ...
- 【mysql】使用xtrabackup在线增量备份及恢复数据库
一.Percona Xtrabackup 简介 1.Xtrabackup bin目录文件 介绍 1)innobackupex innobackupex 是xtrabackup的一个符号链接 . in ...
- tensorflow没有代码提示的问题
在tensorflow包下的__init__.py文件中定义了一个contrib变量表示tensorflow.contrib包下的内容,但是tensorflow.contrib这个包是懒加载的,也就是 ...
- Spring4+Hibernate4事务小记
学习Spring+Hibernate,非常强大的框架,为了追新,就直接从最高版本开始学习了,这要冒很大的风险,因为网上可查到的资料大多是针对旧版本的,比如Spring3,Hibernate3. 根据我 ...
- 树莓派进阶之路 (009) - 树莓派ftp脚本(原创)
FTP.sh #!/bin/sh cd echo "彻底卸载原有的ftp" sudo apt-get remove --purge vsftpd #(--purge 选项表示彻底删 ...
- Android之listview运用(美团美食列表)
首先我们将listview简单实现,有图形,有文字:效果如图 之前我们完成了一个较为简单的listview视图列表,但是生活中我们往往碰到的 是更为复杂列表,有图像有评分标准,不如我们来试一试手,做一 ...
- 【webservice】使用命令wsimport构建WebService客户端
wsimport命令介绍 在JDK的bin文件夹中,有一个wsimport.exe,这个工具依据wsdl文件生成相应的类文件,然后用这些类文件,就可以像调用本地的类一样调用WebService提供的方 ...
- spark运行模式
一.Spark运行模式 Spark有以下四种运行模式: local:本地单进程模式,用于本地开发测试Spark代码; standalone:分布式集群模式,Master-Worker架构,Master ...
- Windows中"打开方式..."无法指定程序的解决办法
Windows真DT, 今天升级了vim, 从vim73到vim74, 突然发现右键菜单打开方式中的VIM不见了, 于是手动重新指定到vim74\gvim.exe, 未果, Windows就直接忽略了 ...
- shell value too great for base
今天同步文件的时候发现了这个问题: 原因是: tar_file_month=`date +%m` rsync -auzq --exclude=))"]" 当月是8月,tar_fil ...