分布式系统架构师必须要考虑的四个方面

《分布式领域架构师要掌握的技术》里面讲到,架构师在设计分布式系统需要重点考虑以下四方面:

1、通信

首先要掌握一些基础知识,例如网络通信协议(诸如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线程池的时间占用。

2、伸缩性

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

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方式下的伸缩性问题仍然是很大的挑战,非常不好做。

3、稳定性

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

1. 无状态场景

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

2. 有状态场景

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

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

4、可维护性

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

分布式系统架构师必须要考虑的四个方面相关推荐

  1. 架构师的行为准则(四)

    原则大于个人口味 很多架构师都有着丰富的经验和个人风格,以至于在平常工作中常以个人口味作为决策的依据,对于普通的开发人员也许是可行的,我们鼓励大家有个人特色,但架构师更应该依据原则办事,需要维护和遵守 ...

  2. 通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔

    一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   ...

  3. 系统架构师学习笔记_第四章(上)_连载

    4.1  软件开发方法 4.1.1  软件开发生命周期 传统的软件生命期 是指软件产品 从形成概念(构思)开始,经过定义.开发.使用.维护.废弃,的全过程. 可以把软件生命期划分为 软件定义.软件开发 ...

  4. mikechen详谈架构师成长之3大步骤

    本文作者:陈睿|mikechen,优知学院创始人 这是架构师系列的第二篇文章 前文谈到架构师核心技能架构设计的重要性,如果你对架构师这个职位从技能的角度有比较清晰的认识,本篇文章将为你继续揭示架构师这 ...

  5. 程序员怎么样可以快速成为高薪架构师?

    架构师是一个光芒四射又充满挑战的职业,是许多程序员梦寐以求的职业梦想.Java架构师不仅拥有令人羡慕技术能力,还有让人望尘莫及的薪酬待遇,在普通Java程序员眼里,Java架构师如神一般的存在,其实每 ...

  6. 如何成长为优秀的架构师?架构师成长的4大必经之路

    进阶架构师|作者 陈睿Mike 之前谈到架构师核心技能,如果你对架构师这个职位从技能的角度有比较清晰的认识了,本篇文章将为你继续揭示架构师这个职位的成长周期,文末有架构师资料~ 在国内架构师需要多年的 ...

  7. Web架构师成长之路

    Web架构师成长之路 本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走着弯路.如果想成为一个架构师,就必须走正确的路,否则离目标越来越远 ...

  8. 运维架构师-并不遥远的彼岸

    在百度里搜索运维架构师,你会发现招聘的职位还不少并且月薪.年薪都很可观.提到架构师,大家都觉得挺神秘的,而作为运维领域的架构师,站在系统稳定和高可用.高扩展的角度,其承载着太多的责任和挑战.对于运维工 ...

  9. 一篇文章搞懂Java架构师的核心技能及薪资!

    Java架构师一般的薪资是多少?高不高?一般来讲,Java架构师是一个比较全面的职位,它既需要学习Java开发工具.性能优化.源码分析.分布式架构.微服务架构和多线程并发编程等基础技术,又需要有组织能 ...

最新文章

  1. 导致美国大范围网络瘫痪的Mirai僵尸网络
  2. WordPress的varnish内存缓存方案
  3. Python3字符串填充和对齐代码示例
  4. 毛坦厂中学2021年高考成绩查询,六安市毛坦厂中学召开2021年高考誓师大会
  5. boost::gregorian模块实现计算今年的元旦直到下一个元旦的日子的测试程序
  6. Log4J入门教程(三) maven构建
  7. 团队作业—系统设计和任务分配
  8. 接口方法javadoc注释_继承Javadoc方法注释
  9. Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
  10. Java描述设计模式(08):桥接模式
  11. java thread join()_Java中Thread.join()的使用方法
  12. 服务器_Windows Server 2012 服务器之Web服务器
  13. vue2.x 父组件监听子组件事件并传回信息
  14. dede后台验证码一直错误的处理方法
  15. 华硕升级bios的问题
  16. 微信小程序使用阿里云物联网API开发物联网应用
  17. 作业1:关于使用python中scikit-learn(sklearn)模块,实现鸢尾花(iris)相关数据操作(数据加载、标准化处理、构建聚类模型并训练、可视化、评价模型)
  18. 百度阿里网易大疆等大小厂前端校招面筋 1
  19. AVFoundation 学习资源列表
  20. 什么是Session,Session常用API

热门文章

  1. java file list listfiles,Java File listFiles()用法及代码示例
  2. java机考_【Java】(机考常用)类集
  3. Linux 音频驱动
  4. [设计模式] - 工厂模式
  5. nginx修改php导出时间格式,nginx 修改 time_local 时间格式
  6. linux恢复桌面,ubuntu恢复unity桌面
  7. php7 验证url格式,url的组成格式为
  8. final、static、finally总结
  9. Matplotlib常用命令
  10. BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)