目录
分布式通信主要研究分布式系统中不同构件(子系统或者进程)之间的信息交换机制:
- 远程过程调用(RPC)
- 消息队列
- 多播通信
一、远程过程调用(RPC)
概念
许多分布式系统是在进程间显式地进行消息交换,RPC即可简化这一通信过程。
RPC允许调用位于网络中其他机器上的进程。
机器A上进程调用机器B上进程时,A上进程被挂起,B上被调用进程开始执行,调用方可以通过参数将信息传递给被调用方,然后通过B上的进程返回的结果得到所需的信息。
RPC就是要像调用本地的函数一样去调用远程函数。
RPC过程中存在哪些新问题?
- 客户端怎么告诉远程机器要调用哪个函数? 函数指针—>函数ID
- 客户端怎么把参数值传给远程的函数? 序列化、反序列化
- 数据如何传输? 网络传输协议
函数 Call ID
在RPC中,所有函数都必须有自己的一个ID。在所有进程中唯一确定。
在客户端和服务端分别维护一个对应表(函数/Call ID)。两个表不用完全相同,但是函数和Call ID对应关系必须相同。
Call ID映射可以时函数字符串,也可以使用整数ID。映射表一般是一个哈希表。
也称为服务寻址,通过服务注册中心实现。调用服务时也通过服务注册中心查询对方服务有哪些实例。
序列化与反序列化
实现高效的数据存取与通信。
属于通讯协议的一部分。
序列化:将数据结构或对象转换成二进制串的过程;
反序列化:将序列化生成的二进制串转换成数据结构或者对象的过程。
Protocol Buffer:一种支持多平台、多语言、可扩展的数据序列化机制。
网络传输协议
网络传输层 需要把Call ID和序列化后的参数字节流传给服务端,再把序列化后的调用结果传回客户端。
可以使用TCP、UDP、HTTP等。
Netty:利用Java的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的API的网络编程(客户端/服务端)框架;能编程自定义各种协议;能通过codec来编码/解码字节流;基于NIO开发的网络通信框架。
阻塞式IO、非阻塞IO:
RPC框架
RPC框架隐藏下层的具体通信过程,大大简化并透明化了网络间进程调用过程。