DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

[概述]

自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,获得了不少朋友的支持和确定。这加大了个人开发动力,通过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来作逻辑处理进程,进一步使得逻辑处理进程更加方便和高效。今天特地写篇blog来记录个人心得与你们分享。html

 

[功能实现说明]

沿用上次的草图缓存

目前DEMO图上的功能都已经实现。下面谈谈各部分的实现。网络

 

  • 通讯服务, 由DIOCP实现,担当与客户端的通讯工做,负责接收数据包,处理粘包和数据回传的工做
  • 数据分发队列, 由uWorkDispatcher单元实现, 其中利用 OTL中的无锁队列担当数据的缓存,在使用uJobPusher推送队列中的任务。
  • 数据推送,由ZeroMQ完成,使用Push/Pull模式,因为第一次接触ZeroMQ,可能没有挖掘到ZeroMQ的潜力,致使如今进程之间传递都是线程操做,开始一直担忧这个问题,迟迟没有下手,最后仍是坚持用了,效果还不错。
  • 逻辑处理进程,由主控台程序完成,里面主要收到数据分发队列中分发过来的任务后,进行逻辑处理,而后再将须要返回的数据,推送回通讯服务进程(由uJobReceiver单元处理),并投递到DIOCP传输队列,该进程中使用到QWorkers。等一下我专门介绍这个方便的队列任务处理类。
  • 客户端,由TCPClient实现数据的通讯。

 

[QWorkers说明]

以前一直想设计一个这样的东西,几回下来都不如意,自从接触到QWorkers后,发现原来应该这样去设计。下面是我研究QWorkers画的一流程图。一个中午的吃饭的时间,基本上就能够理解80%,做者设计思路明确,使用简单,并且队列使用原子锁,也比使用临界高效很多。做者是QDAC开源项目的发起人。多线程

image

主要做用,任务(能够单次任务,定时任务(好比天天12:00执行), 延时任务, 手动触发任务)的投递和执行。适合作逻辑运算任务。具体使用能够参考DEMO[DIOCP\Demos\MultiProcessor\processorWithQWorker]框架

 

[ZeroMQ]

ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、链接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通讯中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。分布式

推荐你们看两遍blog, 我就很少写了。spa

ZeroMQ研究与应用分析ttp://www.cnblogs.com/rainbowzc/p/3357594.html.net

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框架作一些例子的整合。

 

欢迎你们继续关注。

相关文章
相关标签/搜索