在某些场景,需要一种唯一标识主机的编号,比如主机A是1,主机B是2,主机C是3等。实现的方法应该有许多中,本文介绍的是一种依赖数据库的顺序数字生成方案。
生成的机器号具有具有下面几个特点
1:从1~n的顺序数字。
2:每个主机的机器号不重复。
3:不再使用的机器号可以被复用。
本方案基于mysql实现,需要在数据库中创建worker数据表,此表用于存储workerId。下面是实现的流程图。
流程说明
workerId从1开始,连续递增,最大值取决于自己系统的需要。获取workerId的过程就是从数字1开始在数据库中循环查找一个未被使用的workerId。
1)在数据库中查询workerId是否存在,如果不存在就表示此workerId还未被使用,在数据库中为此workerId创建一条记录。
2)如果workerId已经在数据库中存在记录,说明可能已经被其它主机使用,需要进一步检查有效时间,如果已经过期,就可以复用。
3)最后,要是workerId没有过期,则不能使用,需要尝试下一个。
下面是创建worker表的sql脚本
CREATE TABLE `worker` (
`id` int(11) NOT NULL,
`active_time` datetime NOT NULL COMMENT '此worker最后一次活跃时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
活跃时间的维护
active_time记录worker的最后活跃时间,一个活跃的workerId不能用于其它worker。因为有了active_time,workerId不再使用时,可以不用主动删除,(当前时间-active_time)大于过期时间(比如使用10分钟)时,workerId就被视为无效了,可以被重新复用。
在系统中,需要有一个定时任务,对active_time定时更新。