一个教训告诉我应该缓存数据而非缓存实例
我在使用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了。
解决办法
缓存数据而非实例,每次请求的时候重新构造需要数据的实例,这样就能避免链路上的上下文错乱问题了。