java分布式学习

article/2025/9/16 3:10:44
林建入 软件设计
徐言、林谷、沈建凯 等人赞同
题主问的是 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,提供分布式的数据集抽象

http://chatgpt.dhexx.cn/article/YCWNQMYQ.shtml

相关文章

耗时十年!精心整理的Java高级开发需要的分布式技术

前言 分布式、微服务几乎是现在的技术人员必须要了解的架构方向,从理论上来讲确实解耦了很多结构,但另一方面,又会带来更多衍生的复杂度及难点。 如何保证事物的最终一致性?如何进行性能及容量预估?如何处理分布式系统…

Java分布式开发

分布式概念的引入是基于性能的提升,应用的可靠性而提出的。所谓Java分布式,即是在使用Java语言进行企业级应用开发的过程中,采用分布式技术解决业务逻辑的高并发、高可用性的一些架构设计方案。 1. RPC技术介绍 我们知道Web Servie实现了服务…

足球赛事实时大小球数据worldliveball软件搭建

worldliveball软件 worldliveball开发思路功能脑图合理的展示足球赛事如何快捷的判断赛事wordliveball下载地址与软件图片代码宏定义运用了哪些技术worldliveball流程图 worldliveball 整个足球赛事AI worldliveball 开发思路及过程。如果你想学习如何使用worldliveball, 可以…

足球走地大小球预测-分析软件开发及逻辑

足球大小球分析之大球 相比小球,热爱大球玩法的更多。走地大小球,预测进球数简单明了。无论比赛双方哪一方进球,对于您而言,都是欢喜的。只要进球数量达到了,您就妥妥的了。 走地大球玩法之挑赛事 那么有些赛事疯狂进…

足球走地大小球预测之理性分析软件开发及逻辑

足球走地大小球 前言一、足球大小球分析之小球二、走地大小球分析之看实时数据1.实时数据2.足球分析逻辑 AI足球数据 前言 足球已经开始了也快百年了,但市面上没有真正好的分析的,15年开发经验,弄个Ai分析,看看是不是这样的。 一…

足球分析大小球开发成量化交易软件

足球分析大小球量化交易软件 最近总有朋友问足球大小球的那些所谓的分析法则到底准不准,到底该如何去分析大小球究竟是大球还是小球呢,大家都知道股票有量化交易系统,能否开发足球量化交易软件,整理一些多年开发的心得总结出一套…

足球走地大小球量化分析方法软件

前阵子看了国足的比赛后突发奇想,足球的大小是否可以预测呢。于是乎翻遍了各种材料,经过数月的鏖战,结合数据采集大数据分析大小球技巧经验模型机器学习,搞出了一套可以在走地过程中自动分析比赛大小的软件,目前试水挂…

短信/语音在医疗领域(his系统)各场景的应用

短信/语音通知,可广泛应用于医疗领域的内部管理、患者服务等各种应用场景 一、预约挂号 二、远程医疗 三、系统监控 四、网络医嘱 五、体检报告 六、订单提醒 七、信息化办公 八、患者关怀

医院信息管理系统源码 HIS系统源码

系统功能简介: 一、医院门诊模块 门诊(预约)挂号系统 门诊挂号系统实现了医院门诊部挂号处所需的各种功能。 包括现场办卡,现场挂退号,临时加号,特殊加号,修改患者信息,就诊卡号打…

基层区域应用平台为目标开发的基础医疗云HIS系统源码

系统特点: JAVA语言开发,MYSQL数据库,B/S架构 基于云计算技术的低成本基层医疗信息系统,能够有效降低基层医疗单位信息化建设的投入, 减少系统的维护费用;规范医疗信息、规范业务处理流程,提高服务水平&…

his系统管理工具配置服务器,HIS系统(his管理系统)V3.0.1 官网版

HIS系统(his管理系统)是一款非常专业的his管理程序。行心HIS系统源于北美技术,经过17年HIS技术沉淀,现已拥有100多套子系统,十四项著作权,100多人技术团队。行心HIS系统已经经过300多家医院见证,成熟HIS系统采用专人驻…

云HIS源码 大型医院java云HIS系统源码 云his系统

🍓文末获取联系🍓 云HIS系统 云his系统源码 大型医院java云HIS系统源码 本套云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可…

java项目-第37期基于springboot+layui实现的医院His系统【毕业设计】

java项目-第37期基于springbootlayui实现的医院His系统 1、项目简述 该项目是针对医院门诊和住院流程开发的一套His系统,分为不同的角色,不同的角色分管不同的模块功能,其中有个超级管理员。 包含模块有: 门诊管理:处方…

Python+Vue计算机毕业设计东软医疗HIS系统之住院入出转管理子系统7k546(源码+程序+LW+部署)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行环境配置: Python3.7.7DjangoMysql5.7pip listHBuilderX(Vscode也行)VuePychram社区版。 项目技术: Django Vue PythonMysql 等等组成,B/S模…

springboot毕设项目东软医疗HIS系统之住院入出转管理子系统7k546(java+VUE+Mybatis+Maven+Mysql)

springboot毕设项目东软医疗HIS系统之住院入出转管理子系统7k546(javaVUEMybatisMavenMysql) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,M…

九阵His系统总体介绍

目录 产品功能模块: 系统结构图: 门诊流程: 住院流程: 产品功能模块: 序号 模块名称 功能描述(出厂设置) 1 数据中心管理 医院各种档案管理,主要包括:往来单位、…

PHP如何接入医疗HIS系统发送短信

医疗信息系统HIS短信接口解决方案 为数字化医院系统提供可靠的短信通知服务 PHP对接验证码短信接口DEMO示例 本文为您提供了PHP语言版本的验证码短信接口对接DEMO示例 * 接口类型:触发短信接口,支持发送验证码短信、订单通知短信,节日祝福等…

ASP对接医疗HIS系统短信通知

ASP对接验证码短信接口DEMO示例 本文为您提供了ASP版本的验证码短信接口对接DEMO示例 * 接口类型:触发短信接口,支持发送验证码短信、订单通知短信,节日祝福等。 * 账户注册:请通过该地址开通账户 http://user.ihuyi.com/?exCla…

医疗HIS管理系统短信接入流程

医疗HIS管理系统在实际使用过程中,需要同病人进行大量的信息沟通,短信作为一种便捷且价格低廉的信息通知方式,是医疗HIS管理系统不可或缺的功能。 医疗信息管理系统HIS的短信应用场景主要有: 医院信息管理HIS系统接入短信通知功…

PHP如何开发医疗HIS系统短信通知

短信/语音通知,可广泛应用于医疗领域的内部管理、患者服务等各种应用场景 *PHP对接验证码短信接口DEMO示例 本文为您提供了PHP语言版本的验证码短信接口对接DEMO示例 * 接口类型:触发短信接口,支持发送验证码短信、订单通知短信,节…