分布式实时处理系统——通信基础

【前言】分布式主要应用在云计算、大数据等需要多机协作的场景。大数据对应分布式存储,云计算对应分布式计算?但是二者一般交叉出现。分布式技术或者说分布式实时处理系统可看成将分布式计算和存储结合起来。大规模的视频图像处理,单机或者少核算力不够,需要分布式系统。万物互联的时代,分布式系统会有更大的应用场景。

  此文是《分布式实时处理系统 原理、架构与实现》(卢誉声)的读书笔记。

一、分布式技术概述

  分布式就是将一个大的计算任务,分配到节点上进行并行运算,并回收节点运行结果。其中涉及到节点的分布式存储,CAP原理。

    1、分布式计算

    一般步骤:

  1. 设计分布式计算模型;系统中各个组件如何运行,组件之间如何进行消息通信;
  2. 分布式任务的分配:一个大的任务怎样分配到各个节点运行;
  3. 编写并行分布式程序:怎样编程实现高性能并行运算。

  其中,有两个核心的问题:计算任务的分配和多节点之间的通信。

  2、分布式存储一般指非关系型数据库,如mongodb

    常见 的分布式计算系统:apache 的hadoop、spark、storm(实时处理能力)

二、分布式系统通信基础

  本章节主要介绍了TCP/IP协议的设计由来,角度新奇可以一看,帮助理解。

  在一个去中心化的通信网路中,任意两点之间通信不可能只依靠数据链路层和物理层,因为这样需要架设专用的物理链路,那怎么实现“寻路”呢?在计算机世界中,面对这种“高复杂性”问题,解决此类问题的惯性思维就是加入中间层。于是才有了网络层负责寻找目标节点并规划路径。

  1、其中还有具体保证可靠链路的方法,在链路层有数据分组、帧同步、差错控制和链接管理等(P17)。

  2、网络层主要任务就是路由和转发,就是寻找一条转发数据包的路径,称之为路由算法。路由算法一般分为两类:链路状态算法和距离向量算法。前者要确认物理连接的机器节点ID并测量到每个节点的时间长度,然后在网图中会用Dijkstra算法来计算最短路径。后者每个节点建立路由表,记录当前节点到其他节点的权值并定时更新。此方法消耗资源少,处理速度快,且路由表最后是收敛的。进一步,可以将节点分组,每个地区只需要一个大组,组内的节点只需要记录组内成员的ID或者路由表信息即可,对外以组提供统一接口。

  3、TCP/IP四层协议(略)

  4、基于TCP/IP协议即可构建一个分布式、健壮的网络。基于此,我们可以开发自己的应用程序来实现客户端与服务端通信。一个非常出名的实例MapReduce,map是将庞大的计划分成小的计算任务,reduce 将计算结果汇总。map和reduce节点之间通信是基于HDFS分布式文件系统,HDFS提供反向代理负载均衡服务。

三、通信系统高层抽象

  1、分布式节点中运行着不同的程序,每个程序最基本的单元就是一个函数。如果在一个节点想调用另一个节点的函数怎么办?使用远程过程调用,RPC技术。(可以像调用本地方法一样调用远程服务器提供的函数)

  (1)、RPC和HTTP的区别

       (2)、为什么需要RPC,而不是简单的HTTP接口?(有些应用场景)

  • RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现。所以楼主可以换一个问法,为何RPC还有除HTTP 之外的实现方法有何必要?因为除了HTTP实现外,私有协议不具备通用性。那么我想唯一的答案就在于HTTP不能满足其业务场景的地方,所以这个就要具体 案例具体分析了。

  • http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议 进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑

  • RPC是一个软件结构概念,是构建分布式应用的理论基础。就好比为啥你家可以用到发电厂发出来的电?是因为电是可以传输的。至于用铜线还是用铁丝还是其他 种类的导线,也就是用http还是用其他协议的问题了。这个要看什么场景,对性能要求怎么样。比如在java中的最基本的就是RMI技术,它是java原 生的应用层分布式技术。我们可以肯定的是在传输性能方面,RMI的性能是优于HTTP的。那为啥很少用到这个技术?那是因为用这个有很多局限性,首先它要 保证传输的两端都要要用java实现,且两边需要有相同的对象类型和代理接口,不需要容器,但是加大了编程的难度,在应用内部的各个子系统之间还是会看到 他的身影,比如EJB就是基于rmi技术的。这就与目前的bs架构的软件大相径庭。用http必须要服务端位于http容器里面,这样减少了网络传输方面 的开发,只需要关注业务开发即可。所以在架构一个软件的时候,不能一定根据需求选定技术。

  2、RESTful

  一种架构风格,使用URI表示每个资源,基于表现层通信。

  3、消息队列

    IPC

  4、序列化

  语言的序列化和反序列化与语言自身的二进制存储布局有关,那么如何实现跨平台跨语言的反序列化?

  (1)对内部数据;XML,JSON库,google的Protobuf等。仅仅是对数据的统一,不同语言的接口实现也需要个性化,较麻烦。

  (2)完整的跨平台RPC体系,不仅对数据,功能接口也是和语言无关的;Thrift

    书中用Thrift的IDL编写代码,命令自动生成C++服务器端 类socket程序。注意:服务器端的“功能方法” 传入的是一个传入传出参数,可在被客户端远程调用之后自动更新到客户端的传入参数。

原文地址:https://www.cnblogs.com/huangfuyuan/p/10140100.html