架构设计原则 - 高并发

剪发的Tony 2019-01-15 10:37:31 ⋅ 827 阅读

高并发设计可以从以下几方面考虑:

  • 无状态

  • 拆分

  • 服务化

  • 消息队列

  • 数据异构

  • 缓存

  • 并发化

1. 无状态

无状态的应用容易进行水平扩展。

实际常用:应用无状态,配置文件有状态,例如,不同的机房读取不同的配置文件,通过配置中心指定。

2. 拆分

拆分维度:

  • 系统维度:根据业务功能拆分,例如商品系统、购物车、结算、订单系统。

  • 功能维度:对一个系统进行功能再拆分,比如,优惠券系统可以拆分为创建系统、领券系统、用券系统。

  • 读写维度:根据读写比例进行拆分,例如,商品系统中读的量大于写,可以拆分为商品写服务、商品读服务;写的量大时,可以分库分表。

  • 模块维度:按照基础或者代码维护特征进行拆分,例如基础模块分库分表、数据库连接池等;代码结构按照三层结构划分。

3. 服务化

服务化需要考虑自动服务注册,和服务发现,还有服务的分组/隔离,例如,有的系统访问量,导致把整个服务打挂,因此,需要为不同的调用方提供不同的服务分组,隔离访问。

后期随着调用量的增加还要考虑限流、黑白名单等。

还有一些其他的注意点,例如超时时间、重试机制、服务路由、故障补偿等。

4. 消息队列

消息队列用来解耦一些不需要同步调用的服务,或者订阅一些自己系统关心的变化。

消息队列可以实现服务解耦、异步处理、流量销峰等,例如,订单产生系统、定期推送系统、订单风控系统等等。

使用消息队列,需要考虑如何处理消息发送失败,以及重复消费的情况。

有的消息队列有自动重试功能,如果重试多次还未成功,就通知发送失败,这时,就要做好后续的数据处理工作,例如持久化数据要同时增加日志、报警等。

对于消息重复消费问题,需要在业务层面进行防重处理。

应用示例:电商促销时,流量会比平时高出几倍甚至几十倍,这就需要特殊的设计来保证系统平稳,一般是牺牲强一致性,保证最终一致性,如扣减库存,直接在 redis 中扣减,记录下日志,通过 worker 同步到数据库。

再比如订单系统,可以这样设计:

结算服务调用订单接单服务,将订单存储到 redis 和订单队列中。订单redis用于用户查看订单详情,通过队列提升接单能力。

然后通过同步Worker把队列中的订单同步到数据库。

当订单状态发生变化,例如用户支付了,订单状态机负责驱动状态的变更,更新数据库和redis。

5. 数据异构

数据量大了以后,通常会分库分表,例如订单表,拆分时通常根据订单ID进行划分,但如果查询某个用户的订单时,就比较麻烦了,需要聚合多个表,这种情况一般都会生成一个“用户ID”维度的数据,供业务直接调用。或者有跨库join查询时,将需要join的多个表按照某个维度又聚合在一个库中。这类做法就叫做“数据异构”。

6. 缓存

(1)浏览器、APP客户端缓存

(2)CDN 缓存

(3)应用层缓存

(4)分布式缓存,应用示例:

7. 并发化

例如一个读服务需要如下数据:

如果串行,共需要60ms。

如果 C 依赖 A 和 B,D 没有任何依赖,E 依赖 C,那么就可以并行获取数据:

并发化处理,共需要30ms,性能提升了一倍。

总结

内容整理自张开涛的《亿级流量网站架构核心技术》,推荐详读。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    Nginx服务器高性能优化--轻松实现10万并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看

    「轻阅读」从MySQL可用架构可用架构设计

    可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一

    创业团队如何设计支撑百万并发的数据库架构

    我们来聊一下对于一个支撑日活百万用户的并系统,他的数据库架构应该如何设计?

    “12306”是如何支撑百万QPS的?

    ! 12306 抢票,极限并发带来的思考 虽然现在...

    微服务架构下的若干常用设计模式

    在我们选择了用微服务架构设计、交付数字化应用后,因微服务架构本身所带来的一些共性问题。

    缓存的架构设计要点

    缓存的典型应用场景和设计要点

    「轻阅读」聊一聊6种常用的架构设计模式(上)

      许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文中,我将谈论一些设计模式,这些模式

    「转载」使用DDD指导业务设计的一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出的一种软件设计方法和思想,主要解决业务系统的设计和建模。DDD 有大量难以理解的概念,尤其是翻译的原因,某些词汇非常生涩,例如:模型、限界上下文

    微型Java开发框架Solon 1.1发布,QPS达10万+

    简介 Solon 是一个微型的Java开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,2700多次的commit;内核保持0.1m的身材,超的Web跑分,良好的使用体验

    面试官:如何设计数据库秒级平滑扩容架构

    该方案能够实现n库扩2n库的秒级、平滑扩容,增加数据库服务能力,降低单库一半的数据量,其核心原理是:成倍扩容,避免数据迁移。

    高性能缓存架构设计(超实用)

    缓存虽然能够大大减轻存储系统的压力,但同时也给架构引入了更多复杂性。

    京东技术:京东系统架构师如何让笨重的架构变得灵巧

    京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。

    微服务架构:搭建网站扫码登录的功能设计

    微信扫码登录大家都是应用比较多的登录方式了,现在大的购物网站像京东、淘宝等都支持使用APP扫码登录网站了。今天就用APP扫码登录网站的实例来举例说明微服务架构的搭建过程。

    「轻阅读」阿里云-开放平台高级技术家教你搭建微服务架构的四大金刚利器

    孔凡勇,花名云狄,阿里云-开放平台高级技术家,对并发、性能、可用、可伸缩的分布式系统架构设计有丰富经验,Cloud Native坚定拥护者,坚守开发一线打磨匠艺的架构师。

    并发服务器逻辑处理瓶颈,如何解决?

    从多方面入手解决并发服务器逻辑处理瓶颈

    Fluid 0.3 正式发布:实现云原生场景通用化数据加速

    简介 为了解决大数据、AI 等数据密集型应用在云原生计算存储分离场景下,存在的数据访问延时、联合分析难、多维管理杂等痛点问题,南京大学 PASALab、阿里巴巴、Alluxio 在 2020 年

    并发案例 - 库存超发问题

    1. 库存超发的原因是什么? 在执行商品购买操作时,有一个基本流程: 例如初始库存有3个。 第一个购买请求来了,想买2个,从数据库中读取到库存有3个,数量够,可以买,减库存后,更新库存为1个

    架构实战篇:认识一下ZooKeeper和CAP及一致性原则

    一个分布式系统不可能同时满足以下三种一致性(一致性(C:Consistency) 可用性(A:Available)分区容错性(P:Partition Tolerance)