基于Go语言的实时长连接方法及装置制造方法及图纸

技术编号:21089207 阅读:58 留言:0更新日期:2019-05-11 09:50
本公开实施例中提供了一种基于Go语言的实时长连接方法、装置及电子设备,属于数据处理技术领域,该方法包括:在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。通过本公开的方案,提高了长连接的效率。

【技术实现步骤摘要】
基于Go语言的实时长连接方法及装置
本公开涉及数据处理
,尤其涉及一种基于Go语言的实时长连接方法、装置及电子设备。
技术介绍
网络是互联网的载体,网络由无数节点组成,节点与节点之间通信模式分为两种:一种是短连接模式,由一端发起请求建立连接,另一端接收请求,一问一答之后完成交互释放连接;另一种是长连接模式,端与端之间建立请求之后,便通过心跳维持一条连接链路,两端随时进行数据交互。股票实时行情具有数据量大、实时性要求高等特点,为了追求行情数据的实效性,股票应用中实时行情多采用客户端与服务端建立长连接方案,因此服务端需要维护一个连接池,将这些长连接有效的管理起来,既要方便具体长连接的查找,又要保证性能。Go语言是近些年炙手可热的开发语言,但是Go语言的map是非并发(non-concurrent)的,多个线程同时读写map便会引发服务崩溃,虽然Go1.9引入了可并发的sync.map,但是其底层的实现是基于双map实现的,比较浪费内存空间,并且不适用于读写频繁的场景。因此,常规操作都是在map上引入读写锁,将map作为临界资源来解决并发问题。锁的引入不可避免的会降低整个数据流的实时推送性能,而股票app的行情速度是各家商品的最重要的比拼指标,只能快不能慢,因此空间和时间上很难找到一个好的平衡。为此,亟需一种全新的基于Go语言的无锁化实时长连接解决方案。
技术实现思路
有鉴于此,本公开实施例提供一种基于Go语言的实时长连接方法、装置及电子设备,至少部分解决现有技术中存在的问题。第一方面,本公开实施例提供了一种基于Go语言的实时长连接方法,包括:在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。根据本公开实施例的一种具体实现方式,在连接层设置与长连接请求服务相关的连接对象包括:获取客户端与服务端的长连接请求,基于所述长连接请求在所述连接层建立所述连接对象。根据本公开实施例的一种具体实现方式,所述通道对象与所述客户端的长连接请求对象相对应,每个通道对象维护一个连接列表,用于表示订阅所述请求对象行情的连接对象,所述通道通过增加连接或删除连接的方式增加或删除表示请求对象行情的连接对象。根据本公开实施例的一种具体实现方式,所述池对象用来管理所有的通道对象,待推送数据通过池对象来寻找对应的通道对象,通过所述通道对象将所述待推送数据向客户端进行推送。根据本公开实施例的一种具体实现方式,所述基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间,包括:在所述池对象上为所述长连接请求申请预设长度的固定数组,所述固定数组的每个元素为一个指针地址,该指针地址表示该请求对象对应的通道地址。根据本公开实施例的一种具体实现方式,所述为所述请求对象建立映射到相应通道的索引,包括:建立以所述请求对象的代码为索引的索引函数;基于所述请求对象的代码,映射所述请求对象对应的通道。根据本公开实施例的一种具体实现方式,所述通过原子变量的方式对来自所述请求对象的数据请求进行并发控制,包括:在所述通道对象内部通过原子变量的方式进行并发控制,获取通道对象中的连接对象进行变更前的原子变量值a’及变更后的原子变量值a,数据更新完毕之后,比较a与a’,如果二者相等,则直接通过数据覆盖的方式对a进行原子递增。根据本公开实施例的一种具体实现方式,所述方法还包括:在所述连接对象中定义回调函数,当所述连接对象收到来自客户端的上行指令消息时,调用预先设置的客户端回调函数,当在所述连接对象内部收到用户退出消息时,直接调用退出回调函数。第二方面,本公开实施例提供了一种基于Go语言的实时长连接装置,包括:设置模块,用于在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;初始化模块,用于基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;映射模块,用于基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;控制模块,用于在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。第三方面,本公开实施例还提供了一种电子设备,该电子设备包括:至少一个处理器;以及,与该至少一个处理器通信连接的存储器;其中,该存储器存储有可被该至少一个处理器执行的指令,该指令被该至少一个处理器执行,以使该至少一个处理器能够执行前述任第一方面或第一方面的任一实现方式中的基于Go语言的实时长连接方法。第四方面,本公开实施例还提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质存储计算机指令,该计算机指令用于使该计算机执行前述第一方面或第一方面的任一实现方式中的基于Go语言的实时长连接方法。第五方面,本公开实施例还提供了一种计算机程序产品,该计算机程序产品包括存储在非暂态计算机可读存储介质上的计算程序,该计算机程序包括程序指令,当该程序指令被计算机执行时,使该计算机执行前述第一方面或第一方面的任一实现方式中的基于Go语言的实时长连接方法。本公开实施例中的基于Go语言的无锁化实时长连接方案,包括在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。通过本公开的方案,在Go语言下通过无锁化的方式来管理长连接池,使之能够在少许空间的基础上换取一个好的性能效果,采用本技术方案能够使股票的行情以尽可能快的速度最快推出。附图说明为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1为本公开实施例提供的一种基于Go语言的无锁化实时长连接流程示意图;图2为本公开实施例提供的一种通过原子变量的方式对来自请求对象的数据请求进行并发控制的流程示意图;图3为本公开实施例提供的一种通过回调函数进行数据处理的流程示意图;图4为本公开实施例提供的基于Go语言的无锁化实时长连接装置结构示意图;图5为本公开实施例提供的电子设备示意图。具体实施方式下面结合附图对本公开实施例进行详细描述。以下通过特定的具体实例说明本公开的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本公开的其他优点与功效。显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。本公开还可以通过另外不同的具体实施方本文档来自技高网...

【技术保护点】
1.一种基于Go语言的实时长连接方法,其特征在于,包括:在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。

【技术特征摘要】
1.一种基于Go语言的实时长连接方法,其特征在于,包括:在连接层设置与长连接请求服务相关的连接对象、通道对象及池对象;基于长连接服务的启动,初始化所述通道对象和池对象,并基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间;基于所述长连接请求对象的代码,为所述请求对象建立映射到相应通道的索引,所述索引存储在为所述池对象申请的预设长度的地址空间中;在每个通道的内部,通过原子变量的方式对来自所述请求对象的数据请求进行并发控制。2.根据权利要求1所述的方法,其特征在于,在连接层设置与长连接请求服务相关的连接对象包括:获取客户端与服务端的长连接请求,基于所述长连接请求在所述连接层建立所述连接对象。3.根据权利要求2所述的方法,其特征在于:所述通道对象与所述客户端的长连接请求对象相对应,每个通道对象维护一个连接列表,用于表示订阅所述请求对象行情的连接对象,所述通道通过增加连接或删除连接的方式增加或删除表示请求对象行情的连接对象。4.根据权利要求3所述的方法,其特征在于:所述池对象用来管理所有的通道对象,待推送数据通过池对象来寻找对应的通道对象,通过所述通道对象将所述待推送数据向客户端进行推送。5.根据权利要求1所述的方法,其特征在于,所述基于所述长连接请求对象的数目在内存中为所述池对象申请预设长度的地址空间,包括:在所述池对象上为所述长连接请求申请预设长度的固定数组,所述固定数组的每个元素为一个指针地址,该指针地址表示该请求对象对应的通道地址。6.根据权利要求1所述的方法,其特征在于,所述为所述请求对象建立映射到相应通道的索引,包括:建立以所述请求对象的代码为索引的索引函...

【专利技术属性】
技术研发人员:宋增宽吴英强
申请(专利权)人:北京字节跳动网络技术有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1