证券期货交易高并发模型

原创
2016/08/11 20:27
阅读数 2.8K

交易系统中的产品和产品之间是隔离的,产品之间的消息不共享,也不会造成干扰。 同一个产品下的订单必须顺序处理,但不同的产品之间的订单没有顺序概念。

所以交易系统会按照产品来分线程。

假设有N个线程,M个产品。如何让线程能充分的利用CPU,并具有一定的公平性能照顾到每一个产品中的订单?

 

我们创建一个环,将每个产品当做一个节点安放在环上。每个节点带有一个队列,队列中存放源源不断提交给本产品的消息,如订单。如下图所示:

假设有两个线程T1,T2。每个线程都会按照环的顺序,一个节点一个节点的处理。为了不被某一个产品的巨量消息卡住,导致其它产品无法被执行。线程会消费batchSize个消息,就会退出当前产品,继续处理下一个产品。如果当前产品消息数量不足batchSize,则消费完所有消息立即跳往下一个产品。

 

因为同一个产品下的消息必须为串行处理,所以同一个产品在同一时间只能有一个线程对其进行处理。如下图所以。T2线程决定跳往下一个节点时,发现下一个节点被线程T1所占,T2则立刻越过下一个节点,继续向后寻找空闲节点。

T2跳过T1所在的节点,找到后续节点,进行锁定,然后消费。

在所有节点中,有一个特殊节点,编号为0的节点。此节点处理和产品不相关的消息。例如创建用户,创建新产品。创建新产品会在环上创建新节点。

当前模型中均使用CAS锁,可以减少锁竞争开销。

后续优化:

1, 删除组合时,清理环。当前因为组合不多,并且清理环会遇到复杂的并发问题。

2, 产品上没有消息时,让线程扫描快速越过。当前线程获取到节点锁以后,才知道节点上是否有消息,后续如何能在获取锁之前就可以获取状态。

 

此并发模型具有很强的扩展能力,假设一个线程可以处理500个订单每秒,那么10个线程可能达到4000以上。当同一台物理机无法对线程再扩展时,可以再另一台物理机上,再开启一个进程。

展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
2 评论
7 收藏
0
分享
返回顶部
顶部