生成分布式序列ID
2019-06-16 本文已影响0人
majinliang123
生成分布式序列ID
介绍
在很多分布式系统中,需要生成唯一的id。如在分库分表的情况下,给某个逻辑表生成唯一id。既要保证id的唯一性,也需要保证生成id的性能,而且需要持久化,防止在id生成器重启之后,造成id不唯一。
实现
https://gitee.com/majinliang123/messtin-sequence
思路
使用数据库记录下一个id
当想获取id时,需要查询数据库,数据库中的值就是你想要的下一个值。但是在这个过程中,可能有多个id生成器同时想要生成下一个id,所以都在更新数据库。在我们更新数据库时,需要将id更新为id + 1,然后查询这个id值,id - 1就是我们想要的。这两步操作必须在同一个事务中,使用数据库的事务保证id更新过程中不会发生错乱(当我们更新id时,数据库会阻塞其他的更新操作,直到我们事务提交,其他的更新操作才能更新id的值,这就保证了数据库中id的正确性)。不应该先读再更新,因为在读的过程中,可能已经有其他id生成器更新了这个值,导致我们读的值是过时的。
每次获取多个id,以防多次更新数据库
在我们更新数据id时,仅仅id + 1是不够的,这会造成我们频繁的更新数据库,性能比较低。一般我们每次更新都是id + 500,这样在当前id生成器中就有500个id可以分配(id ~ id + 500 -1),当分配完再去数据库中取下一批id,必须保证id生成器的线程安全。在id生成器中保存着当前id生成器的当前id和最大id,当当前id达到最大id,就取数据库中获取下一批。