数据传输方法、系统、服务器及计算机可读存储介质与流程

文档序号:19248324发布日期:2019-11-27 19:53阅读:162来源:国知局
数据传输方法、系统、服务器及计算机可读存储介质与流程
本发明涉及网络
技术领域
,特别是涉及一种数据传输方法、系统、服务器及计算机可读存储介质。
背景技术
:目前,长连接应用多采用单体架构,即整个项目代码都在同一个应用工程中。在单体应用架构下,服务端程序只部署在一个服务器中,且需要服务端程序的多个功能模块混杂在一起开发、测试和部署,就会导致不同功能之间相互影响。特别地,在单体应用架构下,服务端程序中与前端建立连接的服务程序和用于业务逻辑处理的服务程序存在较为严重的耦合。那么一旦后台的服务端程序需要重启,那么在服务重启期间,服务端程序则无法向前端提供任何服务,造成前端对服务的不可用。例如项目上线或项目升级时,需要对服务端程序进行重启,那么为了避免对前端用户的影响,部署人员只可以在服务的非工作时间来进行服务端程序的部署;此外,当服务端程序存在单点故障(例如项目中的后台的服务端程序中某个模块或功能出现故障)时,由于服务端程序的各个部分相互耦合严重,那么也将导致这个后台服务面向前端用户不可用的问题。另外,当前端用户数量激增时,则需要后端的服务程序支持较多的连接,则需要对服务端程序中与前端建立连接的服务程序扩展至多个,但是该与前端建立连接的服务程序是与用于业务逻辑处理的服务程序相互耦合的,那么将导致对用于业务逻辑处理的服务程序也扩展至多个,从而徒增成本,造成服务扩展性差的问题。因此,相关技术中单体应用的服务端程序普遍存在着服务可扩展性差、单点故障引起整个服务不可用,以及服务部署时间受限的问题。技术实现要素:本发明提供了一种数据传输方法、系统、服务器及计算机可读存储介质,以解决相关技术中单体应用的服务端程序所存在的服务可扩展性差、单点故障引起整个服务不可用,以及服务部署时间受限的问题。为了解决上述问题,根据本发明的一个方面,本发明公开了一种数据传输方法,应用于包括用于与客户端建立和保持连接的至少一个第一服务端和用于处理业务逻辑以及管理所述第一服务端的第二服务端的系统,其中,所述至少一个第一服务端与所述第二服务端通过消息中间件通信连接,所述方法包括:所述第二服务端接收待推送消息,所述待推送消息包括目标用户id和消息内容;所述第二服务端根据预先存储的用户id与通道id、第一服务端id之间的第一对应关系,获取与所述目标用户id对应的目标通道id和目标第一服务端id,其中,所述第一对应关系表示具有所述用户id的客户端与具有所述第一服务端id的第一服务端之间已建立有具有所述通道id的信息传输通道;所述第二服务端通过所述消息中间件,将所述目标通道id和所述消息内容,发送至第一服务端id为所述目标第一服务端id的目标第一服务端;所述目标第一服务端通过通道id为所述目标通道id的目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。根据本发明的另一方面,本发明还公开了一种数据传输系统,包括:与客户端建立和保持连接的至少一个第一服务端和用于处理业务逻辑以及管理所述第一服务端的第二服务端的系统,其中,所述至少一个第一服务端与所述第二服务端通过消息中间件通信连接;所述第二服务端,用于接收待推送消息,所述待推送消息包括目标用户id和消息内容;所述第二服务端,用于根据预先存储的用户id与通道id、第一服务端id之间的第一对应关系,获取与所述目标用户id对应的目标通道id和目标第一服务端id,其中,所述第一对应关系表示具有所述用户id的客户端与具有所述第一服务端id的第一服务端之间已建立有具有所述通道id的信息传输通道;所述第二服务端,用于通过所述消息中间件,将所述目标通道id和所述消息内容,发送至第一服务端id为所述目标第一服务端id的目标第一服务端;所述目标第一服务端,用于通过通道id为所述目标通道id的目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。根据本发明的又一方面,本发明还公开了一种服务器,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据传输程序,所述数据传输程序被所述处理器执行时实现如上述任意一项所述第一服务端或所述第二服务端所执行的数据传输方法的步骤。根据本发明的再一方面,本发明还公开了一种计算机可读存储介质,所述计算机可读存储介质上存储有数据传输程序,所述数据传输程序被处理器执行时实现如上述任意一项所述第一服务端或所述第二服务端所执行的数据传输方法中的步骤。与现有技术相比,本发明包括以下优点:在本发明实施例中,通过将提供服务的程序拆分为第一服务端和第二服务端,其中,第一服务端用于与客户端建立和保持连接,而第二服务端则用于处理业务逻辑,使得服务端程序中与前端建立连接的服务程序,和,用于业务逻辑处理的服务程序得到解耦;上述系统中支持部署多台第一服务端,那么如果其中一台或几台第一服务端出现故障导致无法提供服务,则可以采用其他第一服务端来提供连接服务,增加了服务提供连接的能力;那么当客户端的连接请求激增时,本发明实施例的方法可以通过增加第一服务端的数量,来迅速提高系统的服务能力,且不需要增加用于业务逻辑处理的第二服务端的数量,提升了服务的扩展性;另外,第一服务端和第二服务端之间通过消息中间件来通信,那么二者之间交互的消息则可以存储在消息中间件中,使得存储在消息中间件中的消息只要不被消息处理者处理,那么消息可以一直保存在消息中间件的消息队列中,使得即便第二服务端出现故障,也不影响客户端对本发明实施例的系统的使用,客户端仍旧可以继续通过第一服务端来发送消息,本发明实施例的系统可以将该消息存储在消息中间件中,来等待恢复服务后的第二服务端来处理。因此,不论第一服务端出现故障还是第二服务端出现故障,本发明实施例的系统都可以继续向客户端提供服务,解决了单点故障的问题;而且,由于消息缓存在消息中间件中,那么第二服务端可以在任意时间来重启,也不会影响客户端对服务的使用,使得服务部署时间不受限制,从而提高新需求上线的部署效率;而且,第一服务端和第二服务端之间通过消息中间件来通信连接,那么消息处理者暂时处理不过来的消息都可以积压在消息中间件中,从而可以实现流量消峰。附图说明图1是本发明的一种数据传输系统实施例的架构图;图2是本发明的一种数据传输方法实施例的步骤流程图;图3是本发明的另一种数据传输方法实施例的步骤流程图;图4是本发明的另一种数据传输系统实施例的架构图。具体实施方式为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。参照图1,示出了本发明的一种数据传输系统实施例的架构图。该系统具体可以包括:至少一个第一服务端,用于与客户端建立和保持连接;第二服务端,用于处理业务逻辑,其中,所述至少一个第一服务端与所述第二服务端通过消息中间件通信连接。其中,对于任意一个第一服务端而言,虽然图1只示出了与其连接的一个客户端,但是,一个第一服务端可以同时与多个客户端建立和保持连接。另外,该第二服务端还可以用于对所述连接的管理。在本发明实施例的系统中,通过将提供服务的程序拆分为第一服务端和第二服务端,其中,第一服务端用于与客户端建立和保持连接,而第二服务端则用于处理业务逻辑以及管理第一服务端。使得服务端程序中与前端建立连接的服务程序,和,用于业务逻辑处理的服务程序得到解耦。并且,上述系统中支持部署多台第一服务端,那么如果其中一台或几台第一服务端出现故障导致无法提供服务,则可以采用其他第一服务端来提供连接服务;那么当客户端的连接请求激增时,本发明实施例的方法可以通过增加第一服务端的数量,来迅速提高系统的服务能力,且不需要增加用于业务逻辑处理的第二服务端的数量,提升了服务的扩展性;而且,第一服务端和第二服务端之间通过消息中间件来通信连接,那么消费者(即消息处理者)暂时处理不过来的消息都可以积压在消息中间件的消息队列中,从而可以实现流量消峰。可选地,在一个实施例中,本发明可以使用java结合netty来实现的与客户端建立连接的第一服务端(下文称connector),在应用场景中,由于与第一服务端连接的客户端可以是用户为公众用户的客户端,也可以是用户为客服人员的客户端,那么可以将面向个人用户的第一服务端称为user-connector,将面向客服的第一服务端称为service-connector,以及使用java开发第二服务端(下文称manager)。参照图2,示出了图1所示的系统在执行数据传输方法的一个步骤流程图,图2主要描述该系统与客户端之间建立连接的流程,在本实施例中,该数据传输方法可以包括如下步骤:步骤101,所述第一服务端接收所述客户端的连接请求,其中,所述连接请求包括客户端的用户id;其中,在上述系统启动之后,manager的整个服务处于就绪状态;而connector启动后,就可以为该connector生成全局唯一id作为其生命周期唯一标识,即这里的第一服务端id(下文称connectorid)。客户端可以向任意一个connector(例如这里为connector1,该connector1的id为connectorid1)发起建立连接的请求,且该连接请求中携带有该客户端的用户id信息,例如这里的客户端的用户1的id为用户id1。那么本步骤中的connector1就可以接收到客户端的连接请求。需要说明的是,一个connector就可以与多个客户端保持连接,采用netty框架的每个connector最多可以和百万级的客户端同时保持连接。其中,该连接请求的协议可以是websocket(基于tcp的全双工通信协议),还可以是其他已知或未来开发的长连接协议。步骤102,所述第一服务端响应于所述连接请求,建立与所述客户端之间的信息传输通道,并为所述信息传输通道生成通道id;其中,connector1可以响应于该连接请求,来建立该客户端与connector1之间的信息传输通道(后文称channel),其中,可以对每个channel分配唯一id,下文称channelid,以区分不同的channel。该客户端与connector1之间的channel为channel1,其id为channelid1。步骤103,所述第一服务端将所述连接请求中的所述用户id、所述第一服务端的第一服务端id、所述信息传输通道的通道id,通过消息中间件发送至所述第二服务端;其中,connector1可以从步骤101中的连接请求中提取出该客户端的用户id,这里为用户id1。另外,connector1在启动时,即被分配了唯一的第一服务端id(这里为connectorid1),因此,connector1可以将该用户id1、connectorid1、channelid1以一条消息的方式,通过消息中间件来发送至manager。可选地,该消息中间件可以是activemq(apacheactivemq),activemq是apache软件基金会所研发的开放源代码消息中间件;由于activemq是一个纯java程序,因此只需要操作系统支持java虚拟机,activemq便可执行。其中,消息中间件可以包括消息队列、消息选择器、topic(一种提供多个订阅者消费消息的一种机制)等。以消息中间件为activemq为例,connector1可以将该消息写入activemq的queue(activemq的专有名词,消息队列)中,由manager通过监听该queue,来读取该消息,从而使得manager从消息中间件接收到携带有用户id1、connectorid1、channelid1的消息。步骤104,所述第二服务端生成所述用户id与所述通道id、所述第一服务端id之间的第一对应关系并保存。其中,manager可以将接收到的消息中的内容以用户id为键(key),以connectorid、channelid共同作为值(value)(例如键值对为{userid,connectorid+channelid})来保存到本地,或者保存到存储服务器(例如信息传输系统中的存储系统)。其中,存储服务器与第二服务端连接。优选将{userid,connectorid+channelid}保存至存储系统,以防manager重启时造成数据丢失)(图1未示出)中。本例中,则可以保存以用户id1为key,以connectorid1和channelid1为value,来保存所述用户id与所述通道id、所述第一服务端id之间的第一对应关系。例如该第一对应关系的存储结构如表1所示:keyvalue用户id1connectorid1、channelid1表1对于上述传输系统中的任意一个connector,其都可以与多个客户端建立连接,但是一个客户端同时只可以与一个connector连接,且本发明实施例的传输系统可以包括多个connector,那么表1中的记录并不仅仅限于上述列举的与connector1连接的客户端对应的key为用户id1的一条记录,而是可以包括与系统中任意一个connector已建立连接的客户端的记录,且每个已连接的客户端都对应一条记录,而每个connector则可以对应多条记录。其中,以用户id为key,可实现每个用户id与connector至多只有1个已建立的连接,因为用户id通常是唯一的根据用户id唯一就可保证该用户id在存储系统中所属的第一对应关系的唯一。以在线客服举例,通常我们只希望一个用户和一个客服保持对话,如果一个用户与多个客服保持了连接,会导致消息混杂在一块等复杂情况。在本发明实施例中,不仅每个第一服务端可以各自保存各自的信息传输通道的id信息,而且,第二服务端还可以统一保存该系统中所有第一服务端对应的信息传输通道的id信息,实现了第二服务端对所有第一服务端上的所有信息传输通道的id信息的统一管理和保存,例如通过统计第一对应关系的数量,来确定连接数量。在本发明的实施例中,步骤102之后,该方法还可以包括:步骤105,所述第一服务端建立所述信息传输通道的通道id与所述信息传输通道之间的第二对应关系;步骤106,所述第一服务端将所述第二对应关系缓存至内存。其中,connector1可以将{channelid:channel}键值对的关系,缓存到该connector1的内存中。这里,将保存channelid1与channel1的键值对关系。在本发明实施例中,通过在第一服务端的内存中保存对客户端所建立的连接的通道的第二对应关系,那么在第一服务端需要向该客户端发送消息时,则可以利用与该客户端关联的channelid,来从缓存的第二对应关系中准确的查找到与该channelid关联的channel。即,找到与该客户端连接的通道,以实现消息的准确推送。参照图3,示出了图1所示的系统在执行数据传输方法的一个步骤流程图,图3主要描述在该系统与客户端建立连接之后,该系统向客户端进行消息推送的流程,在本实施例中,在图1和图2的基础上,该数据传输方法还可以包括如下步骤:步骤201,所述第二服务端接收待推送消息,所述待推送消息包括目标用户id和消息内容;其中,该待推送消息可以是传输系统中的任意一个connector通过消息中间件发送给manager的消息。例如service-connector想要向某个user-connector发送消息,则service-connector可以将待推送消息发送至manager,manager再将该待推送消息发送给user-connector。例如本发明实施例的系统可以应用到人工客服场景下的面向用户一侧的排队服务器,或者,面向客服一侧的转交服务器,其中,转交服务器主要用于将针对某个用户的消息在不同客服客户端之间转交,例如a客服接入用户c后,因为一些原因需要交由b客服来服务。这里以人工客服的排队场景为例,如图4示出了本发明实施例的系统应用到人工客服的排队场景下,由于客户端可以包括用户为公众用户的用户客户端,和用户为客服的客服客户端,因此,图4将图1中的两个第一服务端,分别以与用户1客户端连接的用户服务端(后文称user-connector)和与客服1客户端连接的客服服务端(后文称service-connector)命名来示出。此外,图4中还示出了图1未示出的上文提到的存储系统,该存储系统可以是redis(redis是一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库)存储系统。其中,存储系统与第二服务端通信连接,存储系统用于存储来自第二服务端的{userid,connectorid+channelid}。关于图4中的各个部分与图1类似,因此,这里不作赘述。以人工客服的排队场景为例,例如图4中的客服1客户端与service-connector已建立并保持连接,例如客服1想要向用户1发送一条“您好,请问需要什么帮助?”,那么消息就是一条待推送消息。那么,该service-connector可以从客服1客户端接收到一条待推送消息,该待推送消息包括源id(这里为该客服1客户端的客服id1)和目标id(这里为上述用户1的用户id1)以及消息内容(“您好,请问需要什么帮助?)。service-connector可以将该待推送消息通过消息中间件发送至manager。这里service-connector将待推送消息通过消息中间件发送至manager的过程的具体实现可以参照上述步骤103的具体实现,二者的原理是类似的,区别仅仅在于传输的消息所携带的内容不同,这里待推送消息所携带的内容包括源id、目标id和消息内容;而上述步骤103中所传输的消息所携带的内容则包括上述用户id、第一服务端id、通道id。那么本步骤中,manager就可以通过消息中间件接收到该待推送消息。步骤202,所述第二服务端根据预先存储的用户id与通道id、第一服务端id之间的第一对应关系,获取与所述目标用户id对应的目标通道id和目标第一服务端id。其中,所述第一对应关系表示具有所述用户id的客户端与具有所述第一服务端id的第一服务端之间已建立有具有所述通道id的信息传输通道;结合上述图2实施例,步骤202中的该第一对应关系即为上述步骤104所生成的第一对应关系,例如表1所示的数据表。以上述表1中的一条记录举例,则表示具有用户id1的客户端与具有connectorid1的connector1之间一建立有具有channelid1的channel1。那么本步骤中,例如如图4所示,manager可以从存储系统中的表1中,来获取与用户id1对应的channelid(这里为channelid1),以及与用户id1对应的connectorid(这里为connectorid1)。当manger根据用户id推送消息时,manager可以从存储系统中查找出connectorid+channelid信息,进而根据connectorid确定连接所在的connector,根据channelid确定已建立的websocket长连接的channel。以在线客服举例,根据用户id查询出connectorid+channelid,然后根据connectorid确定用户id对应的客户端与哪个connector服务器保持websocket长连接,然后再根据channelid到那台connector上找到channel,就可以通过channel将信息推送给该客户端。步骤203,所述第二服务端通过所述消息中间件,将所述目标通道id和所述消息内容,发送至第一服务端id为所述目标第一服务端id的目标第一服务端;例如,manager可以将channelid1和消息内容(您好,请问需要什么帮助?”)发送至connectorid为connectorid1的目标connector,这里的目标connector为图4所示的user-connector(其中,其connectorid为connectorid1)。可选地,在执行步骤203时,所述第二服务端可以通过所述消息中间件发送广播通知,其中,所述广播通知包括所述目标通道id和所述消息内容,并将所述目标第一服务端id设置为所述广播通知的消息选择器),以使第一服务端id为所述目标第一服务端id接收所述广播通知。以消息中间件为activemq为例来说明消息选择器、topic的使用过程,manager可以将该消息内容和channelid1发送给activemq的topic(topic为activemq的专有名词,中文名为发布订阅消息),以将channelid1和所述消息内容作为广播通知;并将connectorid1设置为activemq的selector(selector为activemq的专有名词,中文名为消息选择器),以将connectorid1设置为广播通知的消息选择器,从而可以将该消息内容和channelid1定向发送给connector1(其中,selector可保证只有id与connectorid1相同的connector才可以收到topic内的数据(这里为该消息内容和channelid1)。在本发明实施例中,每个connector有其唯一id,其中,每个connector的唯一id的生成规则为随机生成,例如采用java中的uuid,connector程序在重启后会生成一个新的uuid值,使得每次connector重启后,其id都会随机生成。另外,在connector重启之前(例如该connector重启之前id为1)由connector发送给manager的消息,在该connector重启之后(例如该connector重启之后id为2)就会失效(虽然manager还会给id为1的connector推送消息,但是,由于该connector的id已经变为2,因此,该推送消息已经没有对应的接收方了),因为重启前connector和用户端的websocket连接已经断开,所以再向其推送也没有意义。对此通常做法是:作为用户侧的前端在发现websocket断开后,会尝试重新连接第一服务器connector,试图建立新的连接,如果这时连接建立,则新的{userid,connectorid+channelid}通知到manager,进而替换掉存储系统中旧的userid对应的键值对,此时如果manager要推送消息时,就会推送到新的connector上),那么manager在推送消息时,则可以利用广播通知来将推送消息定向发送至connectorid与广播通知的selector一致的connector上,实现第二服务端向第一服务端的消息定向推送。步骤204,所述目标第一服务端通过通道id为所述目标通道id的目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。其中,这里connector1(也即user-connector)接收到消息内容以及channelid1,由于每个channel的id都是唯一的,因此,connector1可以基于该channelid1来确定目标channel,从而将该消息内容通过该目标channel发送出去。由于每个客户端都通过唯一的一个channel来与connector保持连接,因此,该目标channel所连接的客户端即为待推送消息中所携带的目标用户id,即用户id1的客户端。在本发明实施例中,通过将提供服务的程序拆分为第一服务端和第二服务端,其中,第一服务端用于与客户端建立和保持连接,而第二服务端则用于处理业务逻辑,使得服务端程序中与前端建立连接的服务程序,和,用于业务逻辑处理的服务程序得到解耦;上述系统中支持部署多台第一服务端,那么如果其中一台或几台第一服务端挂掉,则可以采用其他第一服务端来提供连接服务,增加了服务提供连接的能力。例如每个第一服务端最多可以保持百万个长连接,那么通过部署n台第一服务端,则本发明实施例的系统所支持的连接数量就变成了该百万数量的n倍;那么当客户端的连接请求激增时,本发明实施例的方法可以通过增加第一服务端的数量,来迅速提高系统的服务能力,且不需要增加用于业务逻辑处理的第二服务端的数量,提升了服务的扩展性;另外,第一服务端和第二服务端之间通过消息中间件来通信,那么二者之间交互的消息则可以存储在消息中间件中,使得存储在消息中间件中的消息只要不被消费者(当消息发送者为与第一服务端连接的前端时,则消费者为第二服务端;当消息发送者为第二服务端时,则消费者为第一服务端)处理(或者说消费),那么消息可以一直保存在消息中间件中,也即消息队列中,使得即便第二服务端出现故障,也不影响客户端对本发明实施例的系统的使用,客户端仍旧可以继续通过第一服务端来发送消息,本发明实施例的系统可以将该消息存储在消息中间件中,来等待恢复服务后的第二服务端来处理。通过上述描述可以看出,不论第一服务端出现故障还是第二服务端出现故障,本发明实施例的系统都可以继续向客户端提供服务,解决了单点故障的问题;而且,由于消息缓存在消息中间件中,那么第二服务端可以在任意时间来重启,也不会影响客户端对服务的使用,从而提高新需求上线的部署效率;而且,第一服务端和第二服务端之间通过消息中间件来通信连接,那么消费者暂时处理不过来的消息都可以积压在消息中间件中,从而可以实现流量消峰。并且,本发明实施例的方法通过预先将已建立连接的多个connector上的channelid统一维护在了第二服务端或者存储系统中,从而使得第二服务端可以准确的获取每个channelid对应的用户id,以及获取channelid对应的channel连接在哪个connector上,从而可以进行准确的消息推送。可选地,当执行图2所示的建立连接的流程时,如果目标第一服务端已执行上述步骤105,即connector1在内存中缓存有channelid1与channel1的键值对关系(即第二对应关系),那么在本实施例中,在connector1在执行步骤204时,所述目标第一服务端可以根据目标第一服务端在执行步骤105时所保存的第二对应关系,识别与接收到的目标通道id对应的目标信息传输通道;然后,所述目标第一服务端通过所述目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。其中,connector1可以从上述键值对关系中,识别与接收到的channelid1对应的channel1,然后,connector1通过该channel1来将消息内容发送至用户1对应的客户端。从而实现客服1向用户1发送一条“您好,请问需要什么帮助?”的消息的目的。在本发明实施例中,对于负责进行客户端连接的第一服务端,通过在建立连接之后,在内存中保存{channelid:channel}的键值对关系,从而可以在需要使用channel的时候,能够根据channelid而找到指定的channel,确保了消息能够推送至准确的客户端。另外,对于上述实施例描述的关于将本发明实施例的方法/系统应用到客服排队场景中,当需要进行客服询问的用户数量激增时,本发明实施例的方法可以通过部署多台第一服务端,来提升客户端连接性能;另外,不论是用户待发送至客服的消息还是客服待发送至用户的消息,当消息数量较多时,本发明实施例的方法都可以将消息暂存在消息中间件中,来等待第二服务端来进行业务逻辑处理,实现了客户端连接与业务处理的异步处理。需要说明的是,一个connector可以有非常多的channel,可多达上百万;而netty可以确保不同connector的channel是不同的,且不同的channel的channelid也不同。通常来讲,每个connector和每个用户的手机建立的通道都是不一样的,即使是相同的两方,在断开重新建立连接之后,两次连接所使用的channel也是不同的。此外,上述方法中所述的用户id为客户端的用户id,那么当该客户端的用户为客服时,则该用户id为客服id,当该客户端的用户为公众用户时,则该用户id为该公众用户id。如上文所述,第一服务端和第二服务端之间通过消息中间件来通信,当消息发送者为与第一服务端连接的前端时,则消费者为第二服务端;当消息发送者为第二服务端时,则消费者为第一服务端。其中,第一服务端向第二服务端发送采用的是queue,其具有保存消息的功能,直到消费者消费为止;那么即便第二服务端出现故障,也不影响客户端对本发明实施例的系统的使用,客户端仍旧可以继续通过第一服务端来发送消息,本发明实施例的系统可以将该消息存储在消息中间件的queue中,来等待恢复服务后的第二服务端来处理,解决了单点故障的问题;而且,由于消息缓存在消息中间件的queue中,那么第二服务端可以在任意时间来重启,也不会影响客户端对服务的使用,从而提高新需求上线的部署效率。而在本发明实施例中,第二服务端向第一服务端发送采用的是消息中间件的topic,topic不具备保存消息的功能,原因有二:原因1、第二服务端以广播通知结合selector的方式将消息发送给指定的第一服务端,如果对应的第一服务端处于存活状态,那么该第一服务端会监听到此消息,如果其监听不到消息,那么通常来讲是其服务挂掉了,即使其重启了,该第一服务器的id也不是重启前的connectorid了,所以第二服务器向该旧的connectorid所发送的消息对该第一服务器没用了,且在第一服务器挂掉之前旧的connector上保持的客户端连接也断开了,所以这种情况下来自第二服务端的推送消息丢失也是正常的做法。所以topic不需要保存该待推送消息。原因2、如果第二服务器采用queue这种数据结构存储通知给多个第一服务端,如第二服务端先后发送给connector1、connector1、connector2三条消息,如connector1消费不及时,则会影响到connector2接收消息,故第二服务端发送给第一服务端时采用topic方式,而不采用queue的方式。需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。与上述本发明实施例所提供的方法相对应,参照图1,示出了本发明一种数据传输系统实施例的结构框图,具体可以包括与客户端建立和保持连接的至少一个第一服务端(这里示出了三个第一服务端,以及与每个第一服务端连接的不同客户端)和用于处理业务逻辑以及管理所述第一服务端的第二服务端的系统,其中,所述至少一个第一服务端与所述第二服务端通过消息中间件通信连接;所述第二服务端,用于接收待推送消息,所述待推送消息包括目标用户id和消息内容;所述第二服务端,用于根据预先存储的用户id与通道id、第一服务端id之间的第一对应关系,获取与所述目标用户id对应的目标通道id和目标第一服务端id,其中,所述第一对应关系表示具有所述用户id的客户端与具有所述第一服务端id的第一服务端之间已建立有具有所述通道id的信息传输通道;所述第二服务端,用于通过所述消息中间件,将所述目标通道id和所述消息内容,发送至第一服务端id为所述目标第一服务端id的目标第一服务端;所述目标第一服务端,用于通过通道id为所述目标通道id的目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。可选地,所述第一服务端,用于接收所述客户端的连接请求,其中,所述连接请求包括客户端的用户id;其中,该第一服务端为所述至少一个第一服务端中的一个第一服务端。所述第一服务端,用于响应于所述连接请求,建立与所述客户端之间的信息传输通道,并为所述信息传输通道生成通道id;所述第一服务端,用于将所述连接请求中的所述用户id、所述第一服务端的第一服务端id、所述信息传输通道的通道id,通过消息中间件发送至所述第二服务端;所述第二服务端,用于生成所述用户id与所述通道id、所述第一服务端id之间的第一对应关系并保存。可选地,所述第一服务端,用于建立所述信息传输通道的通道id与所述信息传输通道之间的第二对应关系;所述第一服务端,用于将所述第二对应关系缓存至内存;所述目标第一服务端,用于根据所述第二对应关系,识别与接收到的目标通道id对应的目标信息传输通道;所述目标第一服务端,用于通过所述目标信息传输通道,将所述消息内容推送至用户id为所述目标用户id的客户端。可选地,所述数据传输系统还包括存储服务器(未示出);所述第二服务端,用于将所述第一对应关系保存至所述存储服务器。可选地,所述第二服务端,用于通过所述消息中间件发送广播通知,其中,所述广播通知包括所述目标通道id和所述消息内容,并将所述目标第一服务端id设置为所述广播通知的消息选择器,以使第一服务端id为所述目标第一服务端id接收所述广播通知。对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。根据本发明的又一个实施例,本发明还提供了一种服务器,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的数据传输程序,所述数据传输程序被所述处理器执行时实现如上述任意一个实施例所述的第一服务端或第二服务端所执行的数据传输方法的步骤。根据本发明的再一个实施例,本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有数据传输程序,所述数据传输程序被处理器执行时实现如上述任意一个实施例所述的第一服务端或第二服务端所执行的数据传输方法中的步骤。本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。以上对本发明所提供的一种数据传输方法、一种数据传输装置、一种服务器、一种计算机可读存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1