微信扫描登录
或者
请输入您的邮件地址来登录或者创建帐号
提 交取 消
GITBOOK.CN需要您的浏览器打开cookies设置以支持登录功能

沈剑:高并发架构实战原则
作者:Chat 实录

2017年1月3日周三晚8点30分,“架构师之路”公众号作者,58到家技术委员会主席沈剑带来了主题为“互联网高并发架构技术实践”的分享,以下是主持人赫阳整理的实录,记录下了作者和读者之间问答的精彩片段。


问:文章中提了垂直和水平扩展来提升并发,好像没有提到编码这个纬度,能否讲讲这一块的最佳实践?

答:垂直扩展:把一个“论坛系统”切分为“论坛首页系统”“论坛发布页系统”“论坛列表页系统”“论坛详情页系统”,来提高性能,这是垂直扩展;水平扩展:把一台“论坛首页系统”部署到多机,变成“论坛首页系统集群”,这是水平扩展。

垂直扩展和业务紧密相关。水平扩展:站点层、服务层的水平扩展,是要求做到无状态即可实现加机器扩容,数据层的水平扩展,文章中有简单描述,可参考。

关于数据库层的垂直拆分,这篇《一分钟掌握数据库垂直拆分》的文章应该对大家有帮助。

关于数据库层的水平扩展,这篇《数据库软件架构设计些什么》的文章应该对大家有帮助。


问:通常我们会预估一个并发峰值和平均值,在设计的时候峰值这一块是否也要特别考虑?另外如何真实的模拟测试峰值情况?

答:系统设计肯定是要抗峰值的,平均值对峰值的参考有帮助。容量预估是架构师必备的技能之一。容量设计,这篇《互联网架构,如何进行容量设计》应该有帮助。

至于真实模拟峰值测试,常见实践是:tcpcopy,放大真实流量压测。


问:在服务的水平扩展这一块,是否有成熟的自动伸缩方案可以参考?

答:

  • 原始阶段:不支持水平扩展,只能单机。
  • 初级阶段:架构支持多个下游,扩容时改配置重启。
  • 中级阶段:组件检测配置文件变化,给上游回调,动态链接池自动扩容。
  • 高级阶段:配置中心上修改配置,给上游回调,动态链接池自动扩容。
  • 超级阶段:柔性服务,自己根据流量扩容缩容。

建议:别先研究“自动”,先考虑架构水平扩展性。


问:能详细说下 “dns轮询”吗?

答:《一分钟了解负载均衡的一切》应该有帮助,对dns轮询有所说明。


问:如果目前需要使用分库分表,那么有没有什么中间件类似mycat之类的,比较成熟的有没有?

答:数据量多大,并发量多大,业务场景如何?mysql官方有个proxy,百度有db-proyx,360有altas,阿里也有中间件,mycat也可以调研下,根据需求来选型。


问:我是一名一线的产品经理,每到年底,运营都会提出一些“抢楼,抢购”这样瞬间高并发的活动需求冲刺KPI,工程师对这种需求向来是很抗拒的(并发难度、不可复用性、峰值不可预测的风险)。从您多年从业经验看,作为产品经理该以何种姿势提需求更为合理呢?

答:把《秒杀系统架构优化思路》转发给技术同学,应该有帮助。


问:分布式锁一般怎么选?MQ的选型以及依据,有案例更好。

答:数据量多大,并发量多大,业务场景如何?任何技术选型都是针对具体业务的。

《一分钟实现分布式锁》《这才是真正的分布式锁》应该有帮助。

MQ使用的业务场景为:

  1. 消息发送方不关心,消息订阅方处理结果。
  2. 消息发送方关心消息订阅方处理结果,但处理时间很长。
  3. 数据驱动,一个工作完了,把数据给下一个工作继续处理。

ActiveMQ,ZeroMQ,RabbitMQ,xxoo 很多,可以调研一下。第二种的典型业务场景为:调用第三方http接口,例如银行支付,微信支付。


问:我想问下,混合式数据库各自得分工是什么,为什么这么分工的理由。

答:什么是混合式数据库?是指mysql+mongo+xxoo么?

数据库选型,看解决什么业务问题。一般来说,关系型数据库用一个就行,互联网公司一般都用mysql,缓存选型,一般都mc或者redis。数据库选型,根据业务,以及数据库特性来选。推荐这篇文章《一分钟了解mongoDB》


问:从库同步主库延时一般怎么处理?

答:主从延时,《DB主从一致性架构优化4种方法》应该有帮助。除了主从延时,经常遇到的还有“数据库与缓存”不一致的问题。

《主从DB与cache一致性》这篇文章或许有帮助。


问:在高并发中队列可以发挥一些作用吗?具体场景应该是哪种呢?电商行业的高并发场景会不会有不一样的地方呢?

答:队列可以起到缓冲的作用。水平扩展,实现加机器即可扩展性能是根本解决方案。电商业务,不同用户的并发访问,可以通过水平扩展解决;同一个用户的并发访问,容易引起一致性问题。

《巧用CAS解决数据一致性问题》应该有帮助,能够缓解“电商业务,同一个用户引发的一致性问题。


问:针对高并发的性能监控,一般分那些维度,作为扩展与优化的参考。

答: 监控、调用链 -> 创业型公司快速落地实践。


问:老师使用redis怎么能做到redis服务down了,mysql可以正常支持线上业务,有没有统一的数据支持架构,还是需要自己写?

答:redis可以支持高可用的,具体怎么高可用,在GitChat上第一篇文章《互联网高可用架构技术实践》有讲解。

如果client用的是Jedis,redis天然有集群支持高可用,调用方不需要修改代码。


问:关于用户表的水平切分, 有什么比较好的实现方式么?

答:用户表,这个场景比较具体,一般以uid为patition key水平切分。name,phone,email上的查询,可以在缓存中建立 name-> uid的映射关系来解决。


问:线上的各种问题用什么方案能够快速定位原因呢,老师有什么好的方案吗? 查日志感觉太慢了也没办法模拟线上环境。

答:刚才发了几个ppt,其中有一个是“58到家调用链追踪系统架构设计与实现”,能够快速定位问题,我给大家截图几个看看。

那个ppt的28页,29页:可以量化展现一个请求在各个服务,跨进程间的调用关系,处理时间,sql语句,函数,参数,异常等信息。

enter image description here

enter image description here

解决三个问题:

  1. 快速找到性能瓶颈。
  2. 快速找到不合理调用。
  3. 快速定位线上问题。

在此感谢人民邮电出版社,为本场Chat的获奖读者提供了《程序员必读之软件架构》一书。

enter image description here


enter image description here

enter image description here