暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货-实战bug系列】YII2发送到redis队列中的异步任务消息蒸发了?

也输思雪计算机之路 2021-10-18
858
昨天遇到一个有意思的问题,我们目前用的是YII2框架,项目中推送短信,我用的异步任务,也即是推送“发送短信”任务到redis队列中,然后异步消费。
  • 背景

  • 思考及解决

  • 总结

  • 关于我


背景

今天我们来继续【干货-实战bug系列】,这个系列主要是讲述一些我遇到的问题,以及我的思考过程和解决办法,遇到问题我们不要怕,因为这样才有意思。好了,正题开始吧。

昨天遇到一个有意思的问题,我们目前用的是YII2框架,项目中推送短信,我用的异步任务(点:对于响应时间长的,可通过异步方式处理,不关心结果的可直接异步,关心结果可使用“回查”方式【比如java的future】),也即是推送“发送短信”任务到redis队列中,然后异步消费。

这种也没什么问题,本地测试没问题,测试环境我用的supervisor管理 php yii queue/listen方式处理,但发现项目确实投递了(有投递日志),但没有消费到(无消费任务消息日志),刚投进去就变成了done(投递进去后状态会为wait,处理完后会变成done)。如下图:

思考及解决

奇怪,消息进去就被处理了,可本地又没有处理日志?
思考:既然进去就被处理了,那么可能是开了cron中用了php yii queue/run处理了,确认后,没有(已被注释掉了)。那怎么被消费了?就算处理失败也会有异常的日志(加了日志,ps:日志一定不要太抠门,没必要,要做到有据可查,可复现场景【高并发场景也还是可以复用户或者一个请求的操作流程的】),而且配置也没问题,那么就是“被其他项目给消费了该消息了”?
确认一下,发现确实是被其他项目消费了该消息。

当然,他消费了也会失败的,不影响业务,那是怎么会被另外项目消费了的?
必然是队列一样了,YII redis队列会默认队列key为queue. 比如queue.messages,queue.message_id(ps:redis做队列怎么做的?无外乎list或者set和zset来做,有兴趣可以单开章节详讲),查询YII队列类发现其中有 channel就是该队列相关的前缀,所以我们直接配置一个channel就行了。

总结

问题虽然很简单,但其实所有的大问题都是小问题组成的而已,比如在之前公司遇到的多个接口变成了同一个事务等问题,最重要的也不是问题发生的原因,而是解决这个问题中的过程,这样才能提升你的解决问题能力。
点个关注吧~

关于我




文章转载自也输思雪计算机之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论