google 了半天都说是 sidekiq 执行太快了,按照 github 上面的 trouble shooting 用了 after_commit 和 perform_in 来延迟执行但是还是偶尔会出现找不到对象,然后我在 idle 里面点了 retry all 过一会还是会抛一样错,可以确定数据库里面是有这些纪录的,请问这种情况要怎么排错比较好?
after_commit
是不会有问题的 你可能是多个项目都用了 sidekiq,共享一个 redis 的 db
你这个项目推进去的任务 被其他 client 取出来执行了
你的 Model 写入速度太慢了,Sidekiq 从数据库里读取还读不到这个记录。你可以加一个 memached,先将 Model 写入 memcached。
#12 楼 @jimrokliu 不存在 model 写入太慢这种情况,如果是支持事务的数据库,只有在 SQL 执行完 COMMIT 后,才会触发 after_commit 的 callback,楼主的问题我觉得不可能是 after_commit 的问题,或者只有见到代码,或者在实际项目中深入分析才能找到原因。
#14 楼 @jimrokliu 当 model 发送 commit 指令,MySQL 执行之后,才会返回 id,在发送之前是拿不到的,这是否说明 COMMIT 已经被 MySQL 执行了?
#14 楼 @jimrokliu #15 楼 @lgn21st 这还要看数据库的隔离级别吧,MySQL 默认隔离级别应该是没问题的,但是采用更高级别的,那就可能还要等一等了,特别是 APP 服务器和数据库服务器之间网络延迟比较大的时候。
仔细看了一下日志,确实是 11 楼说的这种情况,主要是测试服务器上的项目比较多所以一直没在意,非常感谢 @zhang_soledad ,也谢谢其他各位大神的见解,又学会了很多🙏