timestamp
,datacenter_id
,worker_id
和sequence_id
这四个字段中,timestamp
和sequence_id
是由程序在运行期生成的。但datacenter_id
和worker_id
需要在部署阶段就能够获取得到,并且一旦程序启动之后,就是不可更改的了。如果可以随意更改,可能被不慎修改,造成最终生成的 id 有冲突。
一般不同数据中心的机器,会提供对应的获取数据中心 id
的 API
,所以datacenter_id
我们可以在部署阶段轻松地获取到。而worker_id
是我们逻辑上给机器分配的一个id
,这个要怎么办呢?比较简单的想法是由能够提供这种自增id
功能的工具来支持,比如MySQL
:
mysql> insert into a (ip) values("10.1.2.101");
Query OK, 1 row affected (0.00 sec)
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)
从 MySQL
中获取到worker_id
之后,就把这个worker_id
直接持久化到本地,以避免每次上线时都需要获取新的worker_id
。让单实例的worker_id
可以始终保持不变。
当然,使用MySQL
相当于给我们简单的id
生成服务增加了一个外部依赖。依赖越多,我们的服务的可运维性就越差。
考虑到集群中即使有单个id生成服务的实例挂了,也就是损失一段时间的一部分id
,所以我们也可以更简单暴力一些,把worker_id
直接写在worker
的配置中,上线时,由部署脚本完成worker_id
字段替换。
最后编辑: kuteng 文档更新时间: 2022-03-22 19:29 作者:kuteng