java分布式学习

赞同 105 反对,不会显示你的姓名
java分布式学习_第1张图片 林建入 软件设计
徐言、林谷、沈建凯 等人赞同
题主问的是 Java,不过这个问题其实不局限于 Java,因此我试着以“分布式”本身来回答。 一、三个步骤完成华丽转身——任意软件变为“分布式”分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。… 显示全部
题主问的是 Java,不过这个问题其实不局限于 Java,因此我试着以“分布式”本身来回答。

一、三个步骤完成华丽转身——任意软件变为“分布式”


分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。但很可惜,这玩意儿一点也不复杂,甚至有些“简单”。不信?你只要遵循下述步骤即可将任何一个软件拆分为“分布式”的:
  1. 将你的整个软件视为一个系统(不管它有多复杂)
  2. 将整个系统分割为一系列的 Process(进程), 每个 Process 完成一定的功能
  3. 将这些 Process 分散到不同的机器上。分散后,选择若干种(没错一种可能不够)通信协议把他们连接起来
蹬蹬蹬蹬~大功告成。哈哈别打我,这真的是很严肃的通用型三步骤大杀器,对付任何软件,是任何软件都可以的。接下来我当然要解释清楚为什么。

二、跳出误区——分布式不等于并行计算

人们常常把分布式系统自然而然的和并行计算联系起来。然而这并不正确。实际上,分布式系统并不一定是并行的,举个简单的例子就能理解——

某软件,功能如下:
  1. 提示用户输入两个数 A 和 B
  2. 在内部,对 A 和 B 执行某数学运算,获得 C
  3. 输出 C
很简单吧?这三个步骤是无法并行的。它们需要被依次执行。但是这个软件依然可以被改为分布式的,方法就是用前面提到的方法,把步骤 2 的计算过程独立为一个 Process 移动到另外一台计算机上完成。

如果我们从整个系统流程的观点来看,并没有什么并行。整个过程都是顺序执行的。只不过执行时出现了“跨设备”的现象而已。可见,分布式本身就只如其字面意思所指,指的仅仅是从结构角度的分散而已。

当然啊,现实世界中,我们更多的时候钟情于分布式,还是因为它与并行之间可以相互配合。例如实现既是分布同时也是并行的系统。

好了,理解这一点之后就不难解释为什么我会说前文提到的三步骤是万用大法了。接下来我们继续讨论分布式本身。

三、拆分+连接是分布式系统的本质

所谓分布式,无非就是”将一个系统拆分成多个子系统并散布到不同设备“的过程而已。

本质上而言,实现一个分布式系统,最核心的部分无非有两点:
  1. 如何拆分——可以有很多方式,核心依据一是业务需求,二是成本限制。这是实践中构建分布式系统时最主要的设计依据。
  2. 如何连接——光把系统拆开成 Process 还不够,关键是拆开后的 Process 之间还要能通信,因此涉及通信协议设计的问题,需要考虑的因素很多,好消息是这部分其实成熟方案很多

四、为什么你要使用分布式?

分布式系统并非灵丹妙药,解决问题的关键还是看你对问题本身的了解。通常我们需要使用分布式的常见理由是:
  • 为了性能扩展——系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力
  • 为了增强可靠性——软件不是完美的,网络不是完美的,甚至机器本身也不可能是完美的,随时可能会出错,为了避免故障,需要将业务分散开保留一定的冗余度
在以提供 Service 为主的服务端软件开发过程中常常遇到这些问题。

五、一些分布式方案能解决你的问题,另一些却不能,要学会的其实是选择

笼统的讨论分布式没有太大的意义,就如我刚才所谈的,实际上分布式很容易实现。真正难的地方在于如何选择正确的分布方案。

例如,当你想要建立一个分布式的数据管理系统的时候,你就必须得面对“一致性”问题。如果你对数据一致性要求很高,你就不得不容忍一些缺陷例如规模伸缩困难;而如果你放弃它,你可以轻松伸缩规模,但你必须解决好由此带来的一系列数据不一致导致的问题。(CAP 问题)

于是你会意识到,有许多种分布方案,为了正确解决你的问题,你需要对每一个方案都进行了解,并评估,选择不同的方案有时候区别不大,有时候却会深刻的影响整个系统中其他部分的工作方式,甚至影响用户界面中用户操作时的流程。这是我们学习分布式系统的重点所在。

六、分布式学习入门——基础知识要点

如我前面所讲,分布式入门不难。主要包含如下知识点:
  • Process(进程)。在分布式系统中,进程是基本单元
  • 通信协议。Process 间需要相互配合才能完成工作,因此通信协议是最基本要解决的问题。这部分其实挺复杂,牵涉面光,不过核心还是抓住两方面,一是存在哪些需求,二是各个协议如何满足这些需求
  • 命名法。两个 Process 要通信,必须相互知道对方的名字,名字可以是数字,也可以是结构化的字符串。例如众所周知域名系统就是一种命名方案,但是方案还有很多,各有特点
  • 协作。上面都在谈 Process 之间的通信,可是为什么要通信?因为要协作。协作是个复杂的主题,其中最基本最基本的一个问题就是同步问题。而聊同步问题必然要聊“锁”……知识点就这么展开了
上面几点是最基础的知识。了解了这些其实就算入门了。可是如何进阶呢?那么必然要开始学习下面的问题:
  • 一致性。数据存储时,最基本的问题。其实也是实际设计系统时常常需要反复考虑的问题
  • 容错。冗余是容错的基础,但并不是全部,分布式本身为实现容错提供了一些便利,这也是实际设计系统时常常需要考虑的问题
好了,如果这些你都学的差不多了,那咱们“纸上谈兵”也就告一段落了。接下来进入实战演练。

七、实战演练?其实你已经开发过分布式系统了

你有没有开发过简单的增删改查软件?这类软件通常都需要搭配一个独立的数据库管理系统共同完成功能。实际上,只要你开发过这么简单的软件,那么你就已经开发过分布式系统了。
“什么,基于数据库管理系统开发出来的软件就可以算分布式呀?我做了很多这类软件,怎么我从来没听过这种说法?
真的,我没开玩笑。还记得我们前面提到的吗,什么是分布式?不就是一个大系统拆分成多个小系统分散到不同的设备上吗。回想一下,当你写一个简单的增删改查软件时,只要用到数据库管理系统,是不是具有如下特点:
  • 整个系统中,你写的代码跑在 A 进程里,而数据库管理系统则跑在另外一个进程 B 里
  • A 进程与 B 进程通过某种通信协议连接
  • 既可以使 A 进程与 B 进程运行在同一台机器上,也可以将它们分开运行于不同的机器上,并且系统依然可以照常运行
你看,这不就是分布式系统的特点吗?
“啊,原来如此,可是我印象里一说分布式的话,应该会讲「集群」啊啥的吧,这么简单的也算?”
关于「集群」的问题我们之后会谈到,它也是分布式系统的一个应用,但谈集群的时候,我们谈的往往是更具体的东西。但咱们看问题,需要抓住本质。别看麻雀小,五脏却俱全。

不过,你已经熟悉的东西,我们在这里就不再展开了,我们不妨关注其他一些更有趣的话题。

八、实现一个简单的 Remote Procedure Call (远程过程调用)系统

(未完)
编辑于 2015-08-02 15 条评论 感谢
分享
 
收藏 没有帮助
举报
 
作者保留权利 收起
用心阁 软件工程师
郭春阳、sofn le、蒋维 等人赞同
分布式计算就是通过计算机网络将计算工作分布到多台主机上,多个主机一起协同完成工作。我试着列一下相关知识吧。网络通讯,网络是分布式的基础,对分布式的理解建立在对网络的理解上,包括:OSI模型的7层TCP/IP,DNS,NATHTTP,SPDY/HTTP2Telnet网络编程,… 显示全部
分布式计算就是通过计算机网络将计算工作分布到多台主机上,多个主机一起协同完成工作。

我试着列一下相关知识吧。
  • 网络通讯,网络是分布式的基础,对分布式的理解建立在对网络的理解上,包括:
    • OSI模型的7层
    • TCP/IP,DNS,NAT
    • HTTP,SPDY/HTTP2
    • Telnet
  • 网络编程,是通过程序在多个主机之间通信。包括:
    • Socket
    • 多线程
    • 非阻塞IO
    • 网络框架
      • Netty
      • Mina
      • ZeroMQ
  • 操作系统的网络部分
  • RPC,Socket使用不是很方便,很多分布式应用是基于RPC的,包括:
    • 同步RPC
    • 异步RPC
    • 主要的一些RPC协议
      • RMI
      • Rest API
      • Thrift
  • 集群,分布式计算离不开集群。集群就是多台主机被当作一个系统
    • 集群类型
      • 高可用,如主机备机切换,冷备,热备,双活
      • 伸缩性,如Web服务器集群,数据库服务器的Sharding
      • 并行计算,如网格,大数据
    • 集群相关技术,包括:
      • 高可用性,保证服务一直能够被访问,延长MTBF,缩短MTTR
        • 冗余的设备
        • 多副本,为了避免单点失效
      • 负载均衡,如何将大量工作负载分配到多个主机上,最大化吞吐量,最小化平均响应时间,最大化资源利用率。
      • 伸缩性(横向),能够添加计算机和设备来应对增长的计算压力
      • 分片(Sharding),把数据分成多个数据集,由多个服务器来分别处理。
        • 自动分片
      • 容错性,当硬件或软件发生故障,能够继续运转
      • 故障检测,以及故障预测
        • 心跳包
        • 告警
        • 性能预警
      • 故障转移,当出现错误,如何解决,为了高可用性和容错性
      • 分布式一致性,在分布式环境中如何维持状态的一致性,严格一致性,还是最终一致性
      • 集群状态协调,如Zookeeper,etcd等。
        • 分布式锁,在分布式环境中如何进行加锁
        • 选主,当Master宕机,如何选择出新的Master,协议如Raft
      • 一致性哈希,如何将数据分布到集群中的多个主机。
      • 分布式事务,保证在多台服务器上完成的操作符合事务的ACID属性。
  • 安全,网络通常需要保证安全。
    • 身份认证,如何验证人或机器是他们声明的身份
      • 基于用户名/口令
      • 基于数字证书
    • 私密性,如何防止窃听和嗅探
      • 对称加密
      • 非对称加密
    • 完整性,如何保证数据不被篡改
      • 安全散列
      • 消息认证码(MAC)
    • 不可否认性
      • 基于数字证书的数字签名和验签
      • 基于密钥的散列,如HMAC
  • 互联网站的基本架构
    • 页面缓存
    • 负载均衡器,如HAProxy,Nginx
    • 分布式缓存,如Memcache,Redis
    • 消息队列,如ActiveMQ,Kafka
  • 分布式框架
    • 关系型数据库(Sharding,主从同步)
    • NoSQL
      • HBase,基于HDFS和Zookeeper的NoSQL
      • Cassandra,无主集群
    • 大数据
      • HDFS,分布式文件系统
      • MapReduce,将数据处理任务拆分为多个工作,通过集群来完成。
      • Spark,提供分布式的数据集抽象

你可能感兴趣的:(java分布式学习)