计算机软件系统中基于云计算的实时事件处理系统及方法

文档序号:6379550阅读:240来源:国知局
专利名称:计算机软件系统中基于云计算的实时事件处理系统及方法
技术领域
本发明涉及计算机软件应用技术领域,特别涉及计算机软件系统中的事件处理技术领域,具体是指一种计算机软件系统中基于云计算的实时事件处理系统及方法。
背景技术
当今是一个IT事件爆发的时代,每一个应用软件系统都在不停地产生着大量的事件。云计算环境下的海量事件的捕获、实时处理、准实时分析已经成为当前乃至未来若干年的网络信息技术的一个重要领域。当各个应用系统均以主动推送的方式发送实时事件时,要做到高吞吐量下的低延迟处理就成为一个棘手的技术问题。业界在解决大数据量实时处理的问题时,呈现着百花齐放的状况。例如有的方案把事件统一发送到一个消息中间件集群中,以此为中介再发送到订阅消息的客户端;有的方案则利用分布式计算框架把事件分发到不同的机器上处理;有的则强调流计算的概念, 把事件送入数据流并根据预先配置好的模式或规则进行不停的匹配。以上技术方案在事件处理逻辑复杂冗长,特别在需要与大量历史数据关联处理的情况下显得能力不足。例如,在BAM (Business Activity Monitoring,业务活动监控)等实时监控与准实时分析类的系统中,当我们接收到大量的实时业务数据时,每一条都要与过去一年甚至更长周期中的数据做关联计算;每一条都会经过一个复杂冗长的处理流程,如数据串联、还原为流程数据、对流程数据做违规判断、进入数据仓库或KPI (KeyPerformance Indication)指标引擎。在这种复杂的应用场景下,很多通用的技术方案会显得力不从心,分布式计算技术能带来更多的CPU和内存,但要与海量历史数据做串联操作,瓶颈却在关系数据库;消息中间件集群虽然能快速的存储和转发事件,但一连串冗长的处理将全部抛给一个客户端机器,每一个处理环节无法根据其特点做单独的性能设计;流计算技术也无法解决时间窗口过长带来的存储与延迟的问题。SEDA (Staged Event-Driven Architecture,分阶段事件驱动架构)可以把一个请求处理过程分成几个Stage (阶段),不同资源消耗的Stage使用不同数量的线程来处理、使用不同数量不同配置的机器来承载,支持同一个Stage的并行处理,支持多个Stage间的串行处理,Stage间使用事件驱动的异步通信模式,其设计目标就是支持大规模并发处理、简化系统开发、支持资源管理。内存数据库也称为NoSQL数据库或非关系型数据库,传统的缓存技术在未命中的时候仍然会查询关系数据库,这在频繁更新的场景下并不能显著提升性能,反而使处理逻辑更加复杂。内存数据库则可以在一些场景下完全取代关系数据库,在大数据量的时代背景下,在高吞吐量低延迟的实时需求下,以关系数据库为核心的架构正在向着以内存技术为核心的架构发展,没有内存技术的业务逻辑看似正确,然而却已经难堪重负
发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种将SEDA与内存数据库相融合,可以应对实时监控或准实时分析类系统中的高并发请求与大数据量处理,实现复杂的业务逻辑处理流程,满足高吞吐量、低延迟的性能需求,并且有效控制系统资源、提高运行过程的可靠性,达到性能可以分段设计,在一定范围内自由伸缩的目标,适合应用于性能要求苛刻的业务活动监控或准实时分析类系统中,且系统结构简单,成本低廉的计算机软件系统中基于云计算实现实时事件处理的系统及方法。为了实现上述的目的,本发明的计算机软件系统中基于云计算实现实时事件处理的系统具有如下构成该系统包括SEDA分布式消息框架和Redis (REmote Dictionary Server,远程目录服务器)核心内存处理框架。 其中,SEDA分布式消息框架包括控制平台、配置数据库和服务容器,所述的控制平台和服务容器均连接所述的配置数据库,所述的服务容器包括容器基础模块、消息处理服务模块、路由模块、服务解析模块和返回监听模块;所述的消息处理服务模块包括至少一个业务逻辑单元和六个消息通道,所述的各业务逻辑单元对应不同的服务应用业务,所述的业务逻辑单元通过所述的消息通道连接所述的Redis核心内存处理框架,所述的六个消息通道为请求接出通道、请求接入通道、返回接出通道、返回接入通道、错误接出通道和错误接入通道。而Redis核心内存处理框架包括多个Redis服务器、关系数据库、模板工具模块、连接池服务模块、数据分片服务模块、主从热备模块、数据同步服务模块和在线扩容模块。其中,模板工具模块对外提供的接口,连接所述的SEDA分布式消息框架;连接池服务模块对应每一个所述的Redis服务器提供一个连接池;数据分片服务模块将数据分布存储于不同的Redis服务器中;主从热备模块为每一个所述的Redis服务器配置一台从服务器,Redis核心内存处理框架自动检测主从的状态并在主机宕机时切换到对应的从服务器;数据同步服务模块维护一个写缓冲队列,缓冲队列到达一定数量后将写入所述的关系数据库;在线扩容模块用以支持在不间断运行的状况下对所述的Redis核心内存处理框架进行扩容。该计算机软件系统中基于云计算实现实时事件处理的系统中,所述的容器基础模块包括资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元,所述的资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元均连接所述的服务容器。本发明还提供一种利用所述的系统进行基于云计算实现实时事件处理的方法,该方法包括接收消息操作和发送消息操作。所述的接收消息操作包括以下步骤(al)所述的SEDA分布式消息框架进行启动初始化;(a2)所述的Redis核心内存处理框架进行启动初始化;(a3)所述的SEDA分布式消息框架接收到http请求包,并将该http请求包反序列化为消息;(a4)系统调用所述的Redis核心内存处理框架的模板工具模块将消息持久化到Redis服务器;(a5)系统根据所述消息的消息头判断消息为请求消息还是返回消息;(a6)如果是请求消息,则将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理;(a7)如果是返回消息,则将消息发送到所 述的返回接入通道,并寻找对应的业务逻辑单元进行处理;(a8)所述的请求接入通道调用所述的连接池服务模块进行消息处理;(a9)所述的消息的业务逻辑代码通过所述的Redis核心内存处理框架来实现,并与所述的关系数据库解耦合;(alO)所述的消息的业务逻辑构建返回消息并调用服务容器进行发送。所述的发送消息操作包括以下步骤(bl)所述的SEDA分布式消息框架进行启动初始化;(b2)所述的Redis核心内存处理框架进行启动初始化;(b3)业务代码通过调用容器基础模块的消息创建工具单元,将业务对象包装为消息,并调用服务容器分发接口 ;(b4)如果是双向消息,业务代码调用所述的返回监听模块和容器基础模块的超时管理单元进行监听;(b5)系统根据所述消息的消息头确定对应的接出通道;(b6)所述的接出通道根据所述的消息头确定对应的路由信息为本地路由或远程路由;(b7)如果是本地路由,则直接投递到本地的消息接入通道;(b8)如果是远程路由,则序列化消息并通过http远程工具发送。该进行基于云计算实现实时事件处理的方法中,所述的SEDA分布式消息框架进行启动初始化,具体包括以下步骤(1-1)所述的SEDA分布式消息框架根据本地ip地址与管理端口,从所述的配置数据库中查询属于本节点的配置信息;(1-2)所述的SEDA分布式消息框架将本节点的ip地址、管理端口以及其它配置信息拼成urI,并启动Jetty服务器;(1-3)所述的SEDA分布式消息框架利用属于本节点的业务逻辑全路径与服务类型的对应信息,初始化所述的服务解析模块;(1-4)所述的SEDA分布式消息框架利用所述的配置数据库中所有服务类型与url的对应信息,初始化所述的路由模块;(1-5)所述的SEDA分布式消息框架利用所述的本节点的线程池配置信息初始化所述的消息通道;(1-6)所述的SEDA分布式消息框架根据所述的配置数据库中所有集群节点的信息,初始化心跳服务。该进行基于云计算实现实时事件处理的方法中,所述的Redis核心内存处理框架进行启动初始化,具体包括以下步骤(2-1)所述的Redis核心内存处理框架根据配置数据库中的Redis主机、从机地址信息以及连接池的连接数参数、等待时间参数,初始化所述的连接池服务模块;(2-2)所述的Redis核心内存处理框架根据配置数据库中的数据集名称与Redis服务器id的对应信息,初始化所述的数据分片服务模块;(2-3)所述的Redis核心内存处理框架根据配置数据库中的所有客户端地址,初始化所述的主从热备模块;(2-4)所述的Redis核心内存处理框架根据配置数据库中的关系数据库连接信息以及同步任务数量参数,初始化所述的数据同步服务模块。该进行基于云计算实现实时事件处理的方法中,所述的步骤(a3)具体包括以下步骤(a3_l)所述的SEDA分布式消息框架的Jetty服务器从HttpServletRequest请求信息中提取出InputStream输入流,并且转换为字节数组;(a3-2)所述的Jetty服务器读取所述的字节数组前4位并转换为10进制的数字N;(a3-3)所述的Jetty服务器读取所述的字节数组的第5位到第N位,并转换为字符串;(a3_4)所述的Jetty服务器以该字符串作为类的全路径,反射得到序列化器类的实例;(a3-5)所述的Jetty服务器调用该类的反序列化方法处理后续所有字节得到消
肩、O该进行基于云计算实现实时事件处理的方法中,所述的步骤(a4)具体包括以下步骤(a4_l)系统根据数据集名称参数调用数据分片服务接口,获得对应的Redis服务器 id 与 dbid ;(a4_2)系统调用连接池服务接口获得Redis的客户端连接Jedis (Java内存数据库连接工具包),并判断连接是否成功;(a4_3)如果获取连接失败则调用关系数据库的回调任务,将数据更新逻辑写入所述的关系数据库中;(a4_4)如果获取连接成功则调用Redis命令select dbid选择数据库标识dbid ;(a4-5)系统调用Redis的回调任务,将数据更新操作写入内存数据库Redis中;(a4-6)系统调用连接池服务接口将客户端连接Jedis归还至连接池;(a4_7)系统调用数据同步服务接口将关系数据库回调任务存放在内存队列中,达到阈值时,将批量队列更新到关系数据库。该进行基于云计算实现实时事件处理的方法中,步骤(a6)中所述的将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理,具体包括以下步骤(a6_l)所述的SEDA分布式消息框架根据消息头中的服务类型和服务码,从本地节点的各业务逻辑单元中查找对应的业务逻辑;(a6-2)如果找到一条业务逻辑,则将消息发送到连接池服务模块处理;(a6-3)如果找到多条业务逻辑,则将消息多次发送到连接池服务模块并行处理。该进行基于云计算实现实时事件处理的方法中,所述的步骤(b4)具体包括以下步骤(b4_l)所述的双向消息的业务代码实现返回监听的回调方法,并构建出上下文;(b4_2)所述的双向消息的业务代码调用服务容器接口,将返回监听注册到所述的返回监听模块,供返回接入通道使用;(b4_3)所述的双向消息的业务代码实现超时监听接口,并调用服务容器接口注册到容器基础模块的超时管理单元;(b4-4)所述的超时管理单元将超时监听按照时间长度取模,并分别放在分别由5个线程管理的5个等级的队列中,每个线程将定时查看对应等级的队列,如果规定时间内没有收到返回消息就会执行超时监听中的逻辑,收到返回消息则从队列中删除超时监听对
象。 该进行基于云计算实现实时事件处理的方法中,所述的步骤(b6)具体包括以下步骤(b6_l)所述的接出通道根据消息头判断该消息是请求消息还是返回消息;(b6-2)当消息是请求消息时,所述的接出通道调用路由模块的请求路由查询接Π ;(b6-3)当消息是返回消息时,所述的接出通道调用路由模块的返回路由查询接Π ;( b6-4 )所述的请求路由查询接口将根据其从配置数据库中获取的集群全局配置信息以及消息头中的服务类型查找到处理该消息的所有节点;(b6_5)当多个节点的业务逻辑相同时,所述的请求路由利用负载均衡算法得出唯一节点;(b6-6)当多个节点的业务逻辑不同时,所述的请求路由同时将消息发送到多个节占.(b6_7)所述的返回路由查询接口将根据消息头中的返回地址直接定位到目标节点。该进行基于云计算实现实时事件处理的方法还包括心跳检测操作,所述的心跳检测操作包括以下步骤(Cl)所述的容器基础模块的心跳服务中心维护一个心跳线程;(c2)每一个所述的服务容器均通过所述的控制台变更通知维护一个列表,所述列表中的每一个对象都代表着一个其它的服务容器,每个对象内部都维护一个任务队列;(c2)所述的心跳线程到达设定的心跳间隔时间后,就在所述列表中的每个对象的任务队列中添加一个任务;(c3)所述对象收到任务后,向对应的服务容器发出socket心跳消息;(c4)当socket没有正常返回时,抛出异常,说明本次心跳失败,并将对应的服务容器状态设置为非活动;(c5)当再次向状态为非活动的服务容器发出socket心跳消息,socket正常返回时,将对应的服务容器状态设置为活动;(c6)所述的路由模块丢弃发向非活动的服务容器的消息,并返回异常。采用了该发明的计算机软件系统中基于云计算实现实时事件处理的系统,其包括SEDA分布式消息框架和Redis核心内存处理框架。利用该系统实现实时事件处理的方法包括接收消息操作和发送消息操作。该方法将分布式消息框架和Redis核心内存处理框架融合,从而可以有效地应对实时监控或准实时分析类系统中的高并发请求与大数据量处理需求,实现复杂的业务逻辑处理流程,满足高吞吐量、低延迟的性能要求,并且有效控制系统资源、提高运行过程的可靠性,达到性能可以分段设计,在一定范围内自由伸缩的目标,适合应用于性能要求苛刻的业务活动监控或准实时分析类系统中,且本发明的计算机软件系统中基于云计算实现实时事件处理的系统及方法,其系统结构简单,应用成本低廉。


图1为本发明的计算机软件系统中基于云计算实现实时事件处理的系统结构示意图。图2为本发明的系统中的Redis核心内存处理框架示意图。图3为本发明的系统中的Redis核心内存处理框架中的主要模块间的依赖关系示意图。图4为本发明的分布式消息框架的接收消息流程示意图。图5为本发明的分布式消息框架的发送消息流程示意图。图6为本发明的Redis核心内存处理框架的模板方法流程示意图。图7为本发明的Redis核心内存处理框架的连接池服务流程图。图8为本发明的基于SEDA的分布式消息框架的消息示意图。图9为本发明的基于SEDA的分布式消息框架的路由类图。图10为本发明的基于SEDA的分布式消息框架的返回监听与超时管理类图。图11为本发明的基于SEDA的分布式消息框架的心跳服务类图。
具体实施例方式为了能够更清楚地理解本发明的技术页面,特举以下实施例详细说明。请参阅图I所示,为本发明的计算机软件系统中基于云计算实现实时事件处理的系统。在一种实施方式中,该系统包括SEDA分布式消息框架和Redis核心内存处理框架。其中,SEDA分布式消息框架包括控制平台、配置数据库和服务容器,所述的控制平台和服务容器均连接所述的配置数据库,所述的服务容器包括容器基础模块、消息处理服务模块、路由模块、服务解析模块和返回监听模块;所述的消息处理服务模块包括至少一个业务逻辑单元和六个消息通道,所述的各业务逻辑单元对应不同的服务应用业务,所述的业务逻辑单元通过所述的消息通道连接所述的Redis核心内存处理框架,所述的六个消息通道为请求接出通道、请求接入通道、返回接出通道、返回接入通道、错误接出通道和错误接入通道。所述的容器基础模块包括资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元,所述的资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元均连接所述的服务容器。
如图2所示,所述的Redis核心内存处理框架包括多个Redis服务器、关系数据库、模板工具模块、连接池服务模块、数据分片服务模块、主从热备模块、数据同步服务模块和在线扩容模块。其中,模板工具模块对外提供的接口,连接所述的SEDA分布式消息框架;连接池服务模块对应每一个所述的Redis服务器提供一个连接池;数据分片服务模块将数据分布存储于不同的Redis服务器中;主从热备模块为每一个所述的Redis服务器配置一台从服务器,Redis核心内存处理框架自动检测主从的状态并在主机宕机时切换到对应的从服务器;数据同步服务模块维护一个写缓冲队列,缓冲队列到达一定数量后将写入所述的关系数据库;在线扩容模块用以支持在不间断运行的状况下对所述的Redis核心内存处理框架进行扩容。本发明还一种利用所述的系统进行基于云计算实现实时事件处理的方法。在一种实施方式中,该方法包括接收消息操作和发送消息操作。其中,所述的接收消息操作,如图4所示,包括以下步骤 (al)所述的SEDA分布式消息框架进行启动初始化;(a2)所述的Redis核心内存处理框架进行启动初始化;(a3)所述的SEDA分布式消息框架接收到http请求包,并将该http请求包反序列化为消息;(a4)系统调用所述的Redis核心内存处理框架的模板工具模块将消息持久化到Redis服务器;(a5)系统根据所述消息的消息头判断消息为请求消息还是返回消息;(a6)如果是请求消息,则将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理;(a7)如果是返回消息,则将消息发送到所述的返回接入通道,并寻找对应的业务逻辑单元进行处理;(a8)所述的请求接入通道调用所述的连接池服务模块进行消息处理;(a9)所述的消息的业务逻辑代码通过所述的Redis核心内存处理框架来实现,并与所述的关系数据库解耦合;(alO)所述的消息的业务逻辑构建返回消息并调用服务容器进行发送。所述的发送消息操作,如图5所示,包括以下步骤(bl)所述的SEDA分布式消息框架进行启动初始化;(b2)所述的Redis核心内存处理框架进行启动初始化;(b3)业务代码通过调用容器基础模块的消息创建工具单元,将业务对象包装为消息,并调用服务容器分发接口 ;(b4)如果是双向消息,业务代码调用所述的返回监听模块和容器基础模块的超时管理单元进行监听;(b5)系统根据所述消息的消息头确定对应的接出通道;(b6)所述的接出通道根据所述的消息头确定对应的路由信息为本地路由或远程路由;(b7)如果是本地路由,则直接投递到本地的消息接入通道;(b8)如果是远程路由,则序列化消息并通过http远程工具发送。
在一种较优选的实施方式中,步骤(al)与(bl)所述的SEDA分布式消息框架进行启动初始化,具体包括以下步骤(1-1 )所述的SEDA分布式消息框架根据本地ip地址与管理端口,从所述的配置数据库中查询属于本节点的配置信息;(1-2)所述的SEDA分布式消息框架将本节点的ip地址、管理端口以及其它配置信息拼成url,并启动Jetty服务器;(1-3)所述的SEDA分布式消息框架利用属于本节点的业务逻辑全路径与服务类型的对应信息,初始化所述的服务解析模块;(1-4)所述的SEDA分布式消息框架利用所述的配置数据库中所有服务类型与url的对应信息,初始化所述的路由模块;(1-5)所述的SEDA分布式消息框架利用所述的本节点的线程池配置信息初始化所述的消息通道;(1-6)所述的SEDA分布式消息框架根据所述的配置数据库中所有集群节点的信息,初始化心跳服务。步骤(a2)和(b2)所述的Redis核心内存处理框架进行启动初始化,具体包括以下步骤(2-1)所述的Redis核心内存处理框架根据配置数据库中的Redis主机、从机地址信息以及连接池的连接数参数、等待时间参数,初始化所述的连接池服务模块;(2-2)所述的Redis核心内存处理框架根据配置数据库中的数据集名称与Redis服务器id的对应信息,初始化所述的数据分片服务模块;(2-3)所述的Redis核心内存处理框架根据配置数据库中的所有客户端地址,初始化所述的主从热备模块;(2-4)所述的Redis核心内存处理框架根据配置数据库中的关系数据库连接信息以及同步任务数量参数,初始化所述的数据同步服务模块。在进一步优选的实施方式中,所述的步骤(a3)具体包括以下步骤(a3_l)所述的SEDA分布式消息框架的Jetty服务器从HttpServletRequest请求信息中提取出InputStream输入流,并且转换为字节数组;(a3-2)所述的Jetty服务器读取所述的字节数组前4位并转换为10进制的数字N;(a3-3)所述的Jetty服务器读取所述的字节数组的第5位到第N位,并转换为字符串;(a3-4)所述的Jetty服务器以该字符串作为类的全路径,反射得到序列化器类的实例;(a3-5)所述的Jetty服务器调用该类的反序列化方法处理后续所有字节得到消
肩、O所述的步骤(a4)具体包括以下步骤(a4_l)系统根据数据集名称参数调用数据分片服务接口,获得对应的Redis服务器 id 与 dbid ;(a4-2)系统调用连接池服务接口获得Redis的客户端连接Jedis,并判断连接是否成功;(a4_3)如果获取连接失败则调用关系数据库的回调任务,将数据更新逻辑写入所述的关系数据库中;(a4_4)如果获取连接成功则调用Redis命令select dbid选择数据库标识dbid ;(a4_5)系统调用Redis的回调任务,将数据更新操作写入内存数据库Redis中;(a4-6)系统调用连接池服务接口将客户端连接Jedis归还至连接池;(a4_7)系统调用数据同步服务接口将关系数据库回调任务存放在内存队列中,达到阈值时,将批量队列更新到关系数据库。且步骤(a6)中所述的将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理,具体包括以下步骤·(a6_l)所述的SEDA分布式消息框架根据消息头中的服务类型和服务码,从本地节点的各业务逻辑单元中查找对应的业务逻辑;(a6-2)如果找到一条业务逻辑,则将消息发送到连接池服务模块处理;(a6_3)如果找到多条业务逻辑,则将消息多次发送到连接池服务模块并行处理。在另一种进一步优选的实施方式中,所述的步骤(b4)具体包括以下步骤(b4_l)所述的双向消息的业务代码实现返回监听的回调方法,并构建出上下文;(b4_2)所述的双向消息的业务代码调用服务容器接口,将返回监听注册到所述的返回监听模块,供返回接入通道使用;(b4_3)所述的双向消息的业务代码实现超时监听接口,并调用服务容器接口注册到容器基础模块的超时管理单元;(b4_4)所述的超时管理单元将超时监听按照时间长度取模,并分别放在分别由5个线程管理的5个等级的队列中,每个线程将定时查看对应等级的队列,如果规定时间内没有收到返回消息就会执行超时监听中的逻辑,收到返回消息则从队列中删除超时监听对象。且步骤(b6)具体包括以下步骤(b6_l)所述的接出通道根据消息头判断该消息是请求消息还是返回消息;(b6-2)当消息是请求消息时,所述的接出通道调用路由模块的请求路由查询接Π ;(b6-3)当消息是返回消息时,所述的接出通道调用路由模块的返回路由查询接Π ;( b6-4 )所述的请求路由查询接口将根据其从配置数据库中获取的集群全局配置信息以及消息头中的服务类型查找到处理该消息的所有节点;(b6_5)当多个节点的业务逻辑相同时,所述的请求路由利用负载均衡算法得出唯一节点;(b6-6)当多个节点的业务逻辑不同时,所述的请求路由同时将消息发送到多个节占.(b6_7)所述的返回路由查询接口将根据消息头中的返回地址直接定位到目标节点。在一种更优选的实施方式中,所述的方法还包括心跳检测操作,所述的心跳检测操作包括以下步骤(Cl)所述的容器基础模块的心跳服务中心维护一个心跳线程;(c2)每一个所述的服务容器均通过所述的控制台变更通知维护一个列表,所述列表中的每一个对象都代表着一个其它的服务容器,每个对象内部都维护一个任务队列;(c2)所述的心跳线程到达设定的心跳间隔时间后,就在所述列表中的每个对象的任务队列中添加一个任务;(c3)所述对象收到任务后,向对应的服务容器发出socket心跳消息;(c4)当socket没有正常返回时,抛出异常,说明本次心跳失败,并将对应的服务容器状态设置为非活动;
(c5)当再次向状态为非活动的服务容器发出socket心跳消息,socket正常返回时,将对应的服务容器状态设置为活动;(c6)所述的路由模块丢弃发向非活动的服务容器的消息,并返回异常。在本发明的应用中,本发明的系统主要由两个框架组成,分布式消息框架和内存处理框架。分布式消息框架基于SEDA (分段事件驱动架构)的思想,完全依赖自身的技术积累来设计和实现。内存处理框架则包装了小巧开源的内存数据库Redis,在其外围提供丰富的功能组件使其达到企业级应用的需求。分布式消息框架和其中包装的业务逻辑依赖内存处理框架,这不仅是为了提高处理速度,更是为了减轻对关系数据库的压力,使性能在一定范围内自由伸缩。分布式消息框架的架构如图I所示,服务容器是分布式消息框架的顶层概念,一个web应用中至多可以配置一个服务容器,业务逻辑代码在任何需要的地方都可以调用唯一的服务容器所提供的sendMessage方法。一个服务容器内可以配置多个业务逻辑,每个业务逻辑所处理的服务类型、服务码是不同的,这些信息存于配置数据库中,并应用与服务解析模块,inRequestChannel接收到的消息会根据服务解析模块的结果定位到某一个业务服务逻辑。一个服务容器有且仅有6个channel (通道)。服务容器对外提供的sendMessage方法将把消息发送到本地的outRequestChannel请求接出通道。三个outchannel接出通道都将使用路由模块将消息发送到一个远程服务容器或本地服务容器的inchannel接入通道。其中outRequestChannel请求接出通道将使用请求路由将消息发送到远程或本地服务容器的inRequestChannel请求接入通道,outReplyChannel回复接出通道将使用返回路由将消息发送到远程或本地服务容器的inReplyChannel回复接入通道,outErrorChannel错误接出通道将使用返回路由将消息发送到远程或本地服务容器的inErrorChannel错误接入通道。控制台模块由前端提供页面并且直接做数据库表的操作,只是在发变更集群通知时调用引擎提供的一个接口。基于SEDA思想的分布式消息框架用于把处理过程拆分为多个段,部署在不同的物理机器上承载。不同资源消耗的段使用不同的数量的线程、不同配置规格的机器来处理,段间采用http协议传递消息,业务数据被包装在消息的消息体中。可以把同一类型的消息分发到多个节点实现负载均衡即并行处理;可以把原有的处理过程打散,用消息包装数据在多个节点之间传送,使一个过程的不同环节在不同的物理节点上处理,实现了串行处理。这符合“性能应该可以分开设计”的思想。
内存处理框架以Redis为基础,为消息框架以及其中包装的业务逻辑提供在内存中存取数据的服务,有持久化、同步到关系数据库、主从切换、数据分片、连接池、在线扩容等功能,并对外提供模板工具作为接口。内存处理框架的架构图如下所示,该图说明了内存处理框架仅依赖关系数据库和Redis Server。而依赖内存处理框架的主要是两个部分,一是业务逻辑,通常它们已经被包装在分布式消息框架中了,比如数据关联、数据还原、合规判断;二是分布式消息框架中的三个入队列,它们会把消息保存在Redis中,并利用Redis做岩机恢复。图3表示内存处理框架中的6个主要的模块间的依赖关系。模板工具模板是对外提供的接口,用户只需要实现回调方法,方法中使用jedis做业务逻辑即可,其他均不必关心。连接池服务对应每一个Redis服务器,都会提供一个连接池,避免创建和销毁连 接时的时间损耗。数据分片服务把数据分布的存储在不同的Redis server中,因为一台机器的内存总是有限的,通过数据分片可以利用更多的内存。主从热备可以为每一个Redis服务器配置一台从机,框架将自动检测主从的状态并在主机宕掉时发出切换通知。数据同步服务是一个写缓冲队列,到达一定数量后将写入oracle数据库,以此保证总有一份关系数据库中的数据是可靠的。在线扩容框架的设计方案支持在不间断运行的状况下进行扩容。本发明的方法的整体处理流程包括对业务逻辑进行分段、段间使用消息进行异步通信、根据分段后的配置信息各个服务容器节点进行启动初始化、任何一个服务容器都具有多个逻辑通道可以发送或接收消息、将业务对象包装为消息再调用分发接口、根据消息头和配置信息寻找远程或本地路由、将消息序列化后通过http协议发送到远端的服务容器、服务容器使用内嵌jetty的方式接收http协议包并从中反序列化出消息、根据消息头把消息发到适当的处理通道、通道将对请求消息调用适当的业务逻辑进行处理、通道将对返回消息调用适当的返回监听进行处理、对于需要返回结果的消息可以在发送端做超时控制、接收消息的一端将使用先保存再处理的可靠性原则通过内存处理框架把消息持久化到内存数据库、并据此实现宕机恢复等可靠性功能、被分段和包装的业务逻辑可以把原有的关系数据库相关逻辑重构为使用内存处理框架。基于SEDA的分布式消息框架的消息示意图,如图8所示。基于SEDA的分布式消息框架的路由类图如图9所示。本发明的方法应用集群中的所有服务容器节点以及内存数据库服务器,在接收消息环节包括以下步骤(I)基于SEDA的分布式消息框架进行启动初始化操作;(a)根据本地ip与管理端口,从数据库配置表中查询属于本节点的配置信息;(b)根据本节点的ip、管理端口以及其他配置信息,拼成url并启动Jetty服务器;(C)使用属于本节点的业务逻辑全路径与服务类型的对应信息,初始化服务解析模块;(d)使用配置表中所有服务类型与url的对应信息,初始化路由模块;
(e)使用本节点的线程池配置信息初始化接入通道;(f)根据配置表中所有集群节点的信息,初始化心跳服务。(2)以Redis为核心的内存处理框架进行启动初始化操作;(a)根据数据库配置表中的Redis主机、从机地址信息,以及连接池的连接数参数、等待时间参数,初始化连接池服务模块;(b)根据配置表中的数据集名称与Redis服务器id的对应信息,初始化数据分片模块;(c)根据配置表中的所有客户端地址,初始化主从热备模块;(d)根据配置表中的关系数据库连接信息以及同步任务数量参数,初始化数据同·步模块。(3)消息框架中的Jetty服务器接收到http请求包,并反序列化为消息;(a)从HttpServletRequest中提取出InputStream,并且转换为字节数组;(b)读取前4位并转换为10进制的数字N ;(C)从第5位读取到第N位,并转换为字符串;(d)以该字符串作为类的全路径,反射得到序列化器类的实例;(e)调用该类的反序列化方法处理后续所有字节得到消息。(4)通过内存处理框架将消息持久化到内存数据库Redis ;(a)根据数据集名称参数调用数据分片服务接口,获得对应的Redis服务器id与dbid ;(b)调用连接池服务接口获得Redis的客户端连接Jedis ;(C)如果获取连接失败则调用关系数据库回调任务,将数据更新逻辑做到关系数据库中;Cd)如果获取连接成功则调用Redis命令select dbid ;(e)调用Redis的回调任务,将数据更新操作做到内存数据库Redis中;(f)调用连接池服务接口将客户端连接Jedis归还到连接池;(g)调用数据同步服务接口将关系数据库回调任务存放在内存队列,达到阀值时将批量更新到关系数据库。(5)根据消息头判断是请求消息还是返回消息;(6)如果是请求消息则发送到请求接入通道,并找到合适的业务逻辑进行处理;(a)根据消息头中的服务类型和服务码,从本地节点的业务逻辑服务集合中找到合适的业务逻辑;(b)如果找到一条业务逻辑,则将消息发送到线程池处理;(C)如果找到多条业务逻辑,则将消息多次发送到线程池处理即多个线程并行处理。(7)如果是返回消息则发送到返回接入通道进行处理;(8)请求接入通道以线程池的方式实现,不阻塞后续请求;(9)业务逻辑代码通过内存处理框架来实现,与关系数据库解耦合;(10)业务逻辑可以构建返回消息并调用服务容器的分发接口进行发送。在发送消息环节包括以下步骤
(I)基于SEDA的分布式消息框架进行启动初始化操作;(2)以Redis为核心的内存处理框架进行启动初始化操作;(3)业务代码调用消息构建工具类把业务对象包装为消息,并调用容器的分发接Π ;(4)如果是双向消息,业务代码可以调用容器接口注册返回监听以及超时监听;(a)业务代码需实现返回监听的回调方法并构建出上下文;(b)业务代码调用容器接口将返回监听注册到返回监听管理器,供返回接入通道使用;(C)业务代码需实现超时监听接口,并调用容器接口注册到超时管理器中;
(d)超时管理器会将超时监听按照时间长度取模分别放在5个level的队列中分别由5个线程来管理,每个线程将定时查看自己的队列,如果规定时间内没有收到返回消息就会执行超时监听中的逻辑,收到返回消息则从队列中删除超时监听对象。本发明的基于SEDA的分布式消息框架的返回监听与超时管理类图如图10所示。(5)根据消息头将消息发送到合适的接出通道;(6)接出通道根据消息头寻找合适的路由信息;(a)根据消息头判断该消息是请求消息还是返回消息;(b)当消息是请求消息时,调用路由模块的请求路由查询接口 ;(c)当消息是返回消息时,调用路由模块的返回路由查询接口 ;(d)请求路由查询接口将根据其从配置表中获取的集群全局配置信息以及消息头中的服务类型查找到可以处理该消息的所有节点;(e)当多个节点的业务逻辑相同时会使用负载均衡算法得出唯一结果;(f)当多个节点的业务逻辑不同时会同时将消息发送到多个节点;(g)返回路由查询接口将根据消息头中的返回地址直接定位到目标节点。(7)如果是本地路由,则直接投递到本地的消息接入通道;(8)如果是远程路由,则序列化消息并通过http远程工具发送;(9)如果查询到多个远程路由,则通过负载均衡算法得出唯一的远程路由。同时,因为本地消息有可能被发送到任何其他节点,所以要对集群中所有节点持续做心跳检测,本发明的基于SEDA的分布式消息框架的心跳服务类图如图11所示,心跳检测操作包括以下步骤( I)每一个服务容器都会维护一个列表,列表中的每一个对象都代表着一个其他的服务容器,这个列表依靠控制台的变更通知来维护;(2)心跳线程到了心跳的间隔时间后就为列表中的每个对象添加一个任务,每个对象内部都有一个任务队列;(3)对象收到任务后负责向自己对应的服务容器发出socket心跳消息;(4)当socket没有正常返回时会抛出异常,说明本次心跳失败,此时并不会将该对象从列表删除,而只是设置其状态为非活动,下次心跳时间到来时仍然会尝试向其发送心跳消息;(5)没有死亡判断,而是在活动与非活动之间交替转换,在非活动时仍然会发心跳消息,成功后其状态转换为活动,路由模块又可以发消息给它,而在它非活动时发向它的消息直接丢弃,返回异常。所述的配置信息将集中放在数据库表中并依靠变更通知支持热加载。当实施人员在控制台中修改了某个服务容器的配置、或新增删除某个服务容器,控制台会主动调用引擎提供的一个接口,该接口会从已经存在的服务容器中寻找一个来发送变更通知,因为任何一个服务容器都维护着其他容器的信息,所以收到变更通知的这个容器会向所有其他的容器发送内部变更通知,所有容器都将查询数据库得到最新的配置信息,依靠这些最新的配置,它们将维护自己的路由规则库、服务解析模块、服务容器集群服务等。实际应用中的内存处理框架中模板方法,如图6所示,包括如下实现步骤1、Redis 开关在某些项目实施中,没有高性能的要求,为了减小实施难度、减小系统运行的复杂度、减小发生事故的可能性,我们做了 Redis开关,当在数据库中配置为关闭时,内存处理框架将直接执行RDBCallback任务,且不对RedisCallback做任何保存。2、获取数据分片信息调用数据分片服务的接口,获得当前要处理的数据集所对应的分配信息,即RedisServerName 和 dbid。3、获取 Jedis 连接调用连接池服务的接口,根据RedisServerName获得Jedis连接,该Jedis是框架包装后的Jedis,把其所属的JedisPool也放入其中,这样方便归还,并代理了原始Jedis的所有方法,使得用户可以像使用原始Jedis —样方便操作。4、select dbid分片信息中还包含dbid,是在一个Redis服务器实例中对数据进行分库以提升性能,在进行任务Redis操作之前,应该先执行select dbid转换到该数据集对应的正确的库。5、调用 RedisCallback转换到正确的库后,就可以调用Redis的回调方法对Redis做业务逻辑了。6、归还Jedis到连接池Redis回调方法结束后,应该把jedis返还到它所属的连接池,可能是正常返还,也可能因操作过程中发生了异常而中断返还,该Jedis是框架包装后的,可以从中直接取出JedisPool进行返还。7、把RDBCallback放入任务队列因为需要把所有更新操作同步到关系数据库以保证总有一份数据是最可靠的,但又不能对性能影响太大,所以在同步数据服务中实现了缓冲任务队列,当达到一定数量时进行批处理,RDBCallback不仅是一个回调接口,其中也封装了数据库操作中所需的数据。8、切换开关如果获取Jedis连接失败,说明Redis主机已经宕机且没有从机可用或从机也已经宕机。如果切换开关打开,说明项目实施要求切换到关系数据库、要保证业务逻辑正常运行即使慢一点,所有直接调用RDBCal Iback对关系数据库进行操作。如果切换开关关闭,说明该项目认为Redis宕机后应该中断服务,人为介入处理。9、调用 RDBCallback
10、把 RedisCallback 存入任务队列为了在Redis恢复后平滑切换到Redis,还需要把Redis中断后的所有更新操作同步到Redis,所有此处会把RedisCallback存入内存任务队列,到达一定数量后序列号到数据库。当Redi s重启后会检查内存和数据库中的Redi sCal Iback任务并在Redi s服务器上重放,这一部分在内存处理框架的启动监听中实现。需要注意的是为了使增删改任务在不同时间执行可以对Redis产生同样的效果、且只对Redis产生效果,RedisCallback只能包装Redis相关的操作,db逻辑和其他业务逻辑放在外面。本发明的内存处理框架中,连接池服务的一种参考实现方式如下连接池模块会根据配置表中Redis服务器的地址以及连接池参数,为每个Redis服务器的主服务器创建一个连接池,主服务器和从服务器会使用同一个Redis服务器名称。当模板方法请求分配连接时,连接池模块会首先根据Redis服务器名称尝试从主服务器获取连接,当获取失败或者获取到的连接在测试可用性时失败(连接池的testOnBorrow属性设为true,连接池在获取连接时会使用ping进行测试,失败则抛出异常),将等待2秒,如果连续5次失败,将调用主从热备模块的接口到数据库的Redis服务器状态表中查询该Redisserver的状态,如果已经死亡且从机正常,则销毁主服务器连接池、重建从服务器连接池、自动切换到从机的连接池。在配置表中,有主从之别,但在运行当中,主从是可以来回切换的,只有当前和备用的区别。从连接池中获取连接的实现,如图7所示,包括以下步骤I、根据参数RedisServerName从该Redis服务器的当前连接池获取连接;2、如果获取连接时抛出了异常,可能是检测连接可用性时出了问题,等待2秒,重新从该连接池获取,如果仍失败则继续尝试,尝试5次;3、5次尝试均告失败则调用主从热备模块接口查询当前主机的状态;4、如果当前主机的状态是死亡则销毁当前连接池,重建从机连接池,切换到从机(目前仅支持一个从机);5、调用主从热备的切换同步接口 ;6、如果所有客户端均切换成功则从新的连接池获取连接。本发明的内存处理框架中,主从热备模块的一种参考实现方式如下Redis具有Master-slave的功能,可以在主服务器上挂一台从服务器,对主服务器的改动会通过socket传送到从服务器执行一遍。但Redis提供的是服务器端的功能,在本模块中,我们从客户端入手即从内存处理框架入手,提供在多客户端的部署环境中、在分片的环境中的王从连接池切换功能。主从热备模块在启动过程中会把自己的ip地址和管理端口放入Redis客户端注册表。连接池模块会根据Redis配置表中的主从配置创建出主服务器的连接池。使用过程中,当从连接池获取连接失败,会sleep两秒再获取连接,多次失败后,该客户端认为当前连接池对应的主服务器宕机。进而调用主从热备模块的接口把该结果写入Redis服务器状态表,再向其他客户端发出岩机检查通知,主从模块内部会从Redis客户端配置表中读取出此时此刻所有的客户端地址,并调用心跳服务一一检查这些客户端的状态,向正常运行的客户端发送socket消息,并将成功发送消息的客户端地址记录在内存中(socket无异常即是发送成功了),其他客户端接收到这个消息后通过被认为宕机的Redis服务器对应的连接池中获取连接并测试连通性的方式确认该服务器是否宕机,并把测试结果与自己的地址写入Redis服务器状态表,该过程中首个发现宕机的客户端采用轮询的方式查看Redis服务器状态表,直到所有接到通知的客户端都检查完毕时收集这些测试结果,只有所有客户端都认为该Redis服务器宕机,才能进入下一个环节即切换连接池。最早发现宕机的客户端首先切换了连接池(销毁主连接池、初始化从连接池),但此时它还不能使用新的连接池,它会向所有正常运行的客户端发出切换通知,其他客户端切换后会向Redis状态表中记录切换标不,起始客户端收集到所有结果后与入冋步完成标识,此刻所有客户端都可以使用新的连接池了,起始客户端还负责在Redis配置表中记录切换历史(可用于页面监控台的实时展现)。
该方案解决以下几个问题当某客户端与Redis服务器连接断开时,不会切换到从服务器从而导致主从数据不一致;当某客户端使用的Redis服务器其他客户端此刻并未用到,仍然可以获取其他所有客户端的连通性测试结果,从而达到统一切换的目的;当某客户端宕机时,它不会收到宕机测试通知,其他客户端也不会等待它的返回结果;因为有切换同步的过程,所以不存在主从数据不一致的状况。另外,维护人员在监控台中看到宕机与切换的通知后,需要人工修改从服务器的配置文件使其不再从属于其他机器(为了日后重启),需要把主服务器的配置文件改为从属于新的主服务器,重启宕机的服务器。本发明的内存处理框架中,数据同步模块的一种参考实现方式如下为了在提高下性能的同时最大程度的保证数据安全,我们决定仍然在关系数据库中存一份主数据,当Redis岩机或Redis数据文件无法恢复时,内存处理框架可以自动切换到关系数据库相关的业务逻辑,既保证产品可以运行下去,也保证数据完整性。数据同步模块有一个任务队列和一个线程,任务队列中保存的是RDBCallback,每次加入一条新的任务都会唤醒线程,线程检查队列中的任务数量是否达到内置的阀值(t匕如1000),如果达到则按照先进先出的顺序执行这些RDBCallback任务,该回调方法中完整的封装了 oracle相关的所有更新操作(不包括查询),且该对象中已经提前放入了当时的数据上下文。数据同步的模块中还包括另一个功能,即Redis数据文件备份功能,该功能由shell脚本定时复制出每个Redis服务器的数据文件放在备份目录中,并加上时效,比如三个月前的可以删除,该shell脚本需要在部署Redis的同时人工部署和启动。在上述实施例中,使用的是基于Java语言的描述,当然也可以根据需要采用其它的面向对象编程语目。在某BAM (业务活动监控)产品中,我们使用基于SEDA和内存数据库的实时事件处理方法对原有处理过程进行改造后,整体性能可以提升1(Γ15倍,甚至不仅仅是提升,而是把不可能变为可能。使用内存处理框架改造业务事件关联环节后,数据库压力下降5倍(数据库服务器的CPU占有率从80%下降到15%),关联环节的整体处理时间降低(1000万数据的处理时间由3小时降低为I小时)。此时,在分布式消息框架的帮助下,将三个主要的处理环节(关联、还原、违规判断)拆分后使用5台机器承载,3小时处理了 I. 5亿数据,性能提升15倍。考虑到存量数据对关系数据库的巨大影响,当达到I. 5亿数据量时,处理延时很可能已经无法容忍。如果没有内存处理框架的帮助,多上一台机器,关系数据库将被压垮。采用了该发明的计算机软件系统中基于云计算实现实时事件处理的系统,其包括SEDA分布式消息框架和Redis核心内存处理框架。利用该系统实现实时事件处理的方法包括接收消息操作和发送消息操作。该方 法将分布式消息框架和Redis核心内存处理框架融合,从而可以有效地应对实时监控或准实时分析类系统中的高并发请求与大数据量处理需求,实现复杂的业务逻辑处理流程,满足高吞吐量、低延迟的性能要求,并且有效控制系统资源、提高运行过程的可靠性,达到性能可以分段设计,在一定范围内自由伸缩的目标,适合应用于性能要求苛刻的业务活动监控或准实时分析类系统中,且本发明的计算机软件系统中基于云计算实现实时事件处理的系统及方法,其系统结构简单,应用成本低廉。在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
权利要求
1.一种计算机软件系统中基于云计算实现实时事件处理的系统,其特征在于,所述的系统包括SEDA分布式消息框架和Redis核心内存处理框架; 所述的SEDA分布式消息框架包括控制平台、配置数据库和服务容器,所述的控制平台和服务容器均连接所述的配置数据库,所述的服务容器包括容器基础模块、消息处理服务模块、路由模块、服务解析模块和返回监听模块;所述的消息处理服务模块包括至少一个业务逻辑单元和六个消息通道,所述的各业务逻辑单元对应不同的服务应用业务,所述的业务逻辑单元通过所述的消息通道连接所述的Redis核心内存处理框架,所述的六个消息通道为请求接出通道、请求接入通道、返回接出通道、返回接入通道、错误接出通道和错误接入通道; 所述的Redis核心内存处理框架包括多个Redis服务器和关系数据库,还包括 模板工具模块,对外提供的接口,连接所述的SEDA分布式消息框架; 连接池服务模块,对应每一个所述的Redis服务器提供一个连接池; 数据分片服务模块,将数据分布存储于不同的Redis服务器中; 主从热备模块,为每一个所述的Redis服务器配置一台从服务器,Redis核心内存处理框架自动检测主从的状态并在主机宕机 时切换到对应的从服务器; 数据同步服务模块,维护一个写缓冲队列,缓冲队列到达一定数量后将写入所述的关系数据库; 在线扩容模块,用以支持在不间断运行的状况下对所述的Redis核心内存处理框架进行扩容。
2.根据权利要求I所述的计算机软件系统中基于云计算实现实时事件处理的系统,其特征在于,所述的容器基础模块包括资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元,所述的资源管理单元、超时管理单元、心跳服务单元、集群通知单元、远程通信单元、负载均衡单元、通道管理单元和消息创建工具单元均连接所述的服务容器。
3.一种利用权利要求I所述的系统进行基于云计算实现实时事件处理的方法,其特征在于,所述的方法包括接收消息操作和发送消息操作,所述的接收消息操作包括以下步骤 (al)所述的SEDA分布式消息框架进行启动初始化; (a2)所述的Redis核心内存处理框架进行启动初始化; (a3)所述的SEDA分布式消息框架接收到http请求包,并将该http请求包反序列化为消息; (a4)系统调用所述的Redis核心内存处理框架的模板工具模块将消息持久化到Redis服务器; (a5)系统根据所述消息的消息头判断消息为请求消息还是返回消息; (a6)如果是请求消息,则将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理; (a7)如果是返回消息,则将消息发送到所述的返回接入通道,并寻找对应的业务逻辑单元进行处理; (a8)所述的请求接入通道调用所述的连接池服务模块进行消息处理;(a9)所述的消息的业务逻辑代码通过所述的Redis核心内存处理框架来实现,并与所述的关系数据库解耦合; (alO)所述的消息的业务逻辑构建返回消息并调用服务容器进行发送; 所述的发送消息操作包括以下步骤 (bl)所述的SEDA分布式消息框架进行启动初始化; (b2)所述的Redis核心内存处理框架进行启动初始化; (b3)业务代码通过调用容器基础模块的消息创建工具单元,将业务对象包装为消息, 并调用服务容器分发接口; (b4)如果是双向消息,业务代码调用所述的返回监听模块和容器基础模块的超时管理单元进行监听; (b5)系统根据所述消息的消息头确定对应的接出通道; (b6)所述的接出通道根据所述的消息头确定对应的路由信息为本地路由或远程路由; (b7)如果是本地路由,则直接投递到本地的消息接入通道; (b8)如果是远程路由,则序列化消息并通过http远程工具发送。
4.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的SEDA分布式消息框架进行启动初始化,具体包括以下步骤 (1-1)所述的SEDA分布式消息框架根据本地ip地址与管理端口,从所述的配置数据库中查询属于本节点的配置信息; (1-2)所述的SEDA分布式消息框架将本节点的ip地址、管理端口以及其它配置信息拼成url,并启动Jetty服务器; (1-3)所述的SEDA分布式消息框架利用属于本节点的业务逻辑全路径与服务类型的对应信息,初始化所述的服务解析模块; (1-4)所述的SEDA分布式消息框架利用所述的配置数据库中所有服务类型与url的对应信息,初始化所述的路由模块; (1-5)所述的SEDA分布式消息框架利用所述的本节点的线程池配置信息初始化所述的消息通道; (1-6)所述的SEDA分布式消息框架根据所述的配置数据库中所有集群节点的信息,初始化心跳服务。
5.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的Redis核心内存处理框架进行启动初始化,具体包括以下步骤 (2-1)所述的Redis核心内存处理框架根据配置数据库中的Redis主机、从机地址信息以及连接池的连接数参数、等待时间参数,初始化所述的连接池服务模块; (2-2)所述的Redis核心内存处理框架根据配置数据库中的数据集名称与Redis服务器id的对应信息,初始化所述的数据分片服务模块; (2-3)所述的Redis核心内存处理框架根据配置数据库中的所有客户端地址,初始化所述的主从热备模块; (2-4)所述的Redis核心内存处理框架根据配置数据库中的关系数据库连接信息以及同步任务数量参数,初始化所述的数据同步服务模块。
6.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的步骤(a3)具体包括以下步骤 (a3_l)所述的SEDA分布式消息框架的Jetty服务器从HttpServletRequest请求信息中提取出InputStream输入流,并且转换为字节数组; (a3-2)所述的Jetty服务器读取所述的字节数组前4位并转换为10进制的数字N ; (a3_3)所述的Jetty服务器读取所述的字节数组的第5位到第N位,并转换为字符串; (a3-4)所述的Jetty服务器以该字符串作为类的全路径,反射得到序列化器类的实例; (a3-5)所述的Jetty服务器调用该类的反序列化方法处理后续所有字节得到消息。
7.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的步骤(a4)具体包括以下步骤 (a4_l)系统根据数据集名称参数调用数据分片服务接口,获得对应的Redis服务器id与 dbid ; (a4-2)系统调用连接池服务接口获得Redis的客户端连接Jedis,并判断连接是否成功; (a4_3)如果获取连接失败则调用关系数据库的回调任务,将数据更新逻辑写入所述的关系数据库中; (a4_4)如果获取连接成功则调用Redis命令select dbid选择数据库标识dbid ; (a4-5)系统调用Redis的回调任务,将数据更新操作写入内存数据库Redis中; (a4-6)系统调用连接池服务接口将客户端连接Jedis归还至连接池; (a4_7)系统调用数据同步服务接口将关系数据库回调任务存放在内存队列中,达到阈值时,将批量队列更新到关系数据库。
8.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的步骤(a6)中所述的将消息发送到所述的请求接入通道,并寻找对应的业务逻辑单元进行处理,具体包括以下步骤 (a6-l)所述的SEDA分布式消息框架根据消息头中的服务类型和服务码,从本地节点的各业务逻辑单元中查找对应的业务逻辑; (a6-2)如果找到一条业务逻辑,则将消息发送到连接池服务模块处理; (a6-3)如果找到多条业务逻辑,则将消息多次发送到连接池服务模块并行处理。
9.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的步骤(b4)具体包括以下步骤 (b4-l)所述的双向消息的业务代码实现返回监听的回调方法,并构建出上下文;(b4-2)所述的双向消息的业务代码调用服务容器接口,将返回监听注册到所述的返回监听模块,供返回接入通道使用; (b4-3)所述的双向消息的业务代码实现超时监听接口,并调用服务容器接口注册到容器基础模块的超时管理单元; (b4-4)所述的超时管理单元将超时监听按照时间长度取模,并分别放在分别由5个线程管理的5个等级的队列中,每个线程将定时查看对应等级的队列,如果规定时间内没有收到返回消息就会执行超时监听中的逻辑,收到返回消息则从队列中删除超时监听对象。
10.根据权利要求3所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的步骤(b6)具体包括以下步骤 (b6-l)所述的接出通道根据消息头判断该消息是请求消息还是返回消息; (b6-2)当消息是请求消息时,所 述的接出通道调用路由模块的请求路由查询接口 ;(b6-3)当消息是返回消息时,所述的接出通道调用路由模块的返回路由查询接口 ;(b6-4)所述的请求路由查询接口将根据其从配置数据库中获取的集群全局配置信息以及消息头中的服务类型查找到处理该消息的所有节点; (b6-5)当多个节点的业务逻辑相同时,所述的请求路由利用负载均衡算法得出唯一节占. (b6-6)当多个节点的业务逻辑不同时,所述的请求路由同时将消息发送到多个节点; (b6-7)所述的返回路由查询接口将根据消息头中的返回地址直接定位到目标节点。
11.根据权利要求3至10中任一项所述的进行基于云计算实现实时事件处理的方法,其特征在于,所述的方法还包括心跳检测操作,所述的心跳检测操作包括以下步骤 (Cl)所述的容器基础模块的心跳服务中心维护一个心跳线程; (c2)每一个所述的服务容器均通过所述的控制台变更通知维护一个列表,所述列表中的每一个对象都代表着一个其它的服务容器,每个对象内部都维护一个任务队列; (c2)所述的心跳线程到达设定的心跳间隔时间后,就在所述列表中的每个对象的任务队列中添加一个任务; (c3)所述对象收到任务后,向对应的服务容器发出socket心跳消息; (c4)当socket没有正常返回时,抛出异常,说明本次心跳失败,并将对应的服务容器状态设置为非活动; (c5)当再次向状态为非活动的服务容器发出socket心跳消息,socket正常返回时,将对应的服务容器状态设置为活动; (c6)所述的路由模块丢弃发向非活动的服务容器的消息,并返回异常。
全文摘要
本发明涉及一种计算机软件系统中基于云计算的实时事件处理系统及方法,属于计算机软件应用技术领域。该系统包括SEDA分布式消息框架和Redis核心内存处理框架。利用该系统的方法包括接收消息操作和发送消息操作。通过该方法将分布式消息框架和Redis核心内存处理框架融合,从而可以有效地应对高并发请求与大数据量处理需求,实现复杂的业务逻辑处理流程,满足高吞吐量、低延迟的性能要求,并且有效控制系统资源、提高运行过程的可靠性,达到性能可以分段设计,在一定范围内自由伸缩的目标,适合应用于性能要求苛刻的业务活动监控或准实时分析类系统中,且本发明的计算机软件系统中基于云计算实现实时事件处理的系统及方法,其系统结构简单,应用成本低廉。
文档编号G06F9/44GK102880475SQ20121040767
公开日2013年1月16日 申请日期2012年10月23日 优先权日2012年10月23日
发明者苏阳 申请人:上海普元信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1