From 415db7d998b2824e1a02bf5c438218483cec73f0 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 11 Oct 2022 17:51:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=9B=AA=E8=8A=B1ID=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/utils/models.py | 5 ++--- apps/utils/snowflake.py | 7 ++++--- server/settings.py | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/utils/models.py b/apps/utils/models.py index c019fdda..a23f447a 100755 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -69,14 +69,13 @@ class BaseModel(models.Model): abstract = True def save(self, *args, **kwargs) -> None: - # 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下 + # 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留 gen_id = False if not self.id: gen_id = True self.id = idWorker.get_id() try: - x = super().save(*args, **kwargs) - return x + return super().save(*args, **kwargs) except IntegrityError as e: if gen_id: time.sleep(0.01) diff --git a/apps/utils/snowflake.py b/apps/utils/snowflake.py index 5ab55b47..d03390ae 100755 --- a/apps/utils/snowflake.py +++ b/apps/utils/snowflake.py @@ -1,8 +1,9 @@ # Twitter's Snowflake algorithm implementation which is used to generate distributed IDs. # https://github.com/twitter-archive/snowflake/blob/snowflake-2010/src/main/scala/com/twitter/service/snowflake/IdWorker.scala +from random import randint import time -from server.settings import SNOW_DATACENTER_ID, SNOW_WORKER_ID +from server.settings import SNOW_DATACENTER_ID class InvalidSystemClock(Exception): @@ -14,7 +15,7 @@ class InvalidSystemClock(Exception): class Constant(object): # 64位ID的划分 - WORKER_ID_BITS = 5 + WORKER_ID_BITS = 6 DATACENTER_ID_BITS = 5 SEQUENCE_BITS = 12 @@ -101,7 +102,7 @@ class IdWorker(object): return timestamp -idWorker = IdWorker(SNOW_DATACENTER_ID, SNOW_WORKER_ID) +idWorker = IdWorker(SNOW_DATACENTER_ID, randint(1, 60)) if __name__ == '__main__': print(idWorker.get_id()) diff --git a/server/settings.py b/server/settings.py index e2b27be5..3e421f43 100755 --- a/server/settings.py +++ b/server/settings.py @@ -167,7 +167,6 @@ EMAIL_USE_TLS = conf.EMAIL_USE_TLS DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # 雪花ID生成配置 SNOW_DATACENTER_ID = conf.SNOW_DATACENTER_ID -SNOW_WORKER_ID = conf.SNOW_WORKER_ID # restframework配置 REST_FRAMEWORK = {