11 | 架构设计流程:设计备选方案
11 | 架构设计流程:设计备选方案
讲述:黄洲君
时长11:58大小5.48M
架构设计第 2 步:设计备选方案
设计备选方案实战
小结
赞 36
提建议
精选留言(82)
- 公号-技术夜未眠2018-05-23设计备选方案心得 经过架构设计流程第 1 步——识别复杂度,确定了系统面临的主要复杂度问题,进而明确了设计方案的目标,就可以开展架构设计流程第 2 步——设计备选方案。架构设计备选方案的工作更多的是从需求、团队、技术、资源等综合情况出发,对主流、成熟的架构模式进行选择、组合、调整、创新。 1. 几种常见的架构设计误区 (1)设计最优秀的方案。不要面向“简历”进行架构设计,而是要根据“合适”、“简单”、“演进”的架构设计原则,决策出与需求、团队、技术能力相匹配的合适方案。 (2)只做一个方案。一个方案容易陷入思考问题片面、自我坚持的认知陷阱。 2. 备选方案设计的注意事项 (1)备选方案不要过于详细。备选阶段解决的是技术选型问题,而不是技术细节。 (2)备选方案的数量以 3~5个为最佳。 (3)备选方案的技术差异要明显。 (4)备选方案不要只局限于已经熟悉的技术。 3. 问题思考 由于文中已经从开源、自研的角度提出了架构设计方案;为此,从架构设计三原则出发,也可考虑第四个备选方案:上云方案,该方案是直接采用商业解决方案,就好比阿里前期采用IOE类似。 如果是创业公司的业务早、中期阶段,可直接考虑采用阿里云/腾讯云,性能、HA、伸缩性都有保证。 此外,在文中备选方案1 - 开源方案中,如果从提供另外一种视角看问题的角度出发,个人会更加倾向于RabbitMQ。首先,RabbitMQ与Kafka都同样具备高可用、稳定性和高性能,但是,通过一些业界测试比较,RabbitMQ比Kafka更成熟、更可靠;其次,在高性能指标方面,Kafka胜出,kafka设计的初衷是处理日志,更适合IO高吞吐的处理。但是,对于“前浪微博”系统的QPS要求,RabbitMQ同样可以驾驭。为此,综合来看,会更加倾向于RabiitMQ。 最后,通过本文再结合自己做技术最大的感悟是:做事情永远都要有B方案。展开
作者回复: 最好是“三方案”,又叫“第三选择”,可以防止思维狭隘,目光短浅,思维盲区等决策陷阱
共 2 条评论83 - 陈华英2018-05-22文中的方案写得很清晰,有理有据。只是在主备切换的时候显得略了一点,上文中提到用zookeeper或者keepalived,可以分为两个备选方案。keepalived比较简单,主要是实现虚IP的漂移,这个对客户端是透明的。如果是zookeeper的话,客户端还需要从ZK上读下主节点
作者回复: 赞,被你发现了,限于篇幅无法细化,主备切换这部分可以有几个备选,zk是一种方式,还有不用zk的也可以。
52 - 星火燎原2018-05-22高可用消息存储和读取可以采用mongo和redis 这么高的gps很难保证消息不丢 那么可以采用有消息确认机制和消息回溯的MQ 或者自研rpc的时候考虑消息发送失败的时候重新选择节点然后落盘
作者回复: 点赞,这是可行方案
共 3 条评论32 - 孙振超2018-06-09单从消息中间件选型上看,就是开源、自研以及对开源进行改造三种方案。后两种的整体成本会高很多,看明白理解透彻并提出新的解决方案都是很花功夫的事情。不管是消息中间件还是其他的系统,本质上都是两个部分:逻辑运算和数据的增删改查,为了提升容量和高可用,逻辑运算部分会采用集群的方式进行部署;数据部分为保证容量和数据不丢失,会采用集群和主备的方式进行部署。数据部分可以选择的方式比较多样:nosql、关系型数据库、文件存储等。第四种方案可以是对开源的中间件进行改造以更适合自己的场景。展开13
- 王磊2018-05-23原文这句话理解有点困难 '高性能消息读取属于“计算高可用”的范畴'
作者回复: 写错了,属于“计算高性能”范畴
共 2 条评论12 - 王磊2018-05-23方案二的架构图有些question (不是problem), 这个可以理解为分库后的主备方案吗,还是所有数据库是全量,我理解是前者,因为文中说分组间不同步,那么这里缺少一个根据消息路由的模块,对吧
作者回复: 赞,你可以思考一下怎么做😃
共 3 条评论10 - narry2018-05-22个人觉得方案2,3根据架构设计的3个原则已经是一个优秀的架构设计了,我只是感觉到微博的应用有个比较有特点的特征就是有热点的出现,如果热点出现,按方案2,3会出现消息都集中在一个分片中,从而导致分片所在主机处于饱和的状态,甚至崩溃掉,如果能像业务服务器中放一个sidecar(或者内嵌到程序中),来负责根据规则的消息路由,并且规则是可以调整的,这样就可以应对热点问题
作者回复: 微博有热点,异步消息没有热点哦,消息随便发给任何一台服务器都可以,可以采取轮询或者随机算法
8 - Geek_59a17f2018-06-08例如,高可用的主备方案、集群方案,高性能的负载均衡、多路复用,可扩展的分层、插件化等技术,绝大部分时候我们有了明确的目标后,按图索骥就能够找到可选的解决方案。6
- SHLOMA2018-06-01李老师专栏讲解模式很好,菜鸟都能跟着进来,看到此处感觉需要学习好多技术,望老师有机会可以出个架构相关技术学习的专栏
作者回复: 太多了,还是期望你掌握了整体架构设计理论,然后按照这套理论的指导去自己学习
6 - gary2018-06-07李老师,我们最近帮银行做系统,发现现在银行业仍然有很多公司使用weblogic / websphere 这样的容器,就目前形势来看weblogic较一些开源方案好像确实更加稳定和安全。 目前来看老师现在给的一些技术思路都是偏互联网方向,不知道老师是否有过一些厂商产品方面经验,比如weblogic 的mq性能水平是什么样的,和开源技术比较有哪些优劣势,好像网上这方面资料也不多,所以想请教李老师。另外不知道李老师眼中如何看待这些类似oracle 大厂商产品和未来我们的互联网开源产品在市场上的发展趋势展开
作者回复: 我的经验主要在互联网,总体技术趋势是云计算,不管是开源还是闭源。 Oracle这类企业,要么自己开始提供云计算云存储,要么就是为云厂商生产设备。
5 - XB.Chan2018-06-05备选方案2中,采用集群+MySQL的方式开发,满足QPS13800的需求,但是MySQL按照性能来说800/秒的插入速度算是比较快了,那这样平均算下来13800/800约等于18台服务器??
作者回复: MySQL的读写简单表结构(例如k-v)远远超过800的QPS和TPS,我们测试k-v都是上万的
5 - 行者2019-03-02方案4,引入商业公司消息服务,比如阿里云。这样开发成本是最小的,性能、运维都有保障。5
- arebya2018-06-01我们会在设计最终方案的时候穿插考虑其他方案做对比,按照3到5个备选方案的设计,会不会长期下来流于形式,而且这对团队来说也是成本。
作者回复: 流程的作用就是保证换谁来做都不会走偏,要知道能设计出三个备选方案,不是形式上应付了事就能够完成的
4 - 在路上2018-05-22选择kafka为啥不选rabbitmq ,他俩主要区别是啥?
作者回复: 是可以用rabbitmq, activemq等方案,具体的区别等你的答案😃
4 - bluefantasy2018-05-22老师好,个人觉得像前浪微博这种场景使用Kafka,Rabbitmq会比Netty+Mysql自研好很多。主要原因是这个场景对实时性要求还是比较高的(一般采取消息队列主动推送模式)。开源的消息队列都有对消费者的推送模式。自研的话,如果采用消息推送模式,消息队列服务需要在服务端记录所有消费者的状态信息,还要考虑各种异常和消息确认,实现起来应该是很复杂。一般公司根本没有这个技术实力。个人见解,希望得到老师的回复。展开
作者回复: kafka的文档中有消息队列的详细设计说明,kafka消费时也是采取pull模式而不是push模式
4 - helloworld2020-12-07方案2中每个分组中为什么有4台服务器?? 每个分组中上面的两台服务器是起到什么作用呢?
作者回复: 计算服务器和存储服务器,计算服务器负责功能实现,存储服务器负责存储数据
3 - 执着2018-07-20本节内容看到了备选方案的设计,很有启发,一定要有差异化;之前做设计也一直有做“备选方案”,但是发现还是性质一样,在做备选方案时候已经陷入自我坚持的认知缺陷。 另外有一个问题:在留言区,看到几次有同学提出“热点”,在该章节分析里面,我们是围绕一次发送微博事件,需要其它子系统做出某些响应,从而选择了MQ的方案构思;近一步来设计落地方案;这时候来看,消息事件的消费并不存在热点呀?它们都是一次性的事情; 这里不知道是否我整体理解偏颇? 另外关于方案的选择上,方案一的kafka只保障了高性能,但是没有保障我们分析的复杂度“高可用存储”。展开
作者回复: 消费确实没有热点,微博访问才有热点问题
共 2 条评论3 - J.Smile2020-12-09当面对一个即将解决的问题时,我们前期会通过调研进行技术选型,这个过程我理解是必须要了解下细节的,避免因为选择一个看似ok的方案,最终却发现根本无法实现。
作者回复: 要了解细节,但是这里的细节仅限于影响方案决策的细节,而不是API的某个参数这种细节。以Netty为例,理解Netty的Reactor模式,多线程模式是需要在架构设计阶段关注的细节;但是设置tcp_nodelay就不是架构阶段需要关注的细节。
2 - 威2019-03-27您好,老师,在第二个备选方案中,服务器为什么要采取主备的形式,而不采用主主的形式呢,这样不是更能利用好资源吗? 另外为什么主db down掉后,备db为什么不能提供写服务呢?
作者回复: 主主同步设计很复杂,备机升主机提供写服务也很复杂,需要考虑数据不同步,数据冲突,多次切换等各种异常场景
2 - 风声是棵树2019-02-09老师您前边提到方案2消息的读取方只要读到最新消息几颗不需要根据ID判断分组,那是不是读取方要实时的取所有分组的最新消息?
作者回复: 轮询所有分组就可以了,不需要实时,消息队列本来就是用于异步处理的
共 2 条评论2