痛点一
每次存取数据量太大,影响性能
比如,背包数据,每次请求操作都存取背包数据,会影响机房内流量与数据库性能
痛点二
一次请求,通常会涉及多次数据存取,程序 panic 会导致只提交部分数据到数据库
这涉及到无状态服务如何让便利的逻辑编写同时兼具事务
内置 LRUCache 解决大数量量存取
无状态服务,主要是解绑数据与服务进程间的一一对应关系
即请求到达任何一个服务进程,都能正确处理该请求
因此,本质上与无状态服务上是否有缓存无直接关系
比如,引入 LRUCache ,并做如下规范,还是拿背包数据做例子:
- 背包数据有版本号字段
- 如果 LRUCache 中无对应背包数据,则从数据库加载
- 如果 LRUCache 中有背包数据,则只需要从数据库读取背包数据的版本号
- 如果版本号一致,则直接使用 LRUCache 中的
那么上述操作,就把一次从数据库读取背包数据的操作,替换为读取一个整数值的操作
对于写数据库,则可以根据数据库特点,来实现不需要全量覆盖的背包数据保存方法
另外,为了能提高 LRUCache 的命中率,可以把同个玩家的请求路由到同个服务进程上
扫描二维码关注公众号,回复:
11605954 查看本文章
(另外玩家请求的并发问题,不属于本文相关。请参考: 思考(六十三):微服务架构中的时序问题)
便利的逻辑编写同时兼具事务
为了实现事务,常见的逻辑是借助数据库的事务功能,如 Mysql InnoDB 事务处理; Redis Lua 脚本处理事务
问题是,引入数据库的事务功能,会有以下问题: