Post

记录发现压力测下任务队列丢失消息的问题

问题发现

使用之前的任务队列,发现服务器在负载高的情况下,会出现协程死锁的情况(协程无法正常退出,一般表现为空转循环)。刚开始怀疑是任务调度出现问题,怀疑任务数和队列实际len不一致导致的任务调度器一直认为存在任务,导致忙转。

针对这个问题也进行了一些处理,但是后面发现是底层环形队列存在实现上的问题。环形队列push操作,在检查到len == size后,会触发扩容。扩容逻辑存在错误,会导致环形队列的len和实际存储的元素数量不一致。下面给出正确的push逻辑:

1
func (r *Ring) Push(value any)
This post is licensed under CC BY 4.0 by the author.