生化战场体验服,签名表现ip,hp dv4
OSC开源社区 2021-05-24 22:00原题目:开源分布式ID天生器UidGenerator的手艺实现
1、弁言
很多人一想到IM应用开发,第一印象便是“长毗邻”、“socket”、“保活”、“协议”这些关键词,没错,这些确实是IM开发中一定会涉及的手艺范畴。
但,当你真正起头编写第一行代码时,最实际的问题现实上是“谈天消息ID该怎么天生?”这个看似微不敷道的小事情。说它看似微不敷道,是因为在IM里它宁靖常了,处处可见它的身影。不外,固然看似微不敷道,但现实却很紧张,因为它的天生算法和天生策略的优劣在某种意义上来说,决意了你的IM应用层某些功能实现的难易度。
有签于此,即时通信网专门整理了“IM消息ID手艺专题”系列文章,进展能带给你对这个看似微小但却很紧张的手艺点有更深刻的懂得和最佳实践思绪。
本文是专题系列文章的第5篇,专门先容百度开源的分布式消息ID天生器UidGenerator的算法逻辑、实现思绪、重点源码解读等,或许能带给你更多的开导。
2、根基先容
全局ID(常见的好比:IM谈天体系中的消息ID、电商体系中的订单号、外卖应用中的订单号等)服务是分布式服务中的根蒂服务,必要连结全局独一、高效、高靠得住性。有些时候还可能要求连结单调,但也并非肯定要严格递增或者递减。
全局ID也能够通过内容库的自增主键来获取,然则如果要求QPS很高显然是不实际的。
UidGenerator(备用地址)工程是百度开源的基于Snowflake算法的独一ID天生器(百度对Snowflake算法进行了改进),引入了高性能队列高性能队列disruptor中RingBuffer思惟,进一步提拔了效率。
UidGenerator是Java语言实现的,它以组件形式工作在应用项目中,支持自界说workerId位数和初始化策略,,从而适用于docker等假造化情况下实例自动重启、漂移等场景。
在手艺实现上,UidGenerator有以下关键特征:
1)UidGenerator通过借用将来时间来解决sequence自然存在的并发限定;
2)采用RingBuffer来缓存已天生的UID, 并行化UID的生产和消费;
3)同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题。
基于以上手艺特征,UidGenerator的单机压力测试内容表现,其QPS可高达600万。
依赖的情况:
1)Java8及以上版本(代码中使用了函数式编程语句等新特征,请见:uid-generator源码在线版);
2)MySQL(内置WorkerID分配器, 启动阶段通过DB进行分配; 如自界说实现, 则DB非必选依赖)。
以下是UidGenerator工程的相关资源:
1)完备源码地址:https://github.com/baidu/uid-generator
2)备用源码地址:https://github.com/52im/uid-generator
3)源码在线阅读:http://docs.52im.net/extend/docs/src/uid-generator/(保举)
3、什么是Snowflake算法?
3.1 SnowFlake算法原理
友情提醒:本节笔墨数据摘选自《IM消息ID手艺专题(四):深度解密美团的分布式ID天生算法》一文,如果您想认识美团对于SnowFlake算法的懂得和应用环境,可详细阅读之。
SnowFlake 算法,是 Twitter 开源的分布式 ID 天生算法。其焦点思惟便是:使用一个 64 bit 的 long 型的数字作为全局独一 ID。
这 64 个 bit 中,此中 1 个 bit 是不消的,然后用此中的 41 bit 作为毫秒数,用 10 bit 作为工作呆板 ID,12 bit 作为序列号。
SnowFlake的ID构成:
( 本图引用自《IM消息ID手艺专题(四):深度解密美团的分布式ID天生算法 》)
SnowFlake的ID样本:
( 本图引用自《IM消息ID手艺专题(四):深度解密美团的分布式ID天生算法 》)
本文地址:http://www.wbwb.net/bianchengyuyan/213037.html 转载请注明出处!