亿级流量网站架构核心技术-高并发

9. 应用级缓存

NULL Cache Object, 防止对象不存在,穿透访问db

缓存与db更新策略:

      Cache Aside:同一个数据写竞争比较激烈,对数据一致性要求很高时适合,(写db成功后删除cache)

      其他方式:根据业务场景灵活处理,比如可以先写缓存,再异步写db;也可以先写db 再写缓存,要考虑业务对数据一致性的容忍情况

10. Http缓存

Cache-Control:max-age=2 浏览器缓存多久,单位秒

Last-Modified: 上次修改时间,浏览器请求会将这个放到下次request的If-Modified-Since

ETag:是发送到服务端用于验证的(本身也是服务端下发的),nginx默认使用 Last-Modified 和 content-length 计算 ETag

Gzip:Nginx开启可以显著降低带宽

以上参数nginx都可以配置,对于静态资源以上参数还是非常有必要的,有业务也会根据需要在web工程内部设置

11. 多级缓存

分布式缓存Redis要避免大Value存储,热点数据考虑能否本地缓存

13. 异步并发实战

研究下CompletableFuture的实现原理

14. 扩容和拆分

接入CDN,接入层做一定限流,业务拆分(业务隔离带来更高的稳定性),多机房多活

数据库shard实现: 客户端方案(需要封装到client)和中间件方案(多一层proxy)

如何动态扩容分库分表: 360开源的Atlas,阿里的MyCat

作必要的数据异构:比如订单系统,需要根据orderId shard存储订单,还需要根据userId shard 存储用户的订单(方便查询用户的所有订单)

15. 队列

队列通常可以解耦、削峰、异步化次要流程等

基于Canal实现数据异构(消费bin log)

消费Mysql Bin Log的场景

1) 同步缓存,保证写缓存的顺序性(缺点是有延迟),还可以通过修改消费offset进行重放保证缓存正确性

2)下发任务,可以通过单一消费bin log,转发到kafka, 其他各依赖系统消费kafka,这样减轻其他业务对db的依赖。对于订单场景,如果同时写订单表和用户订单表难以保证两个操作的一致性,通过消费订单表的bin log来写用户订单表可以很好的保证两者的一致性(消费bin log失败可以加各种重试和补偿策略),业务逻辑也更清晰

对于消费Bin log的情况,mysql bin log 要配置成 row 模式?只有一个进程消费bin log,其他都是冷备,通过这样来保证消费的顺序性?

相关推荐