数据库:

以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,服务器和服务的规划编排,持续集成/持续交付,同城双活,异地灾备,两地三中心。