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

一种基于流式系统的行情延迟方法及系统与流程

2022-06-25 05:37:31 来源:中国专利 TAG:


1.本发明涉及行情数据处理技术领域,具体的,本发明涉及一种基于流式系统的行情延迟方法及系统。


背景技术:

2.行情解码系统接收来自三方或者交易所的原始实时行情消息,经系统内部解码后将合并后的行情消息按照预先定义的pb消息格式序列化后发布至kafka流式系统,提供给下游系统使用,pb即protobuf,是google开源的实现数据自动序列化和反序列化的机制,kafka是一种高吞吐量的分布式发布订阅消息系统。
3.交易所针对客户端行情展示通常具有一定的要求,以港股为例,支持level2流式报价、bmp即时报价以及延时报价,level2流式报价和bmp即时报价展示的都是实时行情,区别在于level2流式报价会通过推送的方式实时展示最新报价,而bmp必须手动刷新最新报价;延迟行情则是展示相对当前时刻15分钟前的报价,这个数据是交易所不直接提供的,因此需要基于实时行情按照指定的延迟时间间隔生成延迟行情。
4.对于下游行情订阅服务来说,一种可能的实现方式是各个下游服务自身从kafka消费实时数据缓存在本地,当消息产生时间相对于当前时间达到指定延迟间隔后开始处理。这种实现有以下缺点:(1)单个行情的数据量不可控,如果行情数据量很大,所有服务都各自延迟各自的数据会使用过多内存空间,增加资源消耗,而且随着下游消费业务的增加使得整体资源消耗更大;(2)下游服务对于实时行情和延迟行情的处理逻辑存在差异,无法复用相同的处理逻辑,程序开发复杂。因此,需要一种更简便有效的行情延迟方案。


技术实现要素:

5.为了克服现有技术的不足,本发明提供了一种基于流式系统的行情延迟方法及系统,以解决上述的技术问题。
6.本发明解决其技术问题所采用的技术方法是:一种基于流式系统的行情延迟方法,其改进之处在于:包括以下的步骤:s1、在kafka集群和行情延迟服务系统中部署网络时间同步服务ntp,行情延迟服务系统包括消费线程、生产者线程和延迟线程;s2、生产者线程向kafka集群写入数据,并使写入时间与行情延迟服务系统的时间同步;s3、启动消费线程,连接到kafka集群,设置需要消费的实时行情主题信息,同时,关闭消息读取后自动提交属性;s4、解码服务系统对kafka集群的消息进行解码,生成实时行情消息数据,实时行情消息数据通过kafka集群被消费线程读取;s5、延迟线程获取当前消息对应的时间t1,同时获取本地当前时间t2,判断t2-t1的值是否大于指定的延迟间隔,判断为是时,则将当前消息写入生产者消息队列,并通知生产者线程可读,判断为不是时,则延迟线程睡眠一定时间后,再重新获取本地当前时间t2’,并判断t2
’‑
t1的值是否大于指定的延迟间隔,如此循环,直至判断为是大于指定的延迟间隔时,则将当前消息写入生产者消息队列,并通知生产者线程可读;然后获取下一条消息,循环处理;s6、生产者线程从生产者消息队列读取消息,发送
至kafka集群对应的延迟主题中,数据成功写入后,向kafka集群实时主题提交该条消息,确认该条消息处理完毕,提供给下游消费者使用。
7.在上述方法中,所述步骤s4中,消费线程读取kafka集群后,行情延迟服务系统根据实时行情主题的分区数量,内部开辟对应数量的消息分区队列,消费线程将来自各分区的实时行情消息数据写入到相对应的消息分区队列中,每个消息分区队列关联一个延迟线程,通知对应的延迟线程可读。
8.在上述方法中,所述通知对应的延迟线程可读后,还包括步骤:延迟线程读取对应的消息分区队列,当所述消息分区队列为空时,相对应的延迟线程通过条件变量阻塞,直至消费线程向消息分区队列写入实时行情消息数据;当消息分区队列不为空时,跳转至步骤s5。
9.在上述方法中,所述步骤s6中,生产者线程从生产者消息队列读取消息时,当生产者消息队列为空时,则通过条件变量阻塞,当生产者消息队列不为空时,生产者线程读取消息后发送至kafka集群对应的延迟主题。
10.本发明还提供了一种基于流式系统的行情延迟系统,包括kafka集群、解码服务系统和行情延迟服务系统,kafka集群和行情延迟系统中均部署了网络时间同步服务ntp,行情延迟服务系统包括消费线程、生产者线程和延迟线程;
11.生产者线程与kafka集群连接,用于向kafka集群写入数据;
12.消费线程连接到kafka集群,用于设置需要消费的实时行情主题信息,同时,关闭消息读取后自动提交属性;
13.解码服务系统与kafka集群连接,用于对kafka集群的消息进行解码,生成实时行情消息数据;
14.消费线程与kafka集群连接,用于消费kafka集群中解码生成的实时行情消息数据;
15.延迟线程用于获取当前消息对应的时间t1,同时获取本地当前时间t2,判断t2-t1的值是否大于指定的延迟间隔,判断为是时,则将当前消息写入生产者消息队列,并通知生产者线程可读,判断为不是时,则延迟线程睡眠一定时间后,再重新获取本地当前时间t2’,并判断t2
’‑
t1的值是否大于指定的延迟间隔,如此循环,直至判断为是大于指定的延迟间隔时,则将当前消息写入生产者消息队列;然后获取下一条消息,循环处理;
16.生产者线程还用于从生产者消息队列读取消息,发送至kafka集群对应的延迟主题中,数据成功写入后,向kafka集群实时主题提交该条消息,确认该条消息处理完毕,提供给下游消费者使用。
17.本发明的有益效果是:通过流式系统的消息时间特性,实现与消息内容无关的通用延迟行情方案,支持任意流式消息格式的延迟;通过配置文件读取延迟间隔,满足各种时间延迟需要;并且通用的数据延迟方法,使得下游消费者在处理实时行情和延迟行情时,能够保持逻辑的一致性,无需代码调整,只需要通过配置消费对应的行情主题即可。
附图说明
18.附图1为本发明的一种基于流式系统的行情延迟方法的逻辑图。
19.附图2为本发明的一种基于流式系统的行情延迟方法的流程图。
具体实施方式
20.下面结合附图和实施例对本发明进一步说明。
21.以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整地描述,以充分地理解本发明的目的、特征和效果。显然,所描述的实施例只是本发明的一部分实施例,而不是全部实施例,基于本发明的实施例,本领域的技术人员在不付出创造性劳动的前提下所获得的其他实施例,均属于本发明保护的范围。另外,专利中涉及到的所有联接/连接关系,并非单指构件直接相接,而是指可根据具体实施情况,通过添加或减少联接辅件,来组成更优的联接结构。本发明创造中的各个技术特征,在不互相矛盾冲突的前提下可以交互组合。
22.参照图1,一种基于流式系统的行情延迟方法,包括以下的步骤:
23.s1、在kafka集群和行情延迟服务系统中部署网络时间同步服务ntp,由于消息延迟间隔基于时间完成,因此在运行kafka集群的多台机器与部署行情延迟服务的机器之间需要保证时间的一致性,因此需要部署网络时间同步服务ntp,所有机器的时间都与ntp服务器时间保持一致,ntp即network time protocol,一种网络时间协议,行情延迟服务系统包括消费线程、生产者线程和延迟线程;
24.s2、生产者线程向kafka集群写入数据,生产者线程也采用统一网络时间同步服务ntp;
25.生产者线程在向kafka集群写入数据时,每条消息都会关联一个时间戳,根据时间格式的不同,可以设置为生产者服务器时间,或者成功写入kafka集群的时间。本实施例中,生产者线程采用统一网络时间同步服务ntp,那么时间格式无特别要求,否则的话需要设置生产者产生的消息采用写入kafka集群时间,以保证行情延迟服务系统和消息写入时间的时间同步。
26.s3、启动单个消费线程,连接到kafka集群,设置需要消费的实时行情主题信息,同时,关闭消息读取后自动提交属性。
27.s4、解码服务系统对kafka集群的消息进行解码,生成实时行情消息数据,实时行情消息数据通过kafka集群被消费线程读取;
28.由于单个kafka主题通常存在多个分区,而且分区之间的时间进度可能不完全一致(即单个分区之间是顺序写入的,消息时间严格递增,但是多分区消息之间时间并不保证时间严格递增),因此行情延迟服务系统根据实时行情主题的分区数量,内部开辟对应数量的消息分区队列,消费线程将来自各分区的实时行情消息数据写入到相对应的消息分区队列中,每个消息分区队列关联一个延迟线程,通知对应的延迟线程可读,例如消费线程将来自第n个分区的实时行情消息数据写入到第n个消息分区队列中,并通知对应的第n个延迟线程读取。
29.延迟线程读取对应的消息分区队列,当所述消息分区队列为空时,相对应的延迟线程通过条件变量阻塞,直至消费线程向消息分区队列写入实时行情消息数据;当消息分区队列不为空时,则跳转至下一步骤s5。
30.s5、延迟线程获取当前消息对应的时间t1,同时获取本地当前时间t2,判断t2-t1的值是否大于指定的延迟间隔,判断为是时,则将当前消息写入生产者消息队列,并通知生产者线程可读,判断为不是时,则延迟线程睡眠一定时间(例如100ms)后,再重新获取本地
当前时间t2’,并判断t2
’‑
t1的值是否大于指定的延迟间隔,如此循环,直至判断为是大于指定的延迟间隔时,则将当前消息写入生产者消息队列,并通知生产者线程可读;然后获取下一条消息,循环处理。
31.s6、生产者线程从生产者消息队列读取满足延迟条件的消息,当生产者消息队列为空时,则通过条件变量阻塞,当生产者消息队列不为空时,生产者线程读取消息后发送至kafka集群对应的延迟主题(如果实时主题为t,那么延迟主题名称为t_delay),数据成功写入后,向kafka集群实时主题提交该条消息,确认该条消息处理完毕,提供给下游消费者使用。
32.由于行情延迟服务系统可能存在异常重启,因此必须等待该条消息被成功写入,生产者线程才能够确认提交,否则的话如果开启消费数据自动提交,那么队列中可能存在大量消息消费成功,但是并没有写入延迟主题。一旦行情延迟服务系统重启,又从实时行情topic最新偏移量开始消费,会有大量的数据出现丢失,从而出现行情缺失的问题。
33.通过以上方法,使得行情延迟服务系统在任何条件下都能够按照指定的延迟间隔,将来自实时行情主题的消息延迟写入到指定的延迟主题中,提供给其他下游消费者使用,而无需下游消费者全部都实现延迟逻辑。而且由于消息延迟基于kafka流式系统关联的消息时间,而与消息内容无关,因此任何写入kafka流式系统的数据都能够采用这种方式产生延迟行情,具有极强的通用性。
34.利用kafka流式消息系统的特性,通过单个消费线程消费实时行情实时主题数据,缓存本地,待达到指定延迟时间后再写入流式消息系统延迟主题;所有下游服务通过使用相同的逻辑分别消费实时主题和延迟主题的行情数据,便可以产生新的实时和延迟数据,无需本地延迟。
35.本发明还提供了一种基于流式系统的行情延迟系统,包括kafka集群、解码服务系统和行情延迟服务系统,kafka集群和行情延迟系统中均部署了网络时间同步服务ntp,行情延迟服务系统包括消费线程、生产者线程和延迟线程;
36.生产者线程与kafka集群连接,用于向kafka集群写入数据;
37.消费线程连接到kafka集群,用于设置需要消费的实时行情主题信息,同时,关闭消息读取后自动提交属性;
38.解码服务系统与kafka集群连接,用于对kafka集群的消息进行解码,生成实时行情消息数据;
39.消费线程与kafka集群连接,用于消费kafka集群中解码生成的实时行情消息数据;
40.延迟线程用于获取当前消息对应的时间t1,同时获取本地当前时间t2,判断t2-t1的值是否大于指定的延迟间隔,判断为是时,则将当前消息写入生产者消息队列,并通知生产者线程可读,判断为不是时,则延迟线程睡眠一定时间后,再重新获取本地当前时间t2’,并判断t2
’‑
t1的值是否大于指定的延迟间隔,如此循环,直至判断为是大于指定的延迟间隔时,则将当前消息写入生产者消息队列,并通知生产者线程可读;然后获取下一条消息,循环处理;
41.生产者线程还用于从生产者消息队列读取消息,发送至kafka集群对应的延迟主题中,数据成功写入后,向kafka集群实时主题提交该条消息,确认该条消息处理完毕,提供
给下游消费者使用。
42.本发明通过流式系统的消息时间特性,实现与消息内容无关的通用延迟行情方案,支持任意流式消息格式的延迟;通过配置文件读取延迟间隔,满足各种时间延迟需要;并且通用的数据延迟方法,使得下游消费者在处理实时行情和延迟行情时,能够保持逻辑的一致性,无需代码调整,只需要通过配置消费对应的行情主题即可。
43.以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。
再多了解一些

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

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

相关文献