计数与信息流设计


计数 假如要存储帖子维度(帖子的计数,转发数、赞数等等)的数据,你可以这么设计表结构:以帖子 ID 为主键,转发数、评论数、点赞数和浏览数分别为单独一列,这样在获取计数时用一个 SQL 语句就搞定了。 select repost_count, comment_count, praise_count,

系统维护


监控指标如何选择 在服务层面一般需要监控四个指标,分别是延迟,通信量、错误和饱和度。 延迟指的是请求的响应时间。比如,接口的响应时间、访问数据库和缓存的响应时间。 通信量可以理解为吞吐量,也就是单位时间内,请求量的大小。比如,访问第三方服务的请求量,访问消息队列的请求量。 错误表示当前系统发生的错误

微服务设计


微服务拆分的原则 对于复杂的单体架构,可以看做是一个大的蜘蛛网,不同功能模块,错综复杂地交织在一起,方法之间调用关系非常的复杂,导致修复了一个 Bug,可能会引起另外多个 Bug,整体的维护成本非常高。同时,数据库较弱的扩展性,也限制了服务的扩展能力。 拆分原则: 原则一,做到单一服务内部功能的高内

消息队列设计


如何保证消息仅仅被消费一次? 消息从被写入到消息队列,到被消费者消费完成,这个链路上会有哪些地方存在丢失消息的可能?主要存 在三个场景: 消息从生产者写入到消息队列的过程。 消息在消息队列中的存储场景。 消息被消费者消费的过程 在消息生产的过程中丢失消息 在这个环节中主要有两种情况。 首先,消息的生

缓存设计


缓存一般是基于内存的,做一次内存寻址大概需要 100ns,而做一次磁盘的查找则需要 10ms。 1. 缓存数据如何分片 一般来讲,分片算法常见的就是 Hash 分片算法和一致性 Hash 分片算法两种。 Hash 分片的算法就是对缓存的 Key 做哈希计算,然后对总的缓存节点个数取余。 这个算法最大

数据库设计


分库分表是一种常见的将数据分片的方式,它的基本思想是依照某一种策略将数据尽量平均的分配到多个数据库节点或者多个表中。 不同于主从复制时数据是全量地被拷贝到多个节点,分库分表后,每个节点只保存部分的数据,这样可以有效地减少单个数据库节点和单个数据表中存储的数据量,在解决了数据存储瓶颈的同时也能有效的提

系统扩展性


为什么提升扩展性会很复杂 比方说,你系统的流量是每秒 1000 次请求,对数据库的请求量也是每秒 1000 次。如果流量增加 10 倍,虽然系统可以通过扩容正常服务,数据库却成了瓶颈。再比方说,单机网络带宽是 50Mbps,那么如果扩容到 30 台机器,前端负载均衡的带宽就超过了千兆带宽的限制,也会