marp: true
theme: gaia
_class: lead
footer: 'zlqian 2020/3/24'
paginate: true
backgroundImage: url('https://marp.app/assets/hero-background.jpg')
style: |
section {
background-color: #aaa;
font-size: 20px;
}
网站核心技术-阅读笔记
最近要离职,不能使用公司电脑做一些博客和网盘记录,用手机进行简单的阅读笔记记录。
交易系统设计选择
- 高并发原则
无状态,拆分,服务化,消息队列,数据异构,缓存(浏览器,客户端,cdn,接入层,应用层,分布式缓存),并发 - 高可用原则
降级(开关,多级读,业务降级),限流,切流量,可回滚,故障切换 - 业务设计原则
防重,幂等,流程可定义,状态机,后台系统操作可反馈,后台系统审核化,文档化,备份
均衡负载与反向代理
访问链路:客户端-dns-f5/lvs-nginx-upstream
- nginx均衡负载算法
round-robin,ip-hash,hash,hash-consistent - 其他配置
失败重试,健康检查,备份服务器,nginx和upstream长连接 - upstream动态均衡
可以借助consul来进行upstream存储,然后使用consul-agent刷新nginx-conf来生效 - 4层负载均衡
从1.9.0版本开始支持,借助consul也可以实现动态均衡负载
隔离
线程隔离,进程隔离,集群隔离,机房隔离,动静隔离,爬虫隔离,热点隔离,资源隔离
- 应用开发
hystrix可以使用线程池隔离或者信号量隔离,
servlet3.0可以定制业务线程池实现隔离
限流
- 算法
- 令牌
- 漏斗
令牌算法允许一定的突发流量,漏斗更加平缓
- 应用中限流
- 可以通过guava的ratelimiter滑动窗口限流
- 分布式,可以通过redis结合lua实现
- 接入层流控,nginx结合lua,也可以使用nginx自带的限流模块实现
- 节流
前段在窗口事件内将多个重复事件只对第一个或者最后一个处理,例如前端多次点击事件
降级
- 种类
超时降级,多次失败降级,故障降级,限流降级 - 人工降级
可以配合配置中心实现 - 自动降级
java应用可以使用hystrix自动降级,原理是窗口时间出现一定频率的异常会进行熔断降级,同时采样判断服务是否恢复
超时与重试
- 代理超时
- 客户端超时
- dns解析超时
- 代理超时
- 其他
容器超时,业务处理,中间件客户端超时,数据库,nosql,服务调用 - 后置处理
重试,托底,降级,心跳探活
回滚
- 代码回滚
- 部署回滚
灰度发布 - 数据回滚
全量和增量数据回滚 - 静态资源
多个目录隔离静态资源
压测
- 线下压测
可以使用jmeter,ab - 线上
可以引流压测,但是数据要进入影子表,不能影响线上数据 - 应急
压测发现系统的隐患,需要对系统进行分级,然后进行全链路分析,配置监控与告警
网络层由运维工程师负责
应用层开发工程师负责,限流降级,隔离,故障切换 - 演习
制定演习方案,验证应急方案的可用性
缓存
- 缓存策略
命中率,失效策略 - 缓存类型
java堆缓存,堆外缓存,磁盘缓存,分布式缓存 - http缓存
nginx代理侧可以设置缓存,http客户端,还有浏览器都可以进行缓存设置 - 多级缓存
多级缓存之间数据的同步问题 - 异步并发
线程异步,合并调用等 - 拆分
应用拆分,数据库,分库分表 - 消息队列
消息可靠性,幂等性,有序性
openrestry在web应用服务器上的应用
- 区别
openrestry是基于nginx实现的,nginx是一个反向代理服务器,而openrestry是web应用服务器
它利用nginx非阻塞io特性,提供多种模块,不仅可以和http客户端实现非阻塞io,和很多第三方服务也可以实现非阻塞io连接
可以使用openrestry开发很多应用,例如网关系统等