当前位置: 首页 > 后端技术 > Java

分布式ID生成系统Leaf的设计思路,源码解读

时间:2023-04-01 14:01:15 Java

澶у濂斤紝鎴戞槸4ye锛屼粖澶╃粰澶у鍒嗕韩涓€涓嬫渶杩戠爺绌剁殑鍒嗗竷寮廔D鐢熸垚绯荤粺鈥斺€擫eaf锛屽ぇ瀹朵竴璧锋潵鎬濊€冧竴涓嬭繖涓垎甯冨紡ID鐨勮璁″惂馃憞浠€涔堟槸鍒嗗竷寮廔D锛烮D鏈€澶х殑鐗圭偣灏辨槸鍞竴锛屽垎甯冨紡ID鏄寚鍒嗗竷寮忕郴缁熶笅鐨処D锛屾槸鍏ㄥ眬鍞竴鐨勩€備负浠€涔堥渶瑕佸垎甯冨紡ID锛熻繖涓庣嫭涓€瀵嗗垏鐩稿叧銆傛瘮濡傛垜浠敤MySQL鏉ュ瓨鍌ㄦ暟鎹€備竴寮€濮嬫暟鎹噺涓嶅ぇ锛屼絾鏄粡杩囦竴娈垫椂闂寸殑涓氬姟鍙戝睍锛屽崟琛ㄧ殑鏁版嵁姣忓ぉ閮藉湪鎬ュ墽澧炲姞锛屾渶鍚庤秴杩囦簡1000w锛?000w鈥︹€︾郴缁熷紑濮嬪彉鎱簡銆傝繖鏃跺€欐垜浠凡缁忓皾璇曚紭鍖朓ndexing銆佽鍐欏垎绂汇€佸崌绾х‖浠躲€佸崌绾х綉缁滅瓑鎿嶄綔锛屼絾鏄崟琛ㄧ殑鐡堕杩樻槸鏉ヤ簡锛屽彧鑳藉垎搴撳垎琛ㄣ€傝€岄棶棰樹篃闅忎箣鑰屾潵銆傛暟鎹簱鍒嗚〃鍚庯紝濡傛灉浠嶇劧閲囩敤鏁版嵁搴撹嚜鈥嬧€嬪ID鐨勬柟寮忥紝閭d箞鍦ㄧ敤鎴疯〃涓紝涓や釜涓嶅悓鐨勭敤鎴峰氨浼氭湁鐩稿悓鐨処D銆傝繖涓嶅彲鑳姐€傚叕璁ゃ€傝€屽垎甯冨紡ID杩欑鍏ㄧ悆鍞竴鐨勭壒鎬ф鏄垜浠墍闇€瑕佺殑銆傚垎甯冨紡ID鐢熸垚鏂瑰紡UUID鏁版嵁搴撹嚜澧濱D锛圡ySQL銆丷edis锛夐洩鑺辩畻娉曞熀鏈氨鏄互涓婂嚑绉嶃€俇UID鏈€澶х殑缂虹偣灏辨槸澶暱浜嗭紝36涓瓧绗︼紝涔变竷鍏碂鐨勶紝涓嶉€傚悎銆傚彟澶栦袱涓己鐐规槸鏈夊姙娉曞讥琛ョ殑锛岃繖鍙兘灏辨槸Leaf鎻愪緵杩欎袱绉嶇敓鎴怚D鐨勬柟娉曠殑鍘熷洜銆傞」鐩粙缁嶅垎甯冨紡ID鐢熸垚绯荤粺Leaf鏈変袱绉嶇敓鎴怚D鐨勬柟寮忥細鏁版鏂瑰紡Snowflake鏂瑰紡鏁版鏂瑰紡鍦ㄦ暟鎹簱鑷ID鐨勫熀纭€涓婅繘琛屼簡浼樺寲锛屽鍔犱簡涓€涓鏉ュ噺灏戣闂暟鎹簱鐨勬鏁般€侱oubleBuffer浼樺寲锛屾彁鍓嶇紦瀛樹笅涓€涓猄egement锛屽噺灏戠綉缁滆姹傜殑鑰楁椂锛堝噺灏戠郴缁熺殑TP999绱㈠紩锛塨iz_tag鐢ㄤ簬鍖哄垎涓氬姟锛宮ax_id琛ㄧず褰撳墠鍒嗛厤缁檅iz_tag鐨処D鍙锋鐨勬渶澶у€?step琛ㄧず姣忔鍒嗛厤鏁版闀垮害浼樺寲鍓嶏紝姣忔閮芥槸浠巇b涓幏鍙栵紝鐜板湪鑾峰彇鐨勯鐜囦笌step瀛楁鏈夊叧銆侱oubleBuffer浼樺寲鎬濊矾馃憞Segment妯″紡婧愮爜瑙hSegmentService鏋勯€犳柟娉曫煈囬厤缃甦ataSource璁剧疆MyBatis瀹炰緥鍖朣egmentIDGenImpl鎵цinit鏂规硶杩欐浠g爜蹇樹簡鍝堝搱锛屽ソ涔呮病鐩存帴鐢╩ybatis浜嗭紝鐗瑰湴鍘诲畼缃戝啀鐪嬬湅銆傚湪瀹炰緥鍖朣egmentIDGenImpl鏃讹紝鏈変袱涓彉閲忛渶瑕佹敞鎰忥細馃憞SEGMENT_DURATION锛屾槸鏅鸿兘璋冩暣姝ラ暱鐨勫叧閿紦瀛橈紝鍏朵腑SegmentBuffer鏄弻Buffer鐨勫叧閿璁°€傝繖閲屼笉灞曞紑锛屽厛鐪嬬湅init鏂规硶銆係egmentIDGenImplinit鏂规硶鐨勪綔鐢煈囨墽琛寀pdateCacheFromDb鏂规硶寮€鍚竴涓悗鍙扮嚎绋嬶紝姣忓垎閽熸墽琛屼竴娆pdateCacheFromDb()鏂规硶銆傚緢鏄剧劧锛屾牳蹇冨氨鍦╱pdateCacheFromDbupdateCacheFromDb鏂规硶涓€傝繖閲岋紝鐩存帴鐪嬫簮鐮佸拰鎴戝姞鐨勬敞閲娿€俻rivatevoidupdateCacheFromDb(){logger.info("浠庢暟鎹簱鏇存柊缂撳瓨");绉掕〃sw=newSlf4JStopWatch();try{//鎵цSELECTbiz_tagFROMleaf_alloc璇彞鑾峰彇鎵€鏈変笟鍔″瓧娈点€侺istdbTags=dao.getAllTags();濡傛灉锛坉bTags==null||dbTags.isEmpty锛堬級锛墈杩斿洖锛泒//缂撳瓨涓殑biz_tagListcacheTags=newArrayList(cache.keySet());//biz_tagSetinthedbtobeinsertedinsertTagsSet=newHashSet<>(dbTags);//biz_tagSet鍦ㄧ紦瀛樹腑琚Щ闄emoveTagsSet=newHashSet<>(cacheTags);//濡傛灉缂撳瓨涓湁锛屼笉闇€瑕佹彃鍏ワ紝浠巌nsertTagsSet涓Щ闄or(inti=0;i