博亚体育 博亚体育官方入口博亚体育 博亚体育官方入口本发明涉及分布式数据处理技术领域,特别涉及一种分布式数据服务的处理方法、系统、设备及存储介质。
随着信息技术的快速发展,用户提交的写数据如订单、评论等数据请求显得异常珍贵。但是随着业务复杂度增加,数据库的复杂程度和依赖的外部接口也会逐步增加。系统在流量增加和复杂度增加的场景下,更加需要保证接口性能和高可用性。
目前大部分数据服务的处理系统是在应用服务器中直接将数据写入数据库,或者为了保证性能就将数据先存入mysql(一种关系型数据库管理系统)宽表或者缓存中,然后再发送异步消息到mq(messagequeue,消息队列),由后端服务进行异步处理来将mq中的数据写入数据库中,但该异步处理方式,由于异步消息的发送方无法获取异步处理的结果,也无法确定后端服务是否已正确地将数据入库,所以容易造成数据丢失。因此,在将数据存储到分布式缓存或者数据库中,还存在以下不足:当数据库表关系比较复杂时,服务性能会降低;当网络抖动或者存储服务器不可用时,就会造成写服务不可用;在系统依赖外部接口中,当外部接口响应变慢或者不可用时也会影响系统整体性能。
本发明要解决的技术问题是为了克服现有技术中由于数据读写系统对外部组件如数据库、外部接口等存在较强依赖,使得系统性能易受到外部组件的运行性能影响,并容易出现数据丢失的缺陷,提供一种分布式数据服务的处理方法、系统、设备及存储介质。
应用服务模块接收客户端发起的写数据服务请求,并从所述写数据服务请求中获取业务数据;
所述应用服务模块在所述业务数据中增加同步状态字段,并初始化所述同步状态字段;
所述应用服务模块生成所述业务数据的全局id(identifier,标识),并将所述全局id增加到所述业务数据中;
所述应用服务模块将已加入所述同步状态字段和所述全局id的所述业务数据作为目标业务数据分别异步存入分布式缓存和本地存储器,以及将所述目标业务数据作为异步消息向消息队列发送;
异步服务模块监听所述消息队列,并在监听到异步消息后,从所述异步消息中获取出所述目标业务数据,将所述目标业务数据异步写入关系型数据库中,并在写入完成后将所述目标业务数据中的同步状态字段的内容进行更新,及将已更新所述同步状态字段的所述目标业务数据更新到所述分布式缓存中,所述异步服务模块具有幂等性;
工作进程模块(即worker模块)定时读取所述本地存储器中的目标业务数据,根据读取到的所述目标业务数据的全局id读取所述分布式缓存中的缓存数据,判断所读取到的所述缓存数据的同步状态字段是否已更新,若是则删除所述本地存储器中的所述目标业务数据,若否则将所述本地存储器中的所述目标业务数据作为异步消息向所述消息队列发送。
本方案中,根据设计需要,可以先将同步状态字段增加到业务数据中,然后再将全局id增加到业务数据中,也可以先将全局id增加到业务数据中,然后再将同步状态字段增加到业务数据中;消息队列可优选activemq(一种消息队列)或rabbitmq(一种消息队列);关系型数据库可优选mysql。
较佳地,在所述应用服务模块将所述目标业务数据异步发送到所述消息队列失败时,所述分布式数据服务的处理方法还包括:
所述异步服务模块还监听所述第一远程调用异步请求,并在监听到所述第一远程调用异步请求后,从所述第一远程调用异步请求中获取出所述目标业务数据。
较佳地,在所述应用服务模块将所述目标业务数据异步发送到消息队列时,当所述目标业务数据积压量超过预设阈值时,所述分布式数据服务的处理方法还包括:
所述异步服务模块还监听所述第二远程调用异步请求,并在监听到所述第二远程调用异步请求后,从所述第二远程调用异步请求中获取出所述目标业务数据。
较佳地,所述分布式缓存包括redis(一个开源的使用ansic语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api(应用程序编程接口))存储系统;
在所述应用服务模块将所述目标业务数据异步存入所述分布式缓存前和异步发送到所述消息队列前,所述应用服务模块将所述目标业务数据进行序列化生成字符串,所述redis存储系统中的缓冲数据的key值为所述目标业务数据中的全局id,所述redis存储系统中的缓冲数据的value值为所述字符串,所述消息队列中的消息体为所述字符串;
在所述异步服务模块从所述异步消息中获取所述目标业务数据时,所述异步服务模块先将所述异步消息反序列化后再获取所述目标业务数据。
较佳地,在所述应用服务模块将所述目标业务数据异步存入所述本地存储器的步骤中,所述应用服务模块将每一预设时间段的所述写数据服务请求的所述目标业务数据形成一个本地文件并异步存入所述本地存储器;
所述工作进程模块通过读取所述本地存储器中的本地文件获取所述目标业务数据,还判断所读取到的所述缓存数据的同步状态字段是否均已更新,若是则删除所述本地文件,若否则将所述同步状态字段未更新的所述缓存数据中的业务数据异步发送到所述消息队列。
较佳地,所述分布式数据服务的处理方法还包括:所述应用服务模块接收客户端发起的读数据服务请求,根据所述读数据服务请求从所述分布式缓存读取数据,并将所读取的数据返回所述客户端。
较佳地,在根据所述读数据服务请求从所述分布式缓存读取数据失败时,所述分布式数据服务的处理方法还包括:所述应用服务模块从所述关系型数据库中读取数据。
本发明还提供一种分布式数据服务的处理系统,其特点是,包括:应用服务模块、异步服务模块和工作进程模块,所述异步服务模块具有幂等性,所述应用服务模块包括业务数据获取单元、字段增加单元、id生成单元和异步处理单元,所述异步服务模块包括监听单元、异步写数据单元和更新单元,所述工作进程模块包括本地数据获取单元、缓存数据获取单元、判断单元、数据删除单元和异步重发单元;
所述业务数据获取单元用于接收客户端发起的写数据服务请求,并从所述写数据服务请求中获取业务数据;
所述字段增加单元用于在所述业务数据中增加同步状态字段,并初始化所述同步状态字段;
所述异步处理单元用于将已加入所述同步状态字段和所述全局id的所述业务数据作为目标业务数据分别异步存入分布式缓存和本地存储器,以及将所述目标业务数据作为异步消息向消息队列发送;
所述监听单元用于监听所述消息队列,并在监听到异步消息后,从所述异步消息中获取出所述目标业务数据;
所述异步写数据单元用于将所述监听单元获取到的所述目标业务数据异步写入关系型数据库中,并在写入完成后调用所述更新单元;
所述更新单元用于将所述目标业务数据中的同步状态字段的内容进行更新,及将已更新所述同步状态字段的所述目标业务数据更新到所述分布式缓存中;
所述本地数据获取单元用于定时读取所述本地存储器中的目标业务数据,所述缓存数据获取单元用于根据所述本地数据获取单元读取到的所述目标业务数据的全局id读取所述分布式缓存中的缓存数据,所述判断单元用于判断所读取到的所述缓存数据的同步状态字段是否已更新,若是则调用所述数据删除单元,若否则调用所述异步重发单元;
所述数据删除单元用于删除所述本地存储器中的所述目标业务数据,所述异步重发单元用于将所述本地存储器中的所述目标业务数据作为异步消息向所述消息队列发送。
较佳地,所述应用服务模块还包括第一远程调用单元,当所述异步处理单元将所述目标业务数据异步发送到所述消息队列失败时,调用所述第一远程调用单元;
所述监听单元还用于监听所述第一远程调用异步请求,并在监听到所述第一远程调用异步请求后,从所述第一远程调用异步请求中获取出所述目标业务数据。
较佳地,所述应用服务模块还包括第二远程调用单元,在所述异步处理单元将所述目标业务数据异步发送到消息队列时,当所述目标业务数据积压量超过预设阈值时,调用所述第二远程调用单元;
所述监听单元还用于监听所述第二远程调用异步请求,并在监听到所述第二远程调用异步请求后,从所述第二远程调用异步请求中获取出所述目标业务数据。
较佳地,所述分布式缓存包括redis存储系统;所述应用服务模块还包括字符串序列化单元;
在所述异步处理单元将所述目标业务数据异步存入所述分布式缓存前和异步发送到所述消息队列前,所述字符串序列化单元用于将所述目标业务数据进行序列化生成字符串,所述redis存储系统中的缓冲数据的key值为所述目标业务数据中的全局id,所述redis存储系统中的缓冲数据的value值为所述字符串,所述消息队列中的消息体为所述字符串;
在所述监听单元从所述异步消息中获取所述目标业务数据时,所述监听单元先将所述异步消息反序列化后再获取所述目标业务数据。
较佳地,在所述异步处理单元将所述目标业务数据异步存入所述本地存储器时,所述异步处理单元还用于将每一预设时间段内的所述写数据服务请求的所述目标业务数据形成一个本地文件并异步存入所述本地存储器;
所述本地数据获取单元通过读取所述本地存储器中的本地文件获取所述目标业务数据,所述判断单元用于判断所读取到的所述缓存数据的同步状态字段是否均已更新,并在判断结果均为是时调用所述数据删除单元,否则调用所述异步重发单元;所述数据删除单元用于删除所述本地文件,所述异步重发单元用于将所读取到的所述缓存数据中所述同步状态字段未更新的业务数据异步发送到所述消息队列。
较佳地,所述应用服务模块还包括读数据服务单元,所述读数据服务单元用于接收客户端发起的读数据服务请求,并根据所述读数据服务请求从所述分布式缓存读取数据,以及将所读取的数据返回所述客户端。
较佳地,在根据所述读数据服务请求从所述分布式缓存读取数据失败时,所述读数据服务单元还用于从所述关系型数据库中读取数据。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特点是,所述处理器执行所述计算机程序时实现前述任一项所述的分布式数据服务的处理方法。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,其特点是,所述程序被处理器执行时实现前述任一项所述的分布式数据服务的处理方法的步骤。
本发明的积极进步效果在于:本发明中,应用服务模块在接收客户端的写服务请求后,获取出请求中的业务数据,并在业务数据中增加同步状态字段和全局id,然后经异步数据处理,将含同步状态字段和全局id的业务数据作为目标业务数据分别存入分布式缓存、本地存储器和消息队列中,然后由异步服务模块监听消息队列,并在监听到异步消息后,从异步消息中获取出目标业务数据,并在异步写入数据库后,将目标业务数据中的同步状态字段更新,以及将更新后的目标业务数据更新到分布式缓存中,这样工作进程模块通过定时轮询本地存储器中的本地数据,然后根据本地数据中的全局id从分布式缓存中获取对应的缓存数据,然后判断缓存数据中的同步状态字段是否已更新,并在判断为是时将本地存储器中对应的本地数据删除,在判断为否时通过异步消息向消息队列重发,已确保每一次的写数据服务请求无遗漏地得到响应,保证了每一次请求的价值。
图2为本发明实施例1的分布式数据服务的处理方法在应用场景中的数据服务示意图。
下面通过实施例的方式进一步说明本发明,但并不因此将本发明限制在所述的实施例范围之中。
s101、应用服务模块接收客户端发起的写数据服务请求,并从所述写数据服务请求中获取业务数据。
其中,客户端发起的请求类型可以是http(hypertexttransferprotocol,超文本传输协议),也可以是tcp(transmissioncontrolprotocol,传输控制协议),还可以是应用服务模块与客户端相互间协定的其他请求类型。
s102、所述应用服务模块在所述业务数据中增加同步状态字段,并初始化所述同步状态字段,这里同步状态字段的初始状态值设置为0;
s103、所述应用服务模块生成所述业务数据的全局id,并将所述全局id增加到所述业务数据中。
其中,全局id可采用以下方法生成:“机器识别号+时间戳+随机数”,这里机器识别号为全局唯一的ieee(电气和电子工程师协会)机器识别号,比如应用服务模块所在的服务器的ip(网络之间互连的协议)地址;时间戳是指所述写数据服务请求的业务数据的时间戳;随机数的位数优选为三位;这样,采用“机器识别号+时间戳+随机数”算法生成的全局id可为128bit的uuid(universallyuniqueidentifier,通用唯一识别码),从而可在大部分场景下可满足全局唯一。另外,还可采用twitter-snowflake算法(分布式自增id算法)来生成全局id,来满足高并发量请求的应用场景。
s104、所述应用服务模块将已加入所述同步状态字段和所述全局id的所述业务数据作为目标业务数据分别异步存入分布式缓存和本地存储器,以及将所述目标业务数据作为异步消息向消息队列发送,这样通过异步处理机制实现目标业务数据分别在分布式缓存、本地存储器和消息队列的存入操作,既可保证存入操作的准确性,又能提高服务性能。其中,消息队列可优选activemq或rabbitmq。
s105、异步服务模块监听所述消息队列,并在监听到异步消息后,从所述异步消息中获取出所述目标业务数据,将所述目标业务数据异步写入关系型数据库中,并在写入完成后将所述目标业务数据中的同步状态字段的内容进行更新,及将已更新所述同步状态字段的所述目标业务数据更新到所述分布式缓存中,所述异步服务模块具有幂等性。
其中,更新同步状态字段的内容是指更新为1;所述异步服务模块具有幂等性是为了确保应用服务模块通过mq(消息队列)能够可靠地将目标业务数据传输至异步服务模块。
s106、工作进程模块定时读取所述本地存储器中的目标业务数据,根据读取到的所述目标业务数据的全局id读取所述分布式缓存中的缓存数据,判断所读取到的所述缓存数据的同步状态字段是否已更新,若是则删除所述本地存储器中的所述目标业务数据,若否则将所述本地存储器中的所述目标业务数据作为异步消息向所述消息队列发送。
本实施例中,通过上述步骤s101-s106,一方面通过将业务数据暂时存放在本地存储器中,可保证客户端请求的数据不会因为依赖的组件(比如mq,数据库,分布式缓存)不可用而造成丢失,另一方面通过工作进程模块定时轮询本地存储器中的目标业务数据及其在分布式缓存中对应的缓存数据的同步状态字段的值,并以同步状态字段的值是否更新来判断该目标业务数据是否已完成写入数据库,并在完成时删除该本地数据,未完成时异步重发mq,这样通过工作进程模块定时轮询本地存储器中的目标业务数据和mq重试机制来重复发送业务数据,并由异步服务模块的幂等性,最终保证了每次的写数据请求均能做到无遗漏地将业务数据写入到数据库中,确保数据不会丢失,最大限度地保证每次请求的价值不受影响。
进一步,在本实施例中,为实现分布式的高速缓存,并简化数据写入操作,所述分布式缓存可优选redis存储系统或者memcache(一套分布式的高速缓存系统)。在具体实施中,所述分布式缓存优选redis存储系统,这样可利用redis存储系统用作key-value数据库来存放所述目标业务数据,这时所述目标业务数据在被所述应用服务模块异步存入所述分布式缓存前和异步发送到所述消息队列前,由所述应用服务模块序列化生成字符串,这样所述redis存储系统中的缓冲数据的key值就为所述目标业务数据中的全局id,所述redis存储系统中的缓冲数据的value值就为所述字符串,所述消息队列中的消息体为所述字符串,其中所述字符串的格式优选json(javascriptobjectnotation,java脚本对象标记)格式;相应地,所述异步服务模块从所述异步消息中获取所述目标业务数据时,所述异步服务模块先将所述异步消息反序列化后再获取所述目标业务数据。
进一步,在本实施例中,在基于所述异步服务模块的幂等性基础上,还采用了降级服务处理方式,从而通过rpc(remoteprocedurecall,远程过程调用)来保证应用服务模块仍能高可靠地将目标业务数据传输至异步服务模块,有效保证了数据服务的可用性。具体地,当所述应用服务模块将所述目标业务数据异步发送到所述消息队列失败时,比如mq服务器宕机造成消息发送失败或者mq服务器网络延迟造成消息发送失败,所述应用服务模块向所述异步服务模块发起第一远程调用异步请求;相应地,所述异步服务模块还监听所述第一远程调用异步请求,并在监听到所述第一远程调用异步请求后,从所述第一远程调用异步请求中获取出所述目标业务数据。
另外,在业务请求积压较多时,也采用降级服务处理方式,即在所述应用服务模块将所述目标业务数据异步发送到消息队列时,当所述目标业务数据积压量超过预设阈值时,所述应用服务模块向所述异步服务模块发起第二远程调用异步请求;相应地,所述异步服务模块还监听所述第二远程调用异步请求,并在监听到所述第二远程调用异步请求后,从所述第二远程调用异步请求中获取出所述目标业务数据。其中,这里的预设阈值可根据实际应用场景的请求并发量进行设置。
进一步,在本实施例中,为提高数据处理效率,所述工作进程模块采取批量化处理本地存储器的业务数据,即在将业务数据异步存入本地存储器时,存储方案为每隔一段时间生成一个新文件,这样将同一时间段内的业务数据形成一个本地文件进行存放,这样所述工作进程模块通过读取本地文件来批量化读取目标业务数据并进行处理。具体地,在所述应用服务模块将所述目标业务数据异步存入所述本地存储器的步骤中,所述应用服务模块将每一预设时间段的所述写数据服务请求的所述目标业务数据形成一个本地文件并异步存入所述本地存储器;相应地,所述工作进程模块通过读取所述本地存储器中的本地文件获取所述目标业务数据,还判断所读取到的所述缓存数据的同步状态字段是否均已更新,若是则删除所述本地文件,若否则将所述同步状态字段未更新的所述缓存数据中的业务数据异步发送到所述消息队列。其中,预设时间段可以作为文件的命名方式,即文件的命名可以为“起始时间-截止时间”,这样作为时间粒度的预设时间段可以根据实际的应用场景来设置,从而避免单个文件过大给系统带来不良影响,比如单个文件越大,系统加载文件越慢,处理数据时占用内存空间越大,系统稳定性越低。另外,文件的命名方式可如下:如果以一小时为预设时间段,即以一小时为生成新文件的时间单位,则0点-1点的文件名为yyyy-mm-dd00-yyyy-mm-dd01.txt;如果以天为预设时间段,则1号-2号的文件名为yyyy-mm-01-yyyy-mm-02.txt,其中yyyy为年份,mm为月份,dd为日。当然,在以文件形式存放业务数据来实现批量化数据处理时,当mq不可用或者同步状态字段未更新的业务数据积压过多时,工作进程模块也可通过降级服务处理方式来保证服务可用,这里不再赘述。
进一步,在本实施例中,所述分布式数据服务的处理方法还用于进行读数据服务,具体地,所述应用服务模块接收客户端发起的读数据服务请求,根据所述读数据服务请求从所述分布式缓存读取数据,并将所读取的数据返回所述客户端。更进一步,当所述分布式缓存没有所需数据时,就回源数据库,具体地,在根据所述读数据服务请求从所述分布式缓存读取数据失败时,所述应用服务模块从所述关系型数据库中读取数据。这样,在需要读数据时,首先从分布式缓存中快速读取数据,并在读取失败时回源数据库,从而从关系型数据库中读取所需数据。
为便于理解本实施例,下面给出本实施例在应用场景中的数据服务示意图,并以此来说明所述分布式数据服务的处理方法中的写数据服务和读数据服务。
如图2所示,写数据服务时,客户端发起写数据服务请求,应用服务模块从写服务请求中获取出业务数据,增加同步状态字段(此时同步状态字段初始化为0)和全局id到业务数据中形成目标业务数据,然后对目标业务数据进行异步数据处理,包括将目标业务数据进行本地存储、分布式存储和发送异步消息,其中本地存储是将目标业务数据存储至本地存储器中从而形成本地数据,分布式存储是将目标业务数据存储至分布式缓存中,发送异步消息是将目标业务数据形成异步消息并将异步消息发送至消息队列;异步服务模块首先监听消息队列发送过来的异步消息,并在监听到异步消息时,从异步消息中获取出目标业务数据,然后将目标业务数据通过异步写数据(包括调用外部接口、多表操作入库及更新)完成数据入库(即将数据写入到关系型数据库中的写库),并在完成入库后更新目标业务数据中的同步状态字段,即将同步状态字段设置为1,以及将更新后的目标业务数据更新到分布式缓存中;worker模块(即工作进程模块)通过定时轮询本地服务器中来获取本地数据,并根据本地数据中的全局id从分布式缓存中获取对应的缓存数据后,判断该缓存数据中的同步状态字段是否已更新,由于缓存数据中的同步状态字段是在正确入库后被更新的,即只要本地数据对应的缓存数据的同步状态字段已更新,则该本地数据就可以删除,所以在判断出同步状态字段已更新后可将在本地存储器中对应的本地数据进行删除,否则将目标业务数据作为异步消息向消息队列重发,已确保该次的写服务请求能够得到响应。其中,关系型数据库一般分为写库和读库,从而有效地隔离读数据和写数据的操作,通过数据库主从复制实现读库数据与写库数据的同步。
读数据服务时,客户端发起读数据服务请求,应用服务模块中的读数据服务就根据该读数据服务请求,首先从分布式缓存中读取数据,并在读取失败时,回源数据库,即分布式缓存中不存在所需数据时,再从关系型数据库中读取数据。
另外,当应用服务模块发现消息队列不可用,比如由于mq宕机导致不可用,则应用服务模块就通过rpc远程调用进行重发;或者,当应用服务模块已积压过多的写服务请求时,应用服务模块就通过rpc远程调用进行重发;还有,当worker模块在重发同步状态字段未更新的业务数据时,发现已积压过多,同样可通过rpc远程调用进行重发。相应地,异步服务模块还监听soa(面向服务的架构)的rpc接口的远程请求消息。通过rpc远程调用实现重发,进一步实现降级服务处理,从而确保每一次的写服务请求都能得到响应,有效地保证了服务的可用性。
正如图2所示,在具体应用中,可根据实际需要,比如将应用服务模块、worker模块、本地存储器等部署在应用服务器中,关系型数据库选用mysql,分布式缓存选用redis或者memcache,消息队列选用activemq或rabbitmq,以简化整体设计和达到较好服务性能。
如图3所示,本实施例涉及的分布式数据服务的处理系统,包括应用服务模块1、异步服务模块2和工作进程模块3。其中,异步服务模块2具有幂等性,应用服务模块1包括业务数据获取单元11、字段增加单元12、id生成单元13和异步处理单元14,异步服务模块2包括监听单元21、异步写数据单元22和更新单元23,工作进程模块3包括本地数据获取单元31、缓存数据获取单元32、判断单元33、数据删除单元34和异步重发单元35;
业务数据获取单元11用于接收客户端发起的写数据服务请求,并从所述写数据服务请求中获取业务数据;字段增加单元12用于在所述业务数据中增加同步状态字段,并初始化所述同步状态字段,即将所述同步状态字段的值设置为0;id生成单元13用于生成所述业务数据的全局id;字段增加单元12还用于将所述全局id增加到所述业务数据中;异步处理单元14用于将已加入所述同步状态字段和所述全局id的所述业务数据作为目标业务数据分别异步存入分布式缓存和本地存储器,以及将所述目标业务数据作为异步消息向消息队列发送;
监听单元21用于监听所述消息队列,并在监听到异步消息后,从所述异步消息中获取出所述目标业务数据;异步写数据单元22用于将监听单元21获取到的所述目标业务数据异步写入关系型数据库中,并在写入完成后调用更新单元23;更新单元23用于将所述目标业务数据中的同步状态字段的内容进行更新,即将所述同步状态字段的值设置为1,及将已更新所述同步状态字段的所述目标业务数据更新到所述分布式缓存中;
本地数据获取单元31用于定时读取所述本地存储器中的目标业务数据,缓存数据获取单元32用于根据本地数据获取单元31读取到的所述目标业务数据的全局id读取所述分布式缓存中的缓存数据,判断单元33用于判断所读取到的所述缓存数据的同步状态字段是否已更新,若是则调用数据删除单元34,若否则调用异步重发单元35;数据删除单元34用于删除所述本地存储器中的所述目标业务数据,异步重发单元35用于将所述本地存储器中的所述目标业务数据作为异步消息向所述消息队列发送。
本实施例中,客户端发起的请求类型可以是http类型,也可以是tcp类型,还可以是应用服务模块与客户端相互间协定的其他请求类型。
本实施例中,全局id可采用以下方法生成:“机器识别号+时间戳+随机数”,这里机器识别号为全局唯一的ieee(电气和电子工程师协会)机器识别号,比如应用服务模块所在的服务器的ip(网络之间互连的协议)地址;时间戳是指所述写数据服务请求的业务数据的时间戳;随机数的位数优选为三位;这样,采用“机器识别号+时间戳+随机数”算法生成的全局id可为128bit的uuid(universallyuniqueidentifier,通用唯一识别码),从而可在大部分场景下可满足全局唯一。另外,还可采用twitter-snowflake算法(分布式自增id算法)来生成全局id,来满足高并发量请求的应用场景。
本实施例中,一方面通过将业务数据暂时存放在本地存储器中,可保证客户端请求的数据不会因为依赖的组件(比如mq(消息队列),数据库,分布式缓存)不可用而造成丢失,另一方面通过工作进程模块进行定时轮询本地存储器中的目标业务数据及其在分布式缓存中对应的缓存数据的同步状态字段的值,并以同步状态字段的值是否更新来判断该目标业务数据是否已完成写入数据库,并在完成时删除该本地数据,未完成时异步重发mq,这样通过工作进程模块定时轮询本地存储器中的目标业务数据和mq重试机制来重复发送业务数据,并由异步服务模块的幂等性,最终保证了每次的写数据请求均能做到无遗漏地将业务数据写入到数据库中,确保数据不会丢失。
进一步,在本实施例中,在基于所述异步服务模块的幂等性基础上,还采用了降级服务处理方式,从而通过rpc(remoteprocedurecall,远程过程调用)来确保应用服务模块仍能高可靠地将目标业务数据传输至异步服务模块,确保了数据服务的可用性。具体地,应用服务模块1还包括第一远程调用单元15,这样当异步处理单元14将所述目标业务数据异步发送到所述消息队列失败时,调用第一远程调用单元15,由第一远程调用单元15向监听单元21发起第一远程调用异步请求,相应地,监听单元21还监听所述第一远程调用异步请求,并在监听到所述第一远程调用异步请求后,从所述第一远程调用异步请求中获取出所述目标业务数据。
另外,在请求积压较多时,也采用降级服务处理方式,即应用服务模块1还包括第二远程调用单元16,这样在异步处理单元14将所述目标业务数据异步发送到消息队列时,当所述目标业务数据积压量超过预设阈值时,调用第二远程调用单元16,由第二远程调用单元16向监听单元21发起第二远程调用异步请求,相应地监听单元21还监听所述第二远程调用异步请求,并在监听到所述第一远程调用异步请求后,从所述第一远程调用异步请求中获取出所述目标业务数据。其中,这里的预设阈值可根据实际应用场景的请求并发量进行设置。
进一步,在本实施例中,为实现分布式的高速缓存,并简化数据写入操作,所述分布式缓存可优选redis存储系统或者memcache存储系统。在具体实施中,所述分布式缓存优选redis存储系统,这样可利用redis存储系统用作key-value数据库来存放所述目标业务数据。具体地,应用服务模块1还包括字符串序列化单元17,这样所述目标业务数据在被异步处理单元14异步存入所述分布式缓存前和异步发送到所述消息队列前,由字符串序列化单元17序列化后生成字符串,这时所述redis存储系统中的缓冲数据的key值就为所述目标业务数据中的全局id,所述redis存储系统中的缓冲数据的value值就为所述字符串,所述消息队列中的消息体就为所述字符串,其中所述字符串的格式优选json格式;相应地,在监听单元21从所述异步消息中获取所述目标业务数据时,监听单元21先将所述异步消息反序列化后再获取所述目标业务数据。
进一步,在本实施例中,为提高数据处理效率,工作进程模块3采取批量化处理本地存储器的业务数据,即在将业务数据异步存入本地存储器时,存储方案为每隔一段时间生成一个新文件,这样将同一时间段内的业务数据形成一个本地文件进行存放,这样工作进程模块3通过读取本地文件来批量化读取目标业务数据并进行处理。具体地,在异步处理单元14将所述目标业务数据异步存入所述本地存储器时,异步处理单元14将每一预设时间段内的所述写数据服务请求的所述目标业务数据形成一个本地文件并异步存入所述本地存储器,相应地,本地数据获取单元31通过读取所述本地存储器中的本地文件获取所述目标业务数据,判断单元33判断所读取到的所述缓存数据的同步状态字段是否均已更新,并在判断结果均为是时调用数据删除单元34,否则调用异步重发单元35;数据删除单元34用于删除所述本地文件,异步重发单元35用于将所读取到的所述缓存数据中所述同步状态字段未更新的业务数据异步发送到所述消息队列。其中,预设时间段可以作为文件的命名方式,即文件的命名可以为“起始时间-截止时间”,这样作为时间粒度的预设时间段可以根据实际的应用场景来设置,从而避免单个文件过大给系统带来不良影响,比如单个文件越大,系统加载文件越慢,处理数据时占用内存空间越大,系统稳定性越低。另外,文件的命名方式可如下:如果以一小时为预设时间段,即以一小时为生成新文件的时间单位,则0点-1点的文件名为yyyy-mm-dd00-yyyy-mm-dd01.txt;如果以天为预设时间段,则1号-2号的文件名为yyyy-mm-01-yyyy-mm-02.txt,其中yyyy为年份,mm为月份,dd为日。当然,当以文件形式存放业务数据来实现批量化数据处理时,在mq不可用或者同步状态字段未更新的业务数据积压过多时,工作进程模块也可通过降级服务处理方式来保证服务可用,这里不再展开说明。
进一步,在本实施例中,所述分布式数据服务的处理系统还用于进行读数据服务,具体地,所述应用服务模块还包括读数据服务单元18,读数据服务单元18用于接收客户端发起的读数据服务请求,并根据所述读数据服务请求从所述分布式缓存读取数据,以及将所读取的数据返回所述客户端。更进一步,当所述分布式缓存没有所需数据时,就回源数据库,具体地,在根据所述读数据服务请求从所述分布式缓存读取数据失败时,读数据服务单元18还用于从所述关系型数据库中读取数据。这样,在需要读数据时,首先从分布式缓存中快速读取数据,并在读取失败时回源数据库,从而从关系型数据库中读取所需数据,确保读数据服务可靠。
图4为本实施例涉及的电子设备的结构示意图。所述电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现实施例1所述的分布式数据服务的处理方法。图4显示的电子设备50仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图4所示,电子设备50可以以通用计算设备的形式表现,例如其可以为服务器设备。电子设备50的组件可以包括但不限于:上述至少一个处理器51、上述至少一个存储器52、连接不同系统组件(包括存储器52和处理器51)的总线包括数据总线、地址总线和控制总线可以包括易失性存储器,例如随机存取存储器(ram)521和/或高速缓存存储器522,还可以进一步包括只读存储器(rom)523。
存储器52还可以包括具有一组(至少一个)程序模块524的程序工具525,这样的程序模块524包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
处理器51通过运行存储在存储器52中的计算机程序,从而执行各种功能应用以及数据处理,例如本发明实施例1所提供的分布式数据服务的处理方法。
电子设备50也可以与一个或多个外部设备54(例如键盘、指向设备等)通信。这种通信可以通过输入/输出(i/o)接口55进行。并且,电子设备50还可以通过网络适配器56与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信,网络适配器56通过总线的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备50使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、raid(磁盘阵列)系统、磁带驱动器以及数据备份存储系统等。
应当注意,尽管在上文详细描述中提及了电子设备的若干单元/模块或子单元/模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
本实施例涉及一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现实施例1所述的分布式数据服务的处理方法的步骤。
其中,可读存储介质可以采用的更具体可以包括但不限于:便携式盘、硬盘、随机存取存储器、只读存储器、可擦拭可编程只读存储器、光存储器件、磁存储器件或上述的任意合适的组合。
在可能的实施方式中,本发明还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行实现实施例1所述的分布式数据服务的处理方法中的步骤。
其中,可以以一种或多种程序设计语言的任意组合来编写用于执行本发明的程序代码,所述程序代码可以完全地在用户设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户设备上部分在远程设备上执行或完全在远程设备上执行。
虽然以上描述了本发明的具体实施方式,但是本领域的技术人员应当理解,这仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。