我正面临这个奇怪的问题。我的一些(5%)芹菜任务被悄悄地删除了。
在芹菜日志中做了一些调查,我发现在某些情况下,不同的任务会生成相同的任务ID。当然,任何新任务都会覆盖具有相同任务ID的现有任务;导致旧任务无声无息地被删除(如果它没有被执行)。
在1.5小时的时间里,同一个UUID被生成了3次。我做了一些随机抽样,结果在同一台机器上,在很短的时间跨度内(1-2小时),就出现了这种情况。服务器每天产生约100万个UUID。与一个有7位数的数字相比,这是一个微不足道的数字。38位数- 可能的UUID的数量。
我在 Linux 虚拟机上运行 python 3.6 和 celery 4.4.2。
Celery 使用了 python 的 uuid.uuid4
: 参考资料
我不知道接下来该怎么做。是python的某个版本(或linux内核)出现了bug,还是配置问题,或者是硬件VM的bug?所有的情况似乎都不太可能。
更新一下。
这个虚拟机是一个标准的谷歌云Plaftform计算实例,运行在ubuntu 18 LTS上。
我不知道为什么,但我实施了一个变通方法。
我打了个补丁 uuid.uuid4
. 由于某些原因,我无法对以下情况进行同样的处理。celery.utils.uuid
或 kombu.utils.uuid
.
我做了一个非常简单的随机数生成器,将系统的纳米时间和主机名连接起来,生成一个UUID。
def __my_uuid_generator():
time_hex = float.hex(time.monotonic())[4:-4] # 13 chars
host = hex(abs(hash(socket.gethostname())))[2:] # 16 chars
hashed = bytes(f'{time_hex}{host}', 'ascii').hex()[:32] # always a 32 chars long hex string
return uuid.UUID(hashed)
# Monkey patch uuid4, because https://stackoverflow.com/q/62312607/1396264. Sigh!
uuid.uuid4 = __my_uuid_generator