数据库:
以MySQL为例。慢查询日志,索引优化(explain),覆盖索引。
数据库一主多从或者双主多从。读写分离。
然后对表进行垂直划分,例如一张字段很多的宽表转为子母表。
水平划分,根据业务特性,对表进行分区(现在应该很少用),分表,甚至分库。
数据该归档的归档,日表变月表,年表,或者变地域表等。
使用sharding-jdbc等。
甚至可以给数据库硬盘换上SSD。
数据量再大,就该考虑大数据了。
缓存:
以Redis为例。哨兵保证高可用,集群(最低3主3从)保证吞吐量(相当于MySQL的分库)。
要注意缓存与DB的数据一致性(更新后删),缓存穿透(布隆过滤器),缓存雪崩(预热,随机时间过期)问题。
还要关注持久化问题,RDB、AOF。 ** 微服务:**
拆微服务要考虑业务以及团队情况(开发测试运维管理,不同组间协调),决定拆分粒度。
JVM的调优,尽量避免频繁GC。
通过线程池实现异步方法,降低逻辑处理的整体时间。
要考虑本地事务、分布式事务,根据业务要求实现强一致性或最终一致性,2PC、TCC、分布式锁、消息队列。
服务要考虑注册与发现、幂等(全局请求ID,表唯一索引,乐观锁)、熔断、降级。
网关方面还要关注鉴权、限流。
整体要考虑链路追踪,集群监控、配置中心。
也要适时引入MongoDB或Elasticsearch,应对搜索的并发,减少数据库的压力。
还要引入分布式任务调度,Elastic-job、XXL-job、Quartz等。 ** 消息队列:**
削峰,服务间解耦。
要注意消息持久化、消息丢失、重复消费的问题。
运维:
CDN缓存,服务器的安全,DDoS,服务器和服务的规划编排,持续集成/持续交付,同城双活,异地灾备,两地三中心。