系统设计原则

概述

目录结构参考《亿级流量网站架构核心技术》一书,结合工作中遇到的问题总结下,写下自己理解。绝大多数的工作中遇到的场景,其实已经有非常成熟的解决方案,多了解下,可以少踩些坑。比如redis分布式锁的实现方式,如果不参考下以前的方式,什么超时、释放时候的锁检查踩坑不可避免。

高并发

无状态

无状态后才好做成多个节点组成集群。其实很多场景是由状态的,对于无状态的处理可以有一些技巧,如:

状态放在配置文件中

放在上下文中

拆分

一定要省着点拆,尤其在服务的层面,不要看着满足条件就先拆出来个服务。代码中有过度设计,同样服务拆分也有过度拆分。拆分的原则大概有:

服务化

演进为:进程内服务->单机远程服务->集自动注册和发现服务->服务的分组/隔离/路由->服务治理如限流/黑白名单。

目前微服务比较流程,从本质上看微服务是一种模块化的功能服务化,而前提是模块化时候就很清晰,如果模块化都没有最好,直接上来就服务化,会导致服务的不可控制。

消息队列

数据异构

通过数据异构,实现数据的自我控制,这样其他系统出现问题的时候不影响自己的系统。

如详情页的场景,需要使用到的数据特别多,影响服务稳定性因素就很多。比较好的方式是把数据进行异构存储。甚至,针对一些聚合查询的查询,还可以进行数据聚合操作,这样一次调用就能拿到所有的数据。比如:

PS:这数据异构,有两种方式,一种方式是为了避免对多个微服务的调用和查询,可以把所需要的数据本地保存的时候提前通过微服务方式查询,生成一张有冗余字段的宽表,表中包括了使用业务需要的字段,比如设计师站中主题的统计信息、曝光、点击、订单、订单转化、主题自身的信息等。

还有一种方式,有的场景需要跨微服务进行表关联,而且有A服务(甚至更多)的多个表需要依赖B服务的同一张表,这个时候可以通过小表广播的方式,把B服务中的表广播到其他服务。比如A级别和S级别的设计师信息,数据不多百多个,可以同步到产品服务进行一些榜单的业务。

缓存银弹

缓存是非常重要的解决读的手段。也有一些技巧,如APP缓存,在活动开始之前,就可以让客户端先进行一些资源的拉取操作。不要都等到活动开始的时候

并发化

高可用

降级

限流

限流的目的不仅仅是在重大活动的时候,防止流量超出系统峰值。还可以防止恶意的攻击与请求。

切流量

在整个机房出问题的时候,可以通过切换lvs接入层流量。

可回滚

最基础的就是发部版本的回滚。

##业务设计原则

防重

幂等

流程可定义

参考

亿级流量网站架构核心技术

Table of Contents