为什么GCP上的python会产生重复的UUID?

问题描述 投票:6回答:1

我正面临这个奇怪的问题。我的一些(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上。

python google-cloud-platform celery uuid
1个回答
0
投票

我不知道为什么,但我实施了一个变通方法。

我打了个补丁 uuid.uuid4. 由于某些原因,我无法对以下情况进行同样的处理。celery.utils.uuidkombu.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
© www.soinside.com 2019 - 2024. All rights reserved.