DRPC是建立在Storm基本概念(Topology、Spout、Bolt、Stream等)之上的高层抽象,个人理解它的目标是在Storm 集群之上提供一种分布式的RPC框架,以便能够利用Storm快速的实现RPC请求的分布式计算过程,即发起一次RPC请求,多个worker计算节点参与计算,最后汇总后将计算结果返回给客户端。

DRPC实现框架

Storm中使用Thrift作为其RPC框架,同样地,DRPC的实现也是构建在Thrift协议之上,相关的源码文件如下:

1. storm-core/src/storm.thrift,定义了Storm中实现的Thrift协议,其中有两个service是与DRPC相关的:DistributedRPC和DistributedRPCInvocations,它们的接口定义如下:

  • DistributedRPC.Iface:定义了execute方法,用于客户端发起RPC请求;
  • DistributedRPCInvocations.Iface:定义了fetchRequest、failRequest、result方法,分别用于获取RPC请求、将RPC请求标记为失败、返回RPC请求的处理结果。

2. storm-core/src/clj/backtype/storm/daemon/drpc.clj,实现了DRPC的Thrift服务端(即DRPC Server),使用Clojure语言实现。

3. storm-core/src/jvm/backtype/storm/generated/DistributedRPC.java 和storm-core/src/jvm/backtype/storm/utils/DRPCClient.java,作为RPC客户端,实现了 DistributedRPC.Iface接口,用于客户端向DRPC Server发起RPC请求。

4. storm-core/src/jvm/backtype/storm/generated /DistributedRPCInvocations.java和storm-core/src/jvm/backtype/storm/drpc /DRPCInvocationsClient.java,作为RPC客户端,实现了DistributedRPCInvocations.Iface接 口,用于DRPC Topology触发执行DRPC Request并返回结果给DRPC Server。

下图所示是Storm DRPC的整体实现情况。从中可以看出,对于DRPC Server来说,DRPC Client和DRPC Topology都是Thrift的客户端,只是分别调用了不同的Thrift服务而已。

1. 首先,前提是集群上已经运行了DRPC Topology,每个DRPC服务注册了一个RPC方法,包含方法名称和参数形式(上图中假设Topology已经启动运行);

2. 接下来是处理流程,客户端通过DRPCClient调用execute方法,发起一次RPC调用给DRPC Server,目前受限的是只支持一个String类型的DRPC方法调用参数,社区中正在讨论对此进行扩展;

3. 然后,DRPC Server中有一个handler-server pool,用于接收RPC请求,并为每个请求生成唯一的request id,生成一条DRPC Request记录,并放到request queue中等待被消费(计算);

4. 最后,DRPC Topology中的相关模块(DRPC Spout、ReturnResults Bolt,后面会介绍)通过invoke-server pool从request queue中取出该方法的RPC请求,并将处理结果(成功/失败)返回给DRPC Server,直到最终返回给阻塞着的DRPC Client。

DRPC拓扑实现细节

下面以storm-starter项目中的ReachTopology为例,详细介绍Storm中通过LinearDRPCTopologyBuilder构造的DRPC Topology的数据流关系:

其中,DRPC Topology由1个DRPCSpout、1个Prepare-Request Bolt、若干个User Bolts(即用户通过LinearDRPCTopologyBuilder添加的Bolts)、1个JoinResult Bolt和1个ReturnResults Bolt组成。除了User Bolts以外,其他的都是由LinearDRPCTopologyBuilder内置添加到Topology中的。接下来,我们从数据流的流动关系来 看,这些Spout和Bolts是如何工作的:

1. DRPCSpout中维护了若干个DRPCInvocationsClient,通过fetchRequest方法从DRPC Server读取需要提交到Topology中计算的RPC请求,然后发射一条数据流给Prepare-Request Bolt:<”args”, ‘”return-info”>,其中args表示RPC请求的参数,而return-info中则包含了发起这次RPC请求的RPC Server信息(host、port、request id),用于后续在ReturnResults Bolt中返回计算结果时使用。

2. Prepare-Request Bolt接收到数据流后,会新生成三条数据流:

  • <”request”, ”args”>:发给用户定义的User Bolts,提取args后进行DRPC的实际计算过程;
  • <”request”, ”return-info”>:发给JoinResult Bolt,用于和User Bolts的计算结果做join以后将结果返回给客户端;
  • <”request”>:在用户自定义Bolts实现了FinishedCallback接口的情况下,作为ID流发给用户定义的最后一级Bolt,用于判断batch是否处理完成。

3. User Bolts按照用户定义的计算逻辑,以及RPC调用的参数args,进行业务计算,并最终输出一条数据流给JoinResult Bolt:<”request”, ”result”>。

4. JoinResult Bolt将上游发来的<”request”, ”return-info”>和<”request”, ”result”>两条数据流做join,然后输出一条新的数据流给ReturnResults Bolt: <”result”, ”return-info”>。

5. ReturnResults Bolt接收到数据流后,从return-info中提取出host、port、request id,根据host和port生成DRPCInvocationsClient对象,并调用result方法将request id及result返回给DRPC Server,如果result方法调用成功,则对tuple进行ack,否则对tuple进行fail,并最终在DRPCSpout中检测到tuple 失败后,调用failRequest方法通知DRPC Server该RPC请求执行失败。

DRPC整体工作流程

最后,将以上两个小节的内容合并起来就可以看到Storm中DRPC的整体工作流程了,如下图所示:

参考资料链接

1. https://github.com/apache/incubator-storm

2. https://github.com/nathanmarz/storm-starter

Storm DRPC实现机制分析的更多相关文章

  1. 理解storm的ACKER机制原理

    一.简介:       storm中有一个很重要的特性: 保证发出的每个tuple都会被完整处理.一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所产生的所有的子tuple都被成 ...

  2. 【原】Storm 消息处理保障机制

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  3. Storm(三)Storm的原理机制

    一.Storm的数据分发策略 1. Shuffle Grouping 随机分组,随机派发stream里面的tuple,保证每个bolt task接收到的tuple数目大致相同. 轮询,平均分配 2. ...

  4. storm的acker机制

    一.简介: storm中有一个很重要的特性: 保证发出的每个tuple都会被完整处理.一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所产生的所有的子tuple都被成功处理.如果 ...

  5. Linux mips64r2 PCI中断路由机制分析

    Linux mips64r2 PCI中断路由机制分析 本文主要分析mips64r2 PCI设备中断路由原理和irq号分配实现方法,并尝试回答如下问题: PCI设备驱动中断注册(request_irq) ...

  6. Storm的ack机制在项目应用中的坑

    正在学习storm的大兄弟们,我又来传道授业解惑了,是不是觉得自己会用ack了.好吧,那就让我开始啪啪打你们脸吧. 先说一下ACK机制: 为了保证数据能正确的被处理, 对于spout产生的每一个tup ...

  7. IOS Table中Cell的重用reuse机制分析

    IOS Table中Cell的重用reuse机制分析 技术交流新QQ群:414971585 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITab ...

  8. 您还有心跳吗?超时机制分析(java)

    注:本人是原作者,首发于并发编程网(您还有心跳吗?超时机制分析),此文结合那里的留言作了一些修改. 问题描述 在C/S模式中,有时我们会长时间保持一个连接,以避免频繁地建立连接,但同时,一般会有一个超 ...

  9. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

随机推荐

  1. NYOJ题目34韩信点兵

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAHiCAIAAACV1MbSAAAgAElEQVR4nO3dPXLjONeG4W8TyrUQx1 ...

  2. Hbernate映射类型

    对应oracle中的数据库:用timestamp

  3. Java之POJO

    转: POJO    一:什么是POJOPOJO的名称有多种,pure old java object .plain ordinary java object 等.按照Martin Fowler的解释 ...

  4. case/casez/casex 的区分与使用

    参考:http://www.cnblogs.com/poiu-elab/archive/2012/11/02/2751323.html 与  verilog数字系统设计基础 一般来说,使用最多的是CA ...

  5. java的final用法

    转自:http://blog.163.com/maomaoyu_1012/blog/static/19060130520116269329894/ 1.         修饰基础数据成员的final ...

  6. 使用 Laravel 框架:成为微信公众平台开发者

    转: http://ninghao.net/blog/1441 作者:王皓发布于:2014-05-30 13:16更新于:2014-05-31 12:05 我们可以使用Laravel 框架为微信公众平 ...

  7. 手机站点动态效果插件TouchSlide

    今天看到TouchSlide插件,觉得非常不错,关于使用情况请看demo,下载地址:http://www.superslide2.com/TouchSlide/downLoad.html

  8. Shell编程基础教程7--脚本参数的传递

    7.脚本参数的传递    7.1.shift命令        简介:            shift n        每次将参数位置向左偏移n位        例子 #!/bin/bash us ...

  9. Pyqt 打开外部链接的几种方法

    Pyqt 触发一个事件,打开外部链接,我找到了这个方法,供大家参考 1. QDesktopServices 的openUrl 方法 QtGui.QDesktopServices.openUrl(QtC ...

  10. Solr入门之(2)快速启动:第一个例子

    Solr作为一个web应用来启动,因此需要JDK支持,需要WEB容器,本文环境如下: JDK6.0或以上(环境变量设置等不再赘述) Tomcat-6.0.35或以上(自行下载) apache-solr ...