如何使skynet.queue 队列环问题暴露
前言
队列中的处理函数调用call
最终调用到进入相同队列的处理函数,就会形成环队列,call调用在等结果,结果处理函数却在call调用处理后面排队,就形成了互相等的队列死机状态。
这种状态是非常严重的,整个队列阻塞,后续进队列的还会持续累计,最终可能因内存不足而宕机。发生事故时,我们通常仅仅会认为是内存泄漏导致。因为出现这种情况,日志上不会有什么反应。可能通过debug_console查看stat能够发现对应服务的task数量一直在累计。那么有没有什么办法能提前发现这种情况,并终止调用呢?答案是有的。我在整理实现trace
链路追踪的时候发现,环检查不就是需要用链路追踪的方式检查吗?
实现方案
每个queue都分配一个guid,携程提供一个记录queue guid的栈,进队列压栈,出队列弹出,call
调用把记录的栈传递下去,当queue需要排队时检查 queue guid是否存在,已存在说明形成环队列了。
如何使skynet.queue 队列环问题暴露
https://huahua132.github.io/2025/06/07/skynet_fly_ss/loop_queue/