http://note.youdao.com/share/?id=d2163a7ba8ec1ec58e64683a961c5121&type=note

RPC是OB一个比较重要的各个组件间进行通信的实现机制。最近在看clog的代码,就顺着ObCLogRpc这个类,简单总结下OB进行RPC的几种写法,主要偏重于写代码和理解已有代码,不涉及到底层的RPC实现机制。
 
曲山的OB代码导读 5.3.2节客户端部分介绍了ObRpcStub,建议先行阅读。
 
后边是当前OB实现RPC的几种典型写法:
 
客户端
ObCLogRpc、ObUpsRpcStub和ObRootRpcStub都继承自common::ObCommonRpcStub,common::ObCommonRpcStub提供一些基础的RPC实现,其继承自ObGeneralRpcStub,ObGeneralRpcStub继承自ObRpcStub,后者封装了RPC的底层实现,包括ObClientManager的一个指针类型成员rpc_frame_。
客户端实现rpc的几种典型写法如下:
1)rpc_frame_ -> send_request
典型实现参考ObCommonRpcStub :: send_log,是一个同步调用方式。
 
2)rpc_frame_ -> post_request
典型实现参考ObCLogRpc::post_log,此实现是一个异步调用方式,需要在post_request中指明接收到响应后回调使用的handler;
 
3)调用send_*_return_*函数,是个同步调用方式,具体可参见OB代码导读相关章节,举例如下:
 int ObCommonRpcStub :: renew_lease(const common::ObServer& master, const common::ObServer& slave_addr, const in t64_t timeout_us)
{
  return send_1_return_0(master, timeout_us, OB_RENEW_LEASE_REQUEST, DEFAULT_VERSION, slave_addr);
}
 
4)调用send_param_*/deserialize_result_*两个配对的宏,具体实现可参考ObGeneralRpcStub::register_server,也是一个同步调用方式。
 
其实后两者就是调用1)来完成的,这些宏会进行展开,直接传递基础数据类型或是调用输出输出参数的serialize/deserialize方法进行序列化、反序列化后传递。
 
 
服务端
服务端的调用方式都是统一的。每个RPC调用都对应一个packet_code,在server的init_func_array函数中,使用宏REGISTER_HANDLE_FUNC注册特定类型的包(也即特定类型的RPC接口)的处理函数,如上文列出的ObCommonRpcStub :: renew_lease宏,其注册方式即为在ObRootWorker类的init_func_array函数中调用:
REGISTER_HANDLE_FUNC(OB_RENEW_LEASE_REQUEST, &ObRootWorker::rt_renew_lease);
 
然后在server的handler_packet中写上此类型包是由IO线程直接处理还是交给特定的worker线程处理。
 
所有注册的处理函数接口都是一致的,接受的都是ObRequestContext& context类型的参数,表示网络包。
 
收到包后如何处理可以参见ObRootWorker::rt_renew_lease,无非就是从网络包中反序列化输入参数,根据参数调用业务逻辑进行处理,然后将结果打包使用send_response方法返回给客户端。

OceanBase RPC机制简要说明的更多相关文章

  1. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  2. Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  3. 理解Android系统的进程间通信原理(二)----RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  4. 每天收获一点点------Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  5. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  6. Hadoop2源码分析-RPC机制初识

    1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...

  7. hadoop的RPC机制 -源码分析

    这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...

  8. Hadoop中的RPC机制

    1.  RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI ...

  9. Hadoop的RPC机制源码分析

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...

随机推荐

  1. ASP.NET Core 源码阅读笔记(3) ---Microsoft.AspNetCore.Hosting

    有关Hosting的基础知识 Hosting是一个非常重要,但又很难翻译成中文的概念.翻译成:寄宿,大概能勉强地传达它的意思.我们知道,有一些病毒离开了活体之后就会死亡,我们把那些活体称为病毒的宿主. ...

  2. TypeScript开篇:尝点新鲜和甜头

    返回TS学习总目录 快速开始 我们通过创建一个简单的web应用来开始使用TypeScript.获得TS工具的方法主要有两种,一种是通过NPM(Node包管理器),另一种是通过VS2012安装TS的插件 ...

  3. MyEclipse 8.5 优化实例

    在用[MyEclipse] 写代码很容易卡死机,尤其是在对JSP文件的<%%>之间写代码的时候,只要一弹出智能提示就立刻卡死,程序失去响应,我以为是MyEclipse版本的问题,结果换了6 ...

  4. 团队项目 SRS文档

    一:实验内容:用例模型的建立 简介: 图书管理系统是使用计算机实现图书大量信息处理的电子档案管理系统,在本系统中主要满足借书者.图书管理员和系统管理员3方面的需求.对借书者来说主要是查询个人信息.查询 ...

  5. iOS 字典自动生成模型

    在实际开发中,我们经常需要根据字典来建模型.每次都打那么一串代码,想想也是挺恶心的.可以自己给NSDictionary写一个分类,进行属性生成. NSDictionary+Property.h #im ...

  6. django with mysql (part-2)

    step01: write a ( views.py ) file vim views.py Insert the below code : step02: configure your ( urls ...

  7. atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

    atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服 ...

  8. HTML+CSS纯干货就业前基础到精通系统学习2016/9/3

    1:HTML纯干货学习后的达到的效果 (1):会使用HTML的基本结构,创建网页 (2):会使用文本字体相关标签,实现文字修饰和布局 (3):会使用图像.超链接相关标签,实现图文并茂的页面 (4):会 ...

  9. Leetcode 125 Valid Palindrome 字符串处理

    题意:判断字符串是否是回文字符串 先将所有的字母和数字字符保留,并将大写字母转化成小写字母,然后将字符串倒置,比较前后两个字符串是否相同. 该题最好的解法可以模仿 Leetcode 345 Rever ...

  10. Leetcode 206 Reverse Linked List 链表

    将单向链表反转 完成如图操作,依次进行即可 1 2 3 /** * Definition for singly-linked list. * struct ListNode { * int val; ...