一种外汇牌价处理系统及方法
技术领域
本申请涉及数据处理技术领域,尤其涉及一种外汇牌价处理系统及方法。
背景技术
外汇交易系统,为解决外汇交易员从不同的终端分别进行交易带来的不便而整合各做市商渠道的外汇交易买卖平台,通常牌价来源的多样性,牌价实时性,准确性等一系列性能问题是金融交易软件的硬伤.
现有技术中,因牌价来源众多,每秒钟系统能够处理的交易或事务的数量TPS是衡量系统处理能力的重要指标。程序要处理每秒在3000TPS到5000TPS的牌价,还要有1000TPS的交易,然而单个服务端程序为保证数据的完整性,在数据进行写入或读取操作时只可以进行一个操作,即写入时不可以进行读取,读取时不可以进行写入,因此,无法达到这么高的处理能力,就会出现大量数据等待处理的情况,进而出现处理延迟,甚至出现系统崩溃。
为了解决牌价的高并发,通常采用加权硬件设备性能的方式,如提升内存、CPU(Central Processing Unit,中央处理器)的性能等。为解决实时性,通常会对来不及处理的数据采用放弃处理的方式,以防止数据处理队列累积带来的数据延迟。随着做市商和会员商成员的数量不断增加,现有采用加强硬件设备性能的方式将使用户因为不断增加硬件设备的投入,而导致成本负担的加重;另外,放弃来不及处理的数据会使做市商的报价数据丢失,给做市商和会员商带来不可预估的损失。
发明内容
有鉴于此,本申请提供了一种外汇牌价处理系统及方法,以克服现有技术中由于待处理牌价数据量大而不断增加硬件设备投入导致成本提高以及放弃来不及处理的数据给做市商和会员商带来损失的问题。
为实现上述目的,本申请提供以下技术方案:
一种外汇牌价处理系统,包括:至少一个牌价处理器,其中,每个牌价处理器包括:
至少一对数据处理队列,每对数据处理队列包括用于写入待处理数据的第一队列和用于读取待处理数据的第二队列;
用于监控所有的所述第二队列的待处理数据剩余量的监控模块;
用于在所述监控模块检测到所述第二队列的待处理数据剩余量为零时,控制所述第二队列转换为新的第一队列,同时控制所述第一队列转换为新的第二队列的动态互换引擎模块;
用于对所述第二队列读取的待处理数据进行处理的数据处理模块。
优选的,该系统还包括:用于将所述待处理的数据发送给所述第一队列的数据源模块。
优选的,所述数据源模块具体通过轮询发送机制将所述数据发送给所述第一队列。
优选的,该系统还包括:处理器控制模块,用于根据所述数据源模块发送数据的数量,增加或减少连入系统的牌价处理器的个数。
优选的,所述处理器控制模块为PLC控制器。
优选的,所述数据处理模块为多线程处理器。
一种外汇牌价处理方法,包括:
利用第一队列进行待处理数据的写入,并利用第二队列进行待处理数据的读取;
利用数据处理模块将所述第二队列读取的待处理数据进行处理;
当监控模块检测到所述第二队列的数据剩余量为零时,利用动态互换引擎模块控制所述第二队列转换为新的第一队列进行数据写入,同时控制所述第一队列转换为新的第二队列进行数据读取。
优选的,该方法还包括:采用数据源模块将所述待处理的数据发送给所述第一队列。
优选的,所述数据源模块具体通过轮询发送机制将所述数据发送给所述第一队列。
优选的,所述数据处理模块为多线程处理器。
由以上技术方案可知,本申请公开了一种外汇牌价处理系统及方法,该系统包括:至少一个牌价处理器,其中,每个牌价处理器包括:至少一对数据处理队列,每对数据处理队列包括用于写入待处理数据的第一队列和用于读取待处理数据的第二队列;用于监控所有的所述第二队列的待处理数据剩余量的监控模块;用于在所述监控模块检测到所述第二队列的待处理数据剩余量为零时,控制所述第二队列转换为新的第一队列,同时控制所述第一队列转换为新的第二队列的动态互换引擎模块;用于对所述第二队列读取的待处理数据进行处理的数据处理模块。该系统通过采用读写分离的方式,实现了写入和读取同时进行的“无锁”状态,且保证了数据的完整性,在客户不需要改善硬件设备的情况下,大大提高了软件的性能,使数据处理速度得到了很大的提升,解决了客户业务扩展带来的系统压力的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例一提供的一种外汇牌价处理系统的结构示意图;
图2为本申请实施例二提供的一种外汇牌价处理系统的结构示意图;
图3为本申请实施例二提供的一种队列互换示意图;
图4为本申请实施例三提供的一种外汇牌价处理方法的流程图;
图5为本申请实施例四提供的一种外汇牌价处理方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为克服现有技术中由于待处理牌价数据量大而不断增加硬件设备投入导致成本提高以及放弃来不及处理的数据给做市商和会员商带来损失的问题,本申请提供了一种外汇牌价处理系统及方法,具体方案如下所述:
实施例一
本申请实施例一提供了一种外汇牌价处理系统,如图1所示,图1为本申请实施例一提供的一种外汇牌价处理系统的结构示意图。该系统包括:至少一个牌价处理器1,其中,每个牌价处理器1包括:
至少一对数据处理队列101,每对数据处理队列101包括用于写入待处理数据的第一队列1011和用于读取待处理数据的第二队列1012。
具体的,在本申请中,数据处理队列的个数可根据实际需要以及实际生产能力进行设定,在此不作限制,可以为1个或多个。每个数据处理队列包括一个写入队列和一个读取队列,读取队列进行读取的时候,写入队列可以进行写入,二者互不干扰,实现了整体上的“无锁”状态。
用于监控所有的第二队列1012的待处理数据剩余量的监控模块102。
对一个牌价处理器中所有的数据处理队列配备一个监控模块,来监控第二队列待处理数据的剩余量,当发现第二队列中的数据为空后,将消息发送给动态互换引擎模块。
此外,监控模块还可以监控第一队列,当检测到第一队列和第二队列均为空,且第一队列没有数据写入时,将消息发送给动态互换引擎模块,使其停止对数据处理队列中两个队列的切换,节约资源。
用于在监控模块102检测到第二队列1012的待处理数据剩余量为零时,控制第二队列1012转换为新的第一队列,同时控制第一队列1011转换为新的第二队列的动态互换引擎模块103。
当第二队列中的待处理数据为零时,动态互换引擎模块将第一队列与第二队列进行切换,第二队列作为新的第一队列进行待处理数据写入,第一队列作为新的第二队列进行待处理数据的读取。
需要说明的是,本申请中的第一队列与第二队列均遵从“先进先出,后进后出”的原则,如排队般,先写入的数据先进行读取,后写入的数据后进行读取。
用于通过动态互换引擎模块103对第二队列1012读取的待处理数据进行处理的数据处理模块104。
本申请中,牌价处理器的个数也不做限定,可以为1个也可以为多个,具体根据数据量来定,多个牌价处理器可以拉低每台牌价处理器需要处理的数据量的峰值,避免数据的积压,具有更高的实时性。
由以上技术方案可知,本申请实施例一提供了一种外汇牌价处理系统,该系统通过采用读写分离的方式,实现了写入和读取同时进行的“无锁”状态,且保证了数据的完整性,在客户不需要改善硬件设备的情况下,大大提高了软件的性能,使数据处理速度得到了很大的提升,解决了客户业务扩展带来的系统压力的问题。
实施例二
在实施例一的基础上,本申请实施例二提供了另一种外汇牌价处理系统,如图2所示,图2为本申请实施例二提供的一种外汇牌价处理系统的结构示意图。该系统包括:数据源模块201、处理器控制模块202和至少一个牌价处理器203。
数据源模块201用于将待处理的数据发送给牌价处理器203中的第一队列。其中,数据源模块201通过轮询发送机制将数据发送给第一队列。
处理器控制模块202,用于根据数据源模块201发送数据的数量,增加或减少连接入系统的牌价处理器203的个数。
当处理器控制模块检测到数据源模块发送的待处理数据量较大时,可以根据数据处理速度计算需要的牌价处理器个数,并根据当前连入系统的牌价处器个数来增加相应个数的牌价处理器连入系统;当处理器控制模块检测到数据源模块发送的待处理数据量较小时,可以根据数据处理速度计算需要的牌价处理器个数,并根据当前连入系统的牌价处器个数来减少相应个数的牌价处理器连入系统。
其中,处理器控制模块202可以为PLC控制器,在此不作限制。
需要说明的是,本申请中牌价处理器的个数可以为固定的个数,即不需要处理器控制模块的参与,也就是说,本系统也可以只包括数据源模块和牌价处理器即可。
本申请中,牌价处理器203包括:
至少一对数据处理队列,每对数据处理队列包括用于写入待处理数据的第一队列和用于读取待处理数据的第二队列;
用于监控所有的所述第二队列的待处理数据剩余量的监控模块;
用于在所述监控模块检测到所述第二队列的待处理数据剩余量为零时,控制所述第二队列转换为新的第一队列,同时控制所述第一队列转换为新的第二队列的动态互换引擎模块;
用于对第二队列读取的待处理数据进行处理的数据处理模块。
其中,数据处理模块可以为多线程处理器,从而进一步提高了并发处理性能,使处理速度更快。其他具体可参见实施例一,在此不再赘述。
具体的,本系统主要的逻辑机制为:
如图3所示,将数据处理队列分为两个缓存队列:队列1(即第一队列)、队列2(即第二队列),该数据处理队列整体属于“无锁”队列,采用CAS(Compare And Swap)算法的无锁并发控制方法。与带“锁”的队列(即读取时无法写入,写入时无法读取的队列状态)相比,无锁算法的设计和实现都要复杂的多,但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小很多,更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,它要比基于锁的方式拥有更优越的性能。
CAS算法包含3个参数CAS(V,E,N),其中,V表示要更新的变量,E表示预期值,N表示新值。只有当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,失败的线程不会被挂起,仅仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。在CAS首先是一个无穷循环,在这里,这个无穷循环用于多线程间的冲突处理,即当当前线程受其他线程影响而更新失败时,会不停的尝试,直到成功。因此,在整个更新过程中,无需加锁,无需等待。无锁的操作实际上将多线程并发的冲突处理交由应用层自行解决,这不仅提升了系统性能,还增加了系统的灵活性。
该系统在后续的压力测试中,发挥了很强悍的性能处理能力,在高并发的情况下,牌价TPS轻松可以达到3000TPS,交易也可达到1000TPS,无延迟现象,已经达到了期望值。
由以上技术方案可知,本申请实施例二提供的该外汇牌价处理系统通过采用报价消息轮询发送机制,支持牌价处理服务动态分布式部署,并进一步采用读写分离的方式,实现了写入和读取同时进行的“无锁”状态,且保证了数据的完整性,在客户不需要改善硬件设备的情况下,大大提高了软件的性能,使数据处理速度得到了很大的提升,数据交由多线程处理模块进行数据处理,提高了并发处理的性能,解决了客户业务扩展带来的系统压力的问题。
实施例三
本申请实施例三提供了一种外汇牌价处理方法,应用于如实施例一所述的外汇牌价处理系统中,该系统包括至少一个牌价处理器,其中,每个牌价处理器包括:至少一个数据处理队列、与数据处理队列一一对应的监控模块和动态互换引擎模块、数据处理模块。
如图4所示,图4为本申请实施例三提供的一种外汇牌价处理方法的流程图。该方法包括:
S401:利用第一队列进行待处理数据的写入,利用第二队列进行待处理数据的读取。
其中,第一队列和第二队列共同构成一个数据处理队列。
S402:将读取的待处理数据进行处理。
利用数据处理模块将第二队列读取的待处理数据进行处理。
S403:当第二队列的数据剩余量为零时,控制第一队列与第二队列进行切换。
具体的,当监控模块检测到第二队列的数据剩余量为零时,利用动态互换引擎模块控制所述第二队列转换为新的第一队列进行数据写入,同时控制所述第一队列转换为新的第二队列进行数据读取。
由以上技术方案可知,本申请实施例三提供的该种外汇牌价处理方法,通过采用读写分离的方式,实现了写入和读取同时进行的“无锁”状态,且保证了数据的完整性,在客户不需要改善硬件设备的情况下,大大提高了软件的性能,使数据处理速度得到了很大的提升,解决了客户业务扩展带来的系统压力的问题。
实施例四
在本申请实施例三的基础上,本申请是实施例四提供了另一种外汇牌价处理方法,应用于如实施例二所述的系统中。
如图5所示,图5为本申请实施例四提供的一种外汇牌价处理方法的流程图。该方法包括:
S501:将待处理的数据发送给第一队列。
具体的,采用数据源模块将待处理的数据发送给第一队列。其中,数据源模块具体通过轮询发送机制将数据发送给第一队列。
S502:利用第一队列进行待处理数据的写入,利用第二队列进行待处理数据的读取。
其中,第一队列和第二队列共同构成一个数据处理队列。
S503:将读取的待处理数据进行处理。
利用数据处理模块将第二队列读取的待处理数据进行处理。其中,数据处理模块为多线程处理器。
S504:当第二队列的数据剩余量为零时,控制第一队列与第二队列进行切换。
具体的,当监控模块检测到第二队列的数据剩余量为零时,利用动态互换引擎模块控制所述第二队列转换为新的第一队列进行数据写入,同时控制所述第一队列转换为新的第二队列进行数据读取。
其中,具体的队列交换流程为:
当设置Flag属性为false时,代表两个队列都为空数据。从Xnet传输过来输入写入队列1时,设置Flag属性为true,再判断Flag属性,如果为true,队列1变为读取数据队列,队列2为写入队列,队列1读取一条数据,移除一条数据,当该队列数据为空时,再次判断Flag的属性,如果为true,替换队列2为读取数据队列,队列1为写入队列。依次进行替换,以保证程序的正常接收数据以及快速的读取缓存数据。按照此方式,进行循环替换,以达到高性能处理缓存数据能力。
该方法在后续的压力测试中,发挥了很强悍的性能处理能力,在高并发的情况下,牌价TPS轻松可以达到3000TPS,交易也可达到1000TPS,无延迟现象,已经达到了期望值。
由以上技术方案可知,本申请实施例四提供的该外汇牌价处理方法通过采用报价消息轮询发送机制,支持牌价处理服务动态分布式部署,并进一步采用读写分离的方式,实现了写入和读取同时进行的“无锁”状态,且保证了数据的完整性,在客户不需要改善硬件设备的情况下,大大提高了软件的性能,使数据处理速度得到了很大的提升,数据交由多线程处理模块进行数据处理,提高了并发处理的性能,解决了客户业务扩展带来的系统压力的问题。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。