wmlhust
2020-06-08 11:12:07 +08:00
分成几个层面:
1. 接入层:瓶颈在于并发,这个可以通过加资源、优化性能解决
2. 业务层:对于支付本身的逻辑,实时处理。各种上下游、周边逻辑,比如弹幕播报,特效等,这种尽量通过消息队列去耦合,异步处理。
3. 存储层:这里是关键,如果设置一个 mysql 余额表,显然撑不住十万的并发写,每一个请求都要对该行加锁。但是又不能完全依靠 redis,可能会导致数据丢失,不一致等。
一个方案是,使用消息队列+mysql 存储流水,使用 redis 存储余额,定时对账。
由于流水是追加写,不涉及到加锁,同时可以通过分库分表等提升性能。
redis 提供余额的高并发读、写,但是对单机 redis,十万 QPS 也扛不住,redis 集群两个方案,主从或 cluster,在这个场景,主从更合适(因为 cluster 对单 key 是固定路由到一个节点,所以没办法提升单 key 的处理能力)。再考虑到十万的并发写,这个只能牺牲一点余额的实时性,大概可以通过 group commit 或 kafka 异步更新缓存。
-----
瞎想的,不对的地方,各位老铁随意指出