我有一个服务,它生成数据,并将其存储在Kafka中。该服务在Docker容器中的20多个实例上运行。为了存储数据,我们需要为对象分配一个UUID
,所以我们现在可以在代码中使用它,并在数据库中提供不同对象之间的关系。但问题是Python生成相同的uid的频率太高(比如每小时1次)。说"相同的"我的意思是有一批数据中重复的uuid。批处理有15-20k行,我每分钟插入一次,从Kafka池化数据。
错误是
Key "(uuid)=(4c09ce36-20de-4ea9-b176-8d15eade409e)" already exists.
但是在表中没有这样的键,所以看起来python在批处理中生成了两个具有相同值的uuid。
下面是生成uid的函数。我使用默认uuid模块
async def create_object_from_kwargs(object_: Type[T], **kwargs) -> T:
for k, v in kwargs.items():
if isinstance(v, uuid.UUID):
kwargs[k] = str(v)
kwargs['uuid'] = uuid.uuid4().__str__()
data = {
'model': object_.__tablename__,
'data': kwargs
}
serialized_data = pickle.dumps(data)
# sending to kafka
await producer.send_and_wait(KAFKA_NAME, serialized_data)
# getting actual model
item = object_(**kwargs)
return item
问题是我应该如何随机化流体种子或做这样的事情来获得更多的随机值?集装箱是随机的原因吗?python的uuid模块使用os.urandom(16)
,它可能使用CPU名称或类似的东西来创建随机种子,但这种信息在所有容器中都是相同的。
注:我的表中有150M+行,因此更改以获得表中的副本是微不足道的:4e-31。
uid4使用psuedo随机生成器。正如上面提到的Ouroborus使用。uuid1()将是最合适的,因为它使用主机MAC地址,序列和时间。
也请参考这个:页
问好