漫谈分布式系统:三种通信范型

0x00 前言

通信 是分布式系统中至关重要的一环!虽说我们在日常编写MapReduce和Spark程序的时候不需要考虑进程间之间的通信、搭建Zookeeper和Cassandra集群的时候也不用考虑节点之间的通信。但这只是因为有人已经帮我做好了这些工作,比如Hadoop定制的RPC协议、Zookeeper实现的Paxos算法、Cassandra用来做故障节点检测的Gossip协议,有很多很多这样有趣的东西等着我们。

如果想真正地掌握这些系统,就不得不探究这些它们背后的技术原理和设计思想。本篇是关于分布式系统的通信范型的。

0x01 通信范型

communication_1.png

1. 进程间通信

进程间通信是指用于分布式系统进程之间通信的相对底层的支持,包括消息传递元语、直接访问由互联网协议提供的API(套接字编程)和多播通信的支持。

2. 远程调用

远程调用代表分布式系统中最常见的通信范型,覆盖一系列分布式系统中通信实体之间基于双向交换的技术包括远程操作、过程或方法。

远程调用最常见的方式有请求-应答模式、远程过程调用和远程方法调用。

请求-应答协议

请求-应答协议是一个有效的模式,它加在一个底层消息传递服务之上,用于支持客户-服务器计算。

注意: 这种模式相对比较原始,在嵌入式系统和HTTP协议中使用较多。但是在大多数分布式系统中,会选择远程过程调用或者远程方法调用。

远程过程调用(Remote Procedure Call, RPC)

在RPC中,远程计算机上进程中的过程能被调用,好像它们是在本地地址空间中的过程一样。

通俗点讲,如果我们想调用远程机器上的代码需要自己做不少工作,比如如何通信、如何调用、如果获取返回结果、返回的结果怎么嵌入到我们现在的代码中?

RPC帮我们完成了上面的工作,我们像调用本地的服务那样调用远程的服务,然后返回结果。一切处理逻辑看起来就像是在本地一样。准确的定义和使用方法可以Google一下。

再提一下RPC的原理,一个RPC框架主要分下面几部分:

communication_2.png

调用过程主要如下:

  1. User的Local Call,User想调用RPC的服务时,先发起一个调用Client端User Stub的请求。
  2. Client端的User Stub接收到请求后,负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPC Runtime 实例传输到远端的实例。 然后等待远端返回结果。
  3. Server Stub 负责将接收到的数据解码并交给Server端的程序来执行,最后将结果数据返回。
  4. 结果数据通过 RPC Runtime 传回到Client。

Hadoop自身的RPC的服务就是一个典型的PRC例子。

远程方法调用(Remote Method Invocation, RMI)

远程方法调用非常类似远程过程调用,但它应用于分布式对象的环境。用这种
方法,一个发起调用的对象,能够调用一个远程对象中的方法。与RPC一样,底层的细节都对用户隐藏。

在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。

3. 间接通信

间接通信的一个特点就是,这些技术会支持通过第三个实体,允许发送者和接受者之间的深度解耦合。比如说Kafka就算是一个典型的间接通信的技术,它算是一种消息队列的实现,也可以当做发布-订阅系统来使用。

间接通信主要会来考虑来处理两种场景:

  • 空间解耦合:发送者不需要知道他们发送给谁
  • 时间解耦合:发送者和接收者不需要同时存在

间接通信的关键技术主要包括:

  • 组通信
  • 发布-订阅系统
  • 消息队列
  • 元组空间
  • 分布式共享内存(DSM)

发布-订阅系统和消息队列

目前常见的消息队列中间件产品包括ActiveMQ、ZeroMQ、RabbitMQ和Kafka。一般的消息中间件都会支持两种模式的队列,即发布-订阅系统和消息队列。

消息队列模式即消息生产者将消息存入队列,消息消费者从队列消息消息,发布-订阅系统则是消息生产者将消息发布到指定主题的队列中,而消息消费者订阅指定主题的队列消息,当订阅的主题有新消息时,消息消费者可以通过Pull或者消息中间件通过Push的方式将消息消费掉。

0XFF 总结

漫谈,也就是随便聊聊。有些内容也没怎么细致地看,比如间接通信的内容,就有点薄弱。不过这也算是先有一个整体的意识。后面慢慢补起来。

参考


作者:dantezhao |简书 | CSDN | GITHUB

个人主页:http://dantezhao.com
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 68,844评论 12 116
  • 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:R...
    猿码道阅读 2,387评论 3 65
  • 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:R...
    Fredia_Wang阅读 247评论 0 4
  • 分布式系统面临的第一个问题就是数据分布,即将数据均匀地分布到多个存储节点。另外,为了保证可靠性和可用性,需要将数据...
    olostin阅读 2,103评论 1 19
  • 有人的地方,就有江湖有江湖的地方,就有纷争 问题的起源在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式...
    linking12阅读 1,577评论 0 36