一种基于Redis的Storm的远程调用方法与流程

文档序号:11949836阅读:1788来源:国知局
一种基于Redis的Storm的远程调用方法与流程

本发明涉及远程调用,尤其是涉及一种基于Redis的Storm的远程调用方法。



背景技术:

Storm是一个分布式的,可靠的,容错的数据流处理系统。它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务。Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt,bolt要么把数据保存到某种存储器,要么把数据传递给其它的bolt。一个Storm集群就是在一连串的bolt之间转换spout传过来的数据。

RPC(Remote Procedure Call Protocol)为远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

Storm也提供RPC接口实现,但Storm RPC存在诸多问题。原因如下:RPC请求消息是放在RPC Server内存队列中,在请求量大时,内存需要缓存大量数据,对内存造成很大的负担,造成巨大的瓶颈。虽然Storm集群可以启动多个RPCServer,但单个客户端一次只能选择连接一个目标Server。多个Server之间并没有做负载均衡。如果一个Server故障,客户端需要重新连接另外一个Server,并重新调用。



技术实现要素:

本发明的目的是针对上述问题提供一种避免数据缓存量过大、防止单点故障以及可靠性高的基于Redis的Storm的远程调用方法。

本发明的目的可以通过以下技术方案来实现:

一种基于Redis的Storm的远程调用方法,调用客户端利用消息队列和Redis对Storm实现远程调用,其特征在于,所述方法包括下列步骤:

1)调用客户端发送请求消息至消息队列;

2)Storm从消息队列中获取请求消息并进行处理;

3)Storm将处理后的消息结果放入Redis中;

4)调用客户端从Redis中获取步骤3)中处理后的消息结果。

所述步骤3)采用LPUSH命令将处理后的消息结果放入Redis中,具体为:

31)查找key对应的变量,若该变量不存在,则进入步骤32),若该变量存在,则进入步骤33);

32)创建一个空列表,并与key对应;

33)判断与key对应的变量是否为列表类型,若否则返回错误,若是则进入步骤34);

34)将指定值插入到key对应的变量的头部。

所述步骤4)采用BLPOP命令从Redis中获取处理后的消息结果,具体为:

41)查找key对应的变量,若该变量不存在或该变量对应的列表为空列表,则返回步骤41),否则进入步骤42);

42)弹出key对应的第一个变量的头元素,并和key一起组成结果返回给调用者。

所述消息队列包括基于Kafka的队列。

所述消息含有MessageID。

与现有技术相比,本发明具有以下有益效果:

(1)Storm只用于做流式处理,处理消息可以来自于消息队列(如Kafka等),解决了RPC Server的数据缓存内存瓶颈。

(2)客户端交互的是消息队列(如Kafka)和Redis,不存在RPC Server一次调用中的单点故障,有更高的可靠性。

(3)采用LPUSH命令,在将消息结果放入Redis中时,如果找不到目标对象将会及时报错。

(4)采用BLPOP命令,从Redis中取消息结果时,若果Redis中暂时没有存放的消息结果时保持堵塞,避免误取数据。

(5)消息队列可以选择Kafka,也可根据实际情况选择其他消息队列,实用性能强。

(6)调用客户端发给Stom处理的每条记录都有一个唯一的MessageID,避免数据出现重复或错误。

附图说明

图1为Storm的组件示意图;

图2为本发明的方法示意图。

具体实施方式

下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。

如图1所示,Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt,bolt要么把数据保存到某种存储器,要么把数据传递给其它的bolt。一个Storm集群就是在一连串的bolt之间转换spout传过来的数据。

因此要实现Storm的远程调用,可以利用Storm的RPC接口,但这种方式的性能较差。如图2所示为本发明提出的基于Redis的Storm的远程调用方法,调用客户端利用消息队列和Redis对Storm实现远程调用,该方法包括下列步骤:

1)调用客户端发送消息至消息队列;

2)Storm从消息队列中获取消息并进行处理;

3)Storm使用LPUSH命令将处理后的消息结果放入Redis中;

4)调用客户端使用BLPOP命令从Redis中获取步骤3)中处理后的消息结果。

其中,LPUSH命令具体为LPUSH key value[value...],它是将所有指定的值插入到存于key的列表的头部。如果key不存在,那么在进行push操作前会创建一个空列表。如果key对应的值不是一个list的话,那么会返回一个错误。

而BLPOP命令具体为BLPOP key[key...]timeout,当BLPOP被调用时,如果给定key内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字key一起,组成结果返回给调用者。也就是说,调用BLPOP命令会堵塞一直到能取到key。

因此在调用客户端对Storm进行远程调用时,首先对发送的消息都记录一个唯一的ID即MessageID,然后将该消息发送给消息队列(如Kafka),Storm从消息队列中获取消息并对该消息进行处理。处理后,Storm使用LPUSH命令把结果放入到Redis中,具体的指令为LPUSH MessageID结果,调用客户端则通过BLPOP命令从Redis中获取数据,具体的指令为BLPOP MessageID超时时间。通过上述流程,调用客户端可以远程调用Storm为其处理消息,同时无需使用Storm的RPCServer,也就避免了内存中缓存大量数据造成性能瓶颈,同时也避免了一个Server故障导致需要重新连接另一个Server并重新远程调用这类问题。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1