查找数据

采用db方式的话,需要先保证已经创建了butterfly_uuid_generator,如果没有则先在对应的库中创建

  1. CREATE TABLE `butterfly_uuid_generator` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  3. `namespace` varchar(128) DEFAULT '' COMMENT '命名空间',
  4. `work_id` int(16) COMMENT '工作id',
  5. `last_expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次失效时间',
  6. `uid` varchar(128) DEFAULT '0' COMMENT '本次启动唯一id',
  7. `ip` bigint(20) NOT NULL DEFAULT '0' COMMENT 'ip',
  8. `process_id` varchar(128) NOT NULL DEFAULT '0' COMMENT '进程id',
  9. PRIMARY KEY (`id`),
  10. UNIQUE KEY `idx_name_work` (`namespace`,`work_id`)
  11. ) 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了