分布式系统无疑是持久的热门话题,但其实如果不是一定有必要,强烈建议不要进入分布式领域,在集中式的情况下很多问题都会简单不少,技术人员千万不要因为外界火热的例如微服务,就把自己的产品的也去做改造,一定要仔细判断是否有必要,不要为了技术而技术,那么在必须分布式的情况下(访问量、存储量或开发人数),一个分布式领域的合格的架构师要掌握哪些技术呢,这篇文章就聊聊这个话题。

简单重复下我对架构师的标准,一个架构师最重要的不是画几个框,连几条线(这是基本要求),而是控制技术风险,要控制技术风险显然不是看几个结构性的ppt就能学会的。

通信


既然是分布式系统,系统间通信的技术就不可避免的要掌握。

首先要掌握一些基础知识,例如网络通信协议(诸如TCP/UDP等等)、网络IO(Blocking-IO,NonBlocking-IO、Asyn-IO)、网卡(多队列等);更偏应用的层面,需要了解例如连接复用、序列化/反序列化、RPC、负载均衡等。

学了这些基本知识后,基本上可以写一个简单的分布式系统里的通信模块,但这其实远远不够,既然进入了分布式领域,对规模其实就已经有了不低的要求,通常也就意味着需要的是能支持大量连接、高并发、低资源消耗的通信程序。

大量的连接通常会有两种方式:

1. 大量client连一个server

在现如今NonBlocking-IO这么成熟的情况下,一个支持大量client的server已经不那么难写了,但在大规模,并且通常长连接的情况下,有一个点要特别注意,就是当server挂掉的时候,不能出现所有client都在一个时间点发起重连,那样基本就是灾难,在没有经验的情况下我看过好几起类似的case,到client规模上去后,server一重启基本就直接被冲进来的大量建连冲垮了(当然,server的backlog队列首先应该稍微设置大一些),通常可以采用的方法是client重连前都做随机时间的sleep,另外就是重连的间隔采取避让算法。

2. 一个client连大量的server

有些场景也会出现需要连大量server的现象,在这种情况下,同样要注意的也是不要并发同时去建所有的连接,而是在能力范围内分批去建。

除了建连接外,另外还要注意的地方是并发发送请求也同样,一定要做好限流,否则很容易会因为一些点慢导致内存爆掉。

这些问题在技术风险上得考虑进去,并在设计和代码实现上体现,否则一旦随着规模上去了,问题一时半会还真不太好解。

高并发这个点需要掌握CAS、常见的lock-free算法、读写锁、线程相关知识(例如线程交互、线程池)等,通信层面的高并发在NonBlocking-IO的情况下,最重要的是要注意在整体设计和代码实现上尽量减少对io线程池的时间占用。

低资源消耗这点的话NonBlocking-IO本身基本已经做到。

伸缩性


分布式系统基本就意味着规模不小了,对于这类系统在设计的时候必须考虑伸缩性问题,架构图上画的任何一个点,如果请求量或者是数据量不断增大,怎么做到可以通过加机器的方式来解决,当然,这个过程也不用考虑无限大的场景,如果经历过从比较小到非常大规模的架构师,显然优势是不小的,同样也会是越来越稀缺的。

伸缩性的问题围绕着以下两种场景在解决:

1. 无状态场景

对于无状态场景,要实现随量增长而加机器支撑会比较简单,这种情况下只用解决节点发现的问题,通常只要基于负载均衡就可以搞定,硬件或软件方式都有;

无状态场景通常会把很多状态放在db,当量到一定阶段后会需要引入服务化,去缓解对db连接数太多的情况。

2. 有状态场景

所谓状态其实就是数据,通常采用Sharding来实现伸缩性,Sharding有多种的实现方式,常见的有这么一些:

 2.1 规则Sharding

基于一定规则把状态数据进行Sharding,例如分库分表很多时候采用的就是这样的,这种方式支持了伸缩性,但通常也带来了很复杂的管理、状态数据搬迁,甚至业务功能很难实现的问题,例如全局join,跨表事务等。

2.2 一致性Hash

一致性Hash方案会使得加机器代价更低一些,另外就是压力可以更为均衡,例如分布式cache经常采用,和规则Sharding带来的问题基本一样。

2.3 Auto Sharding

Auto Sharding的好处是基本上不用管数据搬迁,而且随着量上涨加机器就OK,但通常Auto Sharding的情况下对如何使用会有比较高的要求,而这个通常也就会造成一些限制,这种方案例如HBase。

2.4 Copy

Copy这种常见于读远多于写的情况,实现起来又会有最终一致的方案和全局一致的方案,最终一致的多数可通过消息机制等,全局一致的例如zookeeper/etcd之类的,既要全局一致又要做到很高的写支撑能力就很难实现了。

即使发展到今天,Sharding方式下的伸缩性问题仍然是很大的挑战,非常不好做。

上面所写的基本都还只是解决的方向,到细节点基本就很容易判断是一个解决过多大规模场景问题的架构师,:)

稳定性


作为分布式系统,必须要考虑清楚整个系统中任何一个点挂掉应该怎么处理(到了一定机器规模,每天挂掉一些机器很正常),同样主要还是分成了无状态和有状态:

1. 无状态场景

对于无状态场景,通常好办,只用节点发现的机制上具备心跳等检测机制就OK,经验上来说无非就是纯粹靠4层的检测对业务不太够,通常得做成7层的,当然,做成7层的就得处理好规模大了后的问题。

2. 有状态场景

对于有状态场景,就比较麻烦了,对数据一致性要求不高的还OK,主备类型的方案基本也可以用,当然,主备方案要做的很好也非常不容易,有各种各样的方案,对于主备方案又觉得不太爽的情况下,例如HBase这样的,就意味着挂掉一台,另外一台接管的话是需要一定时间的,这个对可用性还是有一定影响的;

全局一致类型的场景中,如果一台挂了,就通常意味着得有选举机制来决定其他机器哪台成为主,常见的例如基于paxos的实现。

可维护性


维护性是很容易被遗漏的部分,但对分布式系统来说其实是很重要的部分,例如整个系统环境应该怎么搭建,部署,配套的维护工具、监控点、报警点、问题定位、问题处理策略等等。

从上面要掌握的这些技术,就可以知道为什么要找到一个合格的分布式领域的架构师那么的难,何况上面这些提到的还只是通用的分布式领域的技术点,但通常其实需要的都是特定分布式领域的架构师,例如分布式文件系统、分布式cache等,特定领域的架构师需要在具备上面的这些技术点的基础上还具备特定领域的知识技能,这就更不容易了。

随着互联网的发展,分布式领域的很多技术都在成熟化,想想在8年或9年前,一个大规模的网站的伸缩性是怎么设计的还是很热门的探讨话题,但是到了今天基本的结构大家其实都清楚,并且还有很多不错的系统开源出来,使得很多需要经验的东西也被沉淀下去了,在有了各种不错的开源产品的支撑下以后要做一个分布式系统的难度一定会越来越大幅降低,云更是会加速这个过程。

ps: 在写这篇文章的过程中,发现要判断一个技术人的功底有多厚,其实还真不难,就是请TA写或者讲自己觉得懂的所有技术,看看能写多厚或讲多久...要写厚或讲很久其实都不容易,尽管我也不否认要很简洁的写明白或讲清楚也不容易,但一定是先厚然后薄。

分布式领域架构师要掌握的技术相关推荐

  1. python爬虫架构师之路_一位资深 架构师大牛给予Java技术提升的学习路线建议

    一位资深 架构师大牛给予Java技术提升的学习路线建议 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择. 架构师在一家公司有多重要.优秀架构师需要具备怎样的素 ...

  2. 成长为一名Java架构师需要掌握的技术有哪些呢?

    Java架构师需要掌握的技术: 1.熟练使用各种框架,并知道它们实现的原理. 2.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码: 3.池技术,什么对象池,连接池,线程池--Java反射技 ...

  3. 阿里架构师,谈对技术架构的理解,以及架构师角色的思考

    我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 Leader 找我的第一件事就是要解决大促的问题,第二件事就是解决安全生产的问题. 我带着这个命题进入 ...

  4. 【CSDN英雄会】 易宝支付架构师、移动产品线技术负责人程超:走在Java的路上

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台.通过线下线上的互动形式,为CSDN社区专家提供更多学习.合作.宣传的机会.英雄会后续将在北上广深等国内一二线城市建立分会,各个分会后期将组 ...

  5. Java架构师大型互联网高级技术视频教程

    一.什么是架构师? 1.从内心讲我真的不想回答架构具体需要做什么,架构师应该具体负责什么.因为从实际情况看,在不同的系统层级,不同的需求下架构师的职责也会不同:从不同的技术角度看,架构师又是个变色龙- ...

  6. java架构师入门教程,java技术架构师入门到精通高薪就业教程百度云下载

    java技术架构师入门到精通高薪就业视频教程百度云 课程目录: JAVA架构课开班典礼 JVM性能调优专题 JVM整体结构深度解析 JVM内存分配机制详解(此视频作废) JVM字节码文件结构深度剖析 ...

  7. 史上最强Java架构师的13大技术能力讲解! | 附架构师能力图谱

    从程序员进阶成为架构师,并非一蹴而就,需要系统化.阶段性地学习,在实战项目中融会贯通,这如同打怪通关,我们得一关一关突破,每攻破一个关口,就能得到更精良的装备,技能值也随之不断增长,直至大获全胜. 凡 ...

  8. 许式伟:毕业两年成为首席架构师,我的技术学习方法论

    作者 | 许式伟 编辑 | 高嵩 今天想和大家聊聊架构,和架构以外的二三事. 在过去的工作经历里,我看到不少架构师都倾向于把架构看作一项纯技术性的行为.他们的工作流程是这样的:产品经理根据用户的需求做 ...

  9. Java架构师除了必备的技术之外,这些技能也需必备?你们觉得呢?

    成为Java架构师首先你必须是一名Java高级开发工程师,熟练使用各种框架,并且能知道他们其中的原理.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池等等 ...

最新文章

  1. React Native学习之 ListView 的简单使用
  2. (032) Linux之shell流控制for循环
  3. python日志模块的封装
  4. 如何在iOS上运行React Native应用
  5. Apple Cached Service 导致 iPhone app store无法下载程序
  6. 指向结构体变量的指针变量
  7. python使用-如何在Windows上使用Python进行开发
  8. Linux文件系统之挂载光驱
  9. 适于硬件实现的中值滤波算法
  10. 云原生微服务治理etcd应用实战
  11. Google谷歌打不开2014最新解决方法
  12. wstmart系统研究日志二
  13. [Debug] 法语输入
  14. 「码力全开」假如今年公司中秋的月饼由你来设计
  15. 数码相框解决方案深度分析
  16. 使用pyqt和pyautogui来实现自动输出英文文本
  17. “撸啊”不止能秒杀!| lua+redis实现高并发抢令牌
  18. 在Watir中调用JavaScript脚本
  19. 清理Xcode占用的Mac硬盘空间
  20. [转帖]详细讲解六大QQ病毒的特征以及清除方法

热门文章

  1. OSChina 周四乱弹 —— 澳门首家货车上线啦
  2. 数据库------求职必看
  3. php中的foreach和js中的foreach的用法和区别
  4. SQL SERVER 2005 中的CTE
  5. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
  6. windows进程间通信方式总结
  7. caffe学习(七):使用py-faster-rcnn来训练voc2007数据集(Ubuntu)
  8. 数字图像处理实验(3):PROJECT 02-03, Zooming and Shrinking Images by Pixel Replication
  9. javalibrary 线上_线上的少儿口才培训班-1V1精品课程【演讲与口才吧】
  10. hashmap::begin() 坑