你怎么优雅的判断当前队列 worker 消费的当前消息队列中是否有重复的?
最优解肯定是在入队列之前。但是有这样几个问题,举个栗子。
try {
DB::beginTransaction();
// 逻辑
Queue::connection('connection_name')->push(new Job(),null,'queue_name');
// 逻辑
DB::commit();
} catch (Throwable $e) {
DB::rollback();
}
问题如下:
- 入队列成功 提交事务失败(mysql挂了)
- 入队列失败 提交事务成功 ( 这个主要看驱动 某些broker可以知道是否扔队列成功 失败抛异常)
- 某些数据库导致事务提交失败(如tidb的乐观锁事务只有在commit时才检测事务冲突有冲突则commit抛异常)
所以可能导致的问题是:
- 数据库并无更新或新数据,队列里却有消息并正在执行
还好,消息执行时检测当前数据在数据库中的状态是否需要执行不需要执行直接delete - 数据有修改 队列里却没数据
新建队列任务对应表? - 数据有修改 队列里有多个重复消息
推荐文章: