一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种实时行情处理方法及系统与流程

2022-04-13 14:59:36 来源:中国专利 TAG:


1.本发明涉及行情数据处理技术领域,具体的,本发明涉及一种实时行情处理方法及系统。


背景技术:

2.香港联合交易所(hkex)通过其数据平台omd,以多播的形式实时推送全市场行情数据,多播底层采用udp无连接通信协议,为满足行情提速的迫切需求,需实现对多播数据的实时接收和处理,并且需在网络极端情况下,有对多播数据作出修复的技术手段,以保证实时行情数据的准确性。


技术实现要素:

3.为了克服现有技术的不足,本发明提供了一种实时行情处理方法及系统,以解决上述的技术问题。
4.本发明解决其技术问题所采用的技术方法是:一种实时行情处理方法,其改进之处在于:包括以下的步骤:s1、多线路多播数据接收线程接收行情数据包,并按行情数据包的接收顺序将行情数据存储在包缓存中;s2、预处理线程拆分行情数据包,添加至内部缓冲区cirbuf4msg队列,cirbuf4msg队列是存储行情消息的循环缓冲区;s3、实时行情处理线程从cirbuf4msg消息队列按序列号获取行情数据,进行解码,并消费,完成对行情数据的处理。
5.在上述方法中,所述行情数据包包括实时行情数据包和快照行情数据包。
6.在上述方法中,所述步骤s1,包括以下的步骤:
7.s11、启动多线路多播数据接收线程,多线路多播数据接收线程根据预先设置的通道行情类型及主备线路标记获取对应的多播地址;
8.s12、在服务器上创建udp套接字后加入至所述多播地址,等待多播通道推送行情,udp即无连接通信协议;
9.s13、多线路多播数据接收线程收到多播通道上的udp数据包后,根据收到的udp数据包的长度,从多线路多播数据接收线程内部的包缓存队列cirbuf获取最后一个可用的udp数据包缓冲区节点,将整个udp数据包拷贝到分配的存储空间,然后继续等待多播通道的下一个udp数据包,如此循环往复,cirbuf是存储udp数据包的循环缓冲区;
10.s14、将整个包缓存中的数据按照数据包接收顺序存储,供预处理线程使用。
11.在上述方法中,所述步骤s13中,从多线路多播数据接收线程内部的包缓存队列cirbuf获取最后一个可用的udp数据包缓冲区节点,将整个udp数据包拷贝到分配的存储空间,包括以下的步骤:
12.s131、预先分配若干个缓冲区节点,并将所有节点添加到cirbuf队列中,缓冲区队列都包含读指针readpos和写指针writepos,写入数据时,写指针writepos依次循环递增,指向下一个可写节点,消费数据时,读指针readpos依次循环递增,指向下一个可读节点;
13.s132、当readpos=writepos时,表示队列为空,此时等待新的数据包可读,当(writepos 1)取模队列大小等于readpos时,表示队列已满,此时如果收到新的数据包,则自动扩展该缓冲区队列,分配固定大小的缓冲区节点,再将这些新分配的缓冲区节点添加到队列尾部;
14.s133、调整writepos位置,将udp数据包写入新的尾部空闲缓冲区。
15.在上述方法中,所述步骤s2,包括以下的步骤:
16.s21、预处理线程从所述的包缓存队列cirbuf中按序取出每一个udp数据包;
17.s22、将包内的所有消息关联递增的序列号;
18.s23、根据序列号将该udp数据包插入至cirbuf4msg消息队列的指定位置。
19.在上述方法中,所述步骤s23,根据序列号将udp数据包插入,是基于线路仲裁算法,该算法包括以下的步骤:
20.s231、比较当前消息的序列号是否小于cirbuf4msg中最小的等待消息的序列号,如果是,则丢弃当前消息,如果不是,则根据当前消息的序列号和最小的等待消息的序列号,查找当前消息应该出现在cirbuf4msg消息队列中的位置;
21.s232、检查队列中该位置是否已被占用,即该序列号的消息是否已被其它线路写入,如果未被占用,则写入该消息,同时设置已写入标记,如果已被占用,则丢弃该消息;
22.s233、当新的消息插入至cirbuf4msg消息队列后,检查该消息的序列号至最小的等待消息的序列号之间的所有消息是否都已经收到,如果是都已经收到,则通过条件变量通知实时行情处理线程,跳转至步骤s3,如果不是,则等待新的数据包到来,使序列号连续后,则通过条件变量通知实时行情处理线程,跳转至步骤s3。
23.在上述方法中,所述步骤s3,包括以下的步骤:
24.s31、实时行情处理线程接收到预处理线程通知,从cirbuf4msg消息队列中最小的等待消息的序列号开始,获取一段包含连续序列号的消息数据进行行情解码;
25.s32、更新内部缓存数据结构,将处理后的结果序列化为protobuf消息,protobuf即google开源的实现数据自动序列化和反序列化的机制;
26.s33、将protobuf消息发送至kafka消息存储系统,逐条处理连续的消息,并修改最小等待序列号的值,提供给下游消费者订阅使用,完成对行情数据的处理,kafka即一种高吞吐量的分布式发布订阅消息系统。
27.本发明还提供了一种实时行情处理系统,包括多线路多播数据接收线程、预处理线程和实时行情处理线程,
28.多线路多播数据接收线程用于接收线程接收行情数据包,并按行情数据包的接收顺序将数据存储在包缓存中;
29.预处理线程与多线路多播数据接收线程连接,用于拆分行情数据包,添加至内部缓冲区cirbuf4msg队列;
30.实时行情处理线程与预处理线程连接,用于从cirbuf4msg消息队列按序列号获取行情数据,进行解码,并消费,完成对行情数据的处理。
31.在上述系统中,还包括数据完整性检测线程,数据完整性检测线程与所述预处理线程连接,用于检测cirbuf4msg中是否出现消息空隙gap,从missingset集合中找出连续的缺失序列号,missingset集合为预处理线程中消息的缺失序列号集合。
32.在上述系统中,还包括重传数据线程,重传数据线程与所述数据完整性检测线程连接,重传数据线程还与所述预处理线程连接,用于在接收到数据完整性检测线程的通知后,获取指定定序列号范围内的消息,然后更新到对应的消息队列cirbuf4msg,完成数据修复。
33.本发明的有益效果是:使用独立线程完成行情数据包的接收、预处理、丢包检测及修复,通过统一的消息处理逻辑,保证行情的顺序性和准确性;并且在网络极端情况时,可通过重传和快照机制完成数据修复,保证行情数据的准确性。
附图说明
34.附图1为本发明的一种实时行情处理方法的流程图。
具体实施方式
35.下面结合附图和实施例对本发明进一步说明。
36.以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整地描述,以充分地理解本发明的目的、特征和效果。显然,所描述的实施例只是本发明的一部分实施例,而不是全部实施例,基于本发明的实施例,本领域的技术人员在不付出创造性劳动的前提下所获得的其他实施例,均属于本发明保护的范围。另外,专利中涉及到的所有联接/连接关系,并非单指构件直接相接,而是指可根据具体实施情况,通过添加或减少联接辅件,来组成更优的联接结构。本发明创造中的各个技术特征,在不互相矛盾冲突的前提下可以交互组合。
37.参照图1所示,本发明的一种实时行情处理方法,包括以下的步骤:
38.s1、多线路多播数据接收线程接收行情数据包,并按行情数据包的接收顺序将行情数据存储在包缓存中,所述行情数据包包括实时行情数据包和快照行情数据包;
39.具体的,包括如下步骤:
40.s11、启动多线路多播数据接收线程,多线路多播数据接收线程根据预先设置的通道行情类型及主备线路标记获取对应的多播地址;
41.s12、在服务器上创建udp套接字后加入至所述多播地址,等待多播通道推送行情,该行情包括实时行情和快照行情,udp即无连接通信协议;
42.s13、多线路多播数据接收线程收到多播通道上的udp数据包后,根据收到的udp数据包的长度,从多线路多播数据接收线程内部的包缓存队列cirbuf获取最后一个可用的udp数据包缓冲区节点,将整个udp数据包拷贝到分配的存储空间,然后继续等待多播通道的下一个udp数据包,如此循环往复,cirbuf是存储udp数据包的循环缓冲区,是一个可扩展大小的循环队列,数据一直在队列尾部写入,当未处理udp数据包数量超出队列当前大小时,自动扩展并将数据包写入新扩展数据缓冲区,保证接收到的udp数据包不会被丢弃;
43.具体的,从多线路多播数据接收线程内部的包缓存队列cirbuf获取最后一个可用的udp数据包缓冲区节点,将整个udp数据包拷贝到分配的存储空间,包括以下的步骤:
44.s131、预先分配若干个缓冲区节点,由于udp数据包最大1500字节,因此缓冲区节点的大小可为1500字节,并将所有节点添加到cirbuf队列中,缓冲区队列都包含读指针readpos和写指针writepos,写入数据时,写指针writepos依次循环递增,指向下一个可写
节点,消费数据时,读指针readpos依次循环递增,指向下一个可读节点;
45.s132、当readpos=writepos时,表示队列为空,此时等待新的数据包可读,当(writepos 1)取模队列大小等于readpos时,表示队列已满,此时如果收到新的数据包,则自动扩展该缓冲区队列,分配固定大小(例如1500字节)的缓冲区节点,再将这些新分配的缓冲区节点添加到队列尾部;
46.s133、调整writepos位置,将udp数据包写入新的尾部空闲缓冲区。
47.s14、将整个包缓存中的数据按照数据包接收顺序存储,供预处理线程使用。
48.s2、预处理线程拆分行情数据包,添加至内部缓冲区cirbuf4msg队列,cirbuf4msg队列是存储行情消息的循环缓冲区;
49.具体的,包括以下的步骤:
50.s21、预处理线程从所述的包缓存队列cirbuf中按序取出每一个udp数据包;
51.s22、将包内的所有消息关联递增的序列号;
52.s23、根据序列号将该udp数据包插入至cirbuf4msg消息队列的指定位置;
53.根据序列号将udp数据包插入,是基于线路仲裁算法,以保证收到的消息是按序列号进行排序,并丢弃重复消息,该算法包括以下的步骤:
54.s231、比较当前消息的序列号是否小于cirbuf4msg中最小的等待消息的序列号,如果是,则丢弃当前消息,如果不是,则根据当前消息的序列号和最小的等待消息的序列号,查找当前消息应该出现在cirbuf4msg消息队列中的位置;
55.s232、检查队列中该位置是否已被占用,即该序列号的消息是否已被其它线路写入,如果未被占用,则写入该消息,同时设置已写入标记,如果已被占用,则丢弃该消息;
56.s233、当新的消息插入至cirbuf4msg消息队列后,检查该消息的序列号至最小的等待消息的序列号之间的所有消息是否都已经收到,如果是都已经收到,则通过条件变量通知实时行情处理线程,跳转至步骤s3,如果不是,说明这段区间不是连续的,此时插入后无需其它操作,等待后续新的(乱序)数据包到来使得整个区间的包序列变成连续的,则通过条件变量通知实时行情处理线程,跳转至步骤s3。
57.s3、实时行情处理线程从cirbuf4msg消息队列按序列号获取行情数据,进行解码,并消费,完成对行情数据的处理;
58.具体的,包括以下的步骤:
59.s31、实时行情处理线程接收到预处理线程通知,从cirbuf4msg消息队列中最小的等待消息的序列号开始,获取一段包含连续序列号的消息数据进行行情解码;
60.s32、更新内部缓存数据结构,将处理后的结果序列化为protobuf消息,protobuf即google开源的实现数据自动序列化和反序列化的机制;
61.s33、将protobuf消息发送至kafka消息存储系统,逐条处理连续的消息,并修改最小等待序列号的值,提供给下游消费者订阅使用,完成对行情数据的处理,kafka即一种高吞吐量的分布式发布订阅消息系统。如果cirbuf4msg可用消息数量为空(即没有数据可取,或者队列有数据但是因为序列号存在空隙暂时不能读取),则通过条件变量等待新的消息到来后触发队列可读操作。当cirbuf4msg因为新的数据包到达导致可读时,实时行情处理线程按序获取新的数据包进行解码,以此反复。
62.本发明还提供了一种实时行情处理系统,包括多线路多播数据接收线程、预处理
线程和实时行情处理线程,
63.多线路多播数据接收线程用于接收线程接收行情数据包,并按行情数据包的接收顺序将数据存储在包缓存中;
64.预处理线程与多线路多播数据接收线程连接,用于拆分行情数据包,添加至内部缓冲区cirbuf4msg队列;
65.实时行情处理线程与预处理线程连接,用于从cirbuf4msg消息队列按序列号获取行情数据,进行解码,并消费,完成对行情数据的处理。
66.进一步地,还包括数据完整性检测线程和重传数据线程,数据完整性检测线程与所述预处理线程连接,用于检测cirbuf4msg中是否出现消息空隙gap,从missingset集合中找出连续的缺失序列号,missingset集合为预处理线程中消息的缺失序列号集合。由于部分数据包可能丢失,当udp消息写入cirbuf4msg时,更大序列号的消息写入队列时会将之间连续缺失的序列号记录在missingset集合中,因此该数据完整性检测线程需要检查该队列的缺失序列号集合missingset,从该集合中找出一段连续的缺失序列号,连同该通道id等相关信息一起通知数据重传线程,由后者完成数据修复。
67.重传数据线程与所述数据完整性检测线程连接,重传数据线程还与所述预处理线程连接,用于在接收到数据完整性检测线程的通知后,获取指定定序列号范围内的消息,然后更新到对应的消息队列cirbuf4msg,完成数据修复。该线程提供外部接口供数据完整性检测线程使用,将对应通道缺失序列号gap存储在内部缓存中。当缺失消息队列非空时,该线程会通过tcp方式连接港交所rts数据重传服务,登录认证后,发送待修复数据的通道id及序列号范围,通过应答获取该通道指定序列号范围内的消息,然后更新到该通道id对应的消息队列cirbuf4msg。一旦缺失消息被恢复,可能会触发队列可读操作,此时实时行情处理线程又可以顺序继续处理该实时队列的消息,直至下一次不可读。
68.进一步地,本发明还可以通过配置文件的方式在程序启动时读取需要处理的通道id列表,对每个通道创建一个线程组,每个线程组包括了多线路多播数据接收线程、预处理线程、实时行情处理线程、数据完整性检测线程和重传数据线程,实现多通道的实时行情处理,快速接收港交所任意数量任意通道的行情数据。
69.本发明使用独立线程完成行情数据包的接收、预处理、丢包检测及修复,通过统一的消息处理逻辑,保证行情的顺序性和准确性;并且在网络极端情况时,可通过重传和快照机制完成数据修复,保证行情数据的准确性。
70.以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献