分布式系统中,产生唯一流水号的服务系统俗称发号器。对于这个全局唯一id的要求,有如下几条
1、全局唯一
2、粗略有序
3、可反解(如果id有时间,且可反解,可以省略很多timestamp的字段)
4、可制造(如果出了问题,手工处理,如果数据污染,洗数据,如果想要回复到问题的时间节点,需要发号器可复制可恢复可制造)
5、高性能
6、高可用
7、可伸缩
因此
我们不使用uuid,因为他比较长,占用空间大,不满足【高性能】,它不是【有序的】,会导致b+树索引有过多随机写操作。
我们也不使用基于数据库的解决方案。例如通过调整自增字段或者数据库的sequence步长。虽然可以解决问题,但是,服务节点固定,sequence步长也固定,对于水平扩展,增加服务节点不友好【可伸缩】,依赖数据库,对数据库造成压力【高性能】。疏散管理sequence,提高了维护成本。
snowflake是一种流行的发号器,但是很难直接使用。
推荐的发号器是vesta。
发布模式:嵌入发布,中心服务器发布,rest发布
id类型:最大峰值,最小粒度