思考(六十六):无状态服务的数据存取与事务处理

痛点一

每次存取数据量太大,影响性能

比如,背包数据,每次请求操作都存取背包数据,会影响机房内流量与数据库性能

痛点二

一次请求,通常会涉及多次数据存取,程序 panic 会导致只提交部分数据到数据库

这涉及到无状态服务如何让便利的逻辑编写同时兼具事务

内置 LRUCache 解决大数量量存取

无状态服务,主要是解绑数据与服务进程间的一一对应关系

即请求到达任何一个服务进程,都能正确处理该请求

因此,本质上与无状态服务上是否有缓存无直接关系

比如,引入 LRUCache ,并做如下规范,还是拿背包数据做例子:

  • 背包数据有版本号字段
  • 如果 LRUCache 中无对应背包数据,则从数据库加载
  • 如果 LRUCache 中有背包数据,则只需要从数据库读取背包数据的版本号
  • 如果版本号一致,则直接使用 LRUCache 中的

那么上述操作,就把一次从数据库读取背包数据的操作,替换为读取一个整数值的操作

对于写数据库,则可以根据数据库特点,来实现不需要全量覆盖的背包数据保存方法

另外,为了能提高 LRUCache 的命中率,可以把同个玩家的请求路由到同个服务进程上

扫描二维码关注公众号,回复: 11605954 查看本文章

(另外玩家请求的并发问题,不属于本文相关。请参考: 思考(六十三):微服务架构中的时序问题

便利的逻辑编写同时兼具事务

为了实现事务,常见的逻辑是借助数据库的事务功能,如 Mysql InnoDB 事务处理; Redis Lua 脚本处理事务

问题是,引入数据库的事务功能,会有以下问题:

猜你喜欢

转载自blog.csdn.net/u013272009/article/details/105881817