首页

一个教训告诉我应该缓存数据而非缓存实例

我在使用effect写后端代码的时候,有实现一个 ctx(上下文) 功能,每一个到达服务器的请求都有一个属于他的 ctx。
其中包含了一些实用方法,例如log这可以让我在请求结束的时候将这次请求中所有使用 ctx.log 打印的日志展示在一个地方
log
#2| 31ms taskApi.listResources sql 24ms > Resource findMany sql 2ms > Resource count #3| 23ms taskApi.listResources sql 17ms > Resource findMany sql 3ms > Resource count #4| 137ms db.aiCallLog.findMany getDbAuth:{"sessionToken":"xxxx"} sql 113ms > User findFirst sql 16ms > AiCallLog findMany #5| 20ms db.aiModel.findMany sql 14ms > AiModel findMany
这里的sql日志是由ctx中的数据库模块 orm 的插件系统实现的(在我的程序中每个user都有自己的orm,从而拥有不同的读写权限)。
我一开始想当然的直接缓存了user实例,这样就可以通过session来直接获取user实例而不用每次都查询数据库了。
🐞但是我遇到了问题,日志乱序了!经过排查问题是这样的
上面的日志聚合输出功能依赖他们的请求id,但是当user整个实例被缓存时他们的请求id就被固定为第一次生成user时请求的id了。

解决办法

缓存数据而非实例,每次请求的时候重新构造需要数据的实例,这样就能避免链路上的上下文错乱问题了。