查找数据
采用db方式的话,需要先保证已经创建了butterfly_uuid_generator,如果没有则先在对应的库中创建
CREATE TABLE `butterfly_uuid_generator` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',`namespace` varchar(128) DEFAULT '' COMMENT '命名空间',`work_id` int(16) COMMENT '工作id',`last_expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次失效时间',`uid` varchar(128) DEFAULT '0' COMMENT '本次启动唯一id',`ip` bigint(20) NOT NULL DEFAULT '0' COMMENT 'ip',`process_id` varchar(128) NOT NULL DEFAULT '0' COMMENT '进程id',PRIMARY KEY (`id`),UNIQUE KEY `idx_name_work` (`namespace`,`work_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='发号器表';
查找数据,这里首先是在对应的命名空间中,查找过期的数据,如果能找到其中id最小的,则该id对应中的workerId就是我们要分配的workerId,如果都没有过期,这块有问题,明天继续看,那么就找最小的workerId,并将workerId+1,重新插入到数据库中(之前查询其实是采用事务中添加悲观锁方式,保证这里不会有多个重复的插入),其中对应的workerId+1就是我们要分配的workerId。
定时更新(心跳)
workerId分配之后,每次都要定时(每5秒)刷新当前命名空间中对应workerId中对应的下次过期时间(就是当前时间往后推24小时)。
如果对应的进程异常宕机了,则该数据对应的这个数据会存在,只是过期时间不会再更新,而如果改进程是正常宕机,则会正常将db中的对应的那条数据删除掉。方便下次分配者继续分配workerId。
我建议,在表中增加一个status字段,在数据正常宕机之后,就是将当前的这条数据状态设置为不可用,在下次数据请求的时候,首先查找状态为不可用的数据,如果找到,则分配
1.找状态为关闭的
2.找已经过期的
3.找workerId最大的,并将workerId+1插入到DB中
这样就可以得到最新的workerId了
