python - 为什么在 GCP 上从 python 生成重复的 UUID?
问题描述
我正面临这个奇怪的问题。我的一些 (5%) 芹菜任务正在悄悄地被丢弃。
在 celery 日志中进行了一些挖掘,我发现在某些情况下,会为不同的任务生成相同的任务 ID。自然,任何新任务都会覆盖具有相同任务 ID 的现有任务;导致旧任务静默删除(如果未执行)。
在 1.5 小时内,相同的 UUID 生成了 3 次。我做了一些随机抽样,结果在短时间内(1-2 小时)在同一台机器上出现了这种情况。服务器每天生成大约 100 万个 UUID。与38 位数字相比,一个 7 位的小数- 可能的 UUID 的数量。
我在 Linux VM 上运行 python 3.6 和 celery 4.4.2。
Celery 使用 python 的uuid.uuid4
:参考
我不知道如何从这里开始。python 版本(或 linux 内核)中是否存在错误、某些配置问题或硬件/VM 错误?所有情况似乎都不太可能。
更新:
VM 是运行 ubuntu 18 LTS 的标准 Google Cloud Platform 计算实例。
解决方案
我不知道为什么,但我实施了一个解决方法。
我猴子修补了uuid.uuid4
。出于某种原因,我无法为celery.utils.uuid
or做同样的事情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
推荐阅读
- identityserver4 - 仅使用 Introspection Endpoint 使用 identityserver4 保护 nestjs api
- android - 虚拟机中加密的安卓
- c - Arm Cortex-M4 LDRD 指令导致硬故障
- android-studio - Android ktlintcheck 在 Windows 10 中不起作用,因命令错误而失败
- ethereum - 从另一个合约中获取结构数组
- c# - Unity android清单上传问题
- c++ - 将编译时常量成员从 enum 转换为 static constexpr 是否有任何陷阱?
- sql - 插入正在填充错误的列 SQL
- c - 即使指针不为空,如何修复“取消引用 NULL 指针”?
- javascript - 使用 ngx-panzoom 时 mouseDown xy 位置错误