自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Springboot整合百度開源分布式ID生成器UIDGenerator

開發(fā) 前端 分布式
UidGenerator是Java實(shí)現(xiàn)的, 基于Snowflake算法的唯一ID生成器。UidGenerator以組件形式工作在應(yīng)用項(xiàng)目中, 支持自定義workerId位數(shù)和初始化策略, 從而適用于docker等虛擬化環(huán)境下實(shí)例自動(dòng)重啟、漂移等場景。

[[411081]]

環(huán)境:sprinboot2.3.12.RELEASE + uid-generator1.0.0

簡介

UidGenerator是Java實(shí)現(xiàn)的, 基于Snowflake算法的唯一ID生成器。UidGenerator以組件形式工作在應(yīng)用項(xiàng)目中, 支持自定義workerId位數(shù)和初始化策略, 從而適用于docker等虛擬化環(huán)境下實(shí)例自動(dòng)重啟、漂移等場景。 在實(shí)現(xiàn)上, UidGenerator通過借用未來時(shí)間來解決sequence天然存在的并發(fā)限制; 采用RingBuffer來緩存已生成的UID, 并行化UID的生產(chǎn)和消費(fèi), 同時(shí)對CacheLine補(bǔ)齊,避免了由RingBuffer帶來的硬件級「偽共享」問題. 最終單機(jī)QPS可達(dá)600萬。

依賴版本:Java8及以上版本, MySQL(內(nèi)置WorkerID分配器, 啟動(dòng)階段通過DB進(jìn)行分配; 如自定義實(shí)現(xiàn), 則DB非必選依賴)

Snowflake算法

Springboot整合百度開源分布式ID生成器UIDGenerator

Snowflake算法描述:指定機(jī)器 & 同一時(shí)刻 & 某一并發(fā)序列,是唯一的。據(jù)此可生成一個(gè)64 bits的唯一ID(long)。默認(rèn)采用上圖字節(jié)分配方式:

  • sign(1bit) 固定1bit符號標(biāo)識,即生成的UID為正數(shù)。
  • delta seconds (28 bits) 當(dāng)前時(shí)間,相對于時(shí)間基點(diǎn)"2016-05-20"的增量值,單位:秒,最多可支持約8.7年
  • worker id (22 bits) 機(jī)器id,最多可支持約420w次機(jī)器啟動(dòng)。內(nèi)置實(shí)現(xiàn)為在啟動(dòng)時(shí)由數(shù)據(jù)庫分配,默認(rèn)分配策略為用后即棄,后續(xù)可提供復(fù)用策略。
  • sequence (13 bits) 每秒下的并發(fā)序列,13 bits可支持每秒8192個(gè)并發(fā)。

以上參數(shù)均可通過Spring進(jìn)行自定義

CachedUidGenerator

RingBuffer環(huán)形數(shù)組,數(shù)組每個(gè)元素成為一個(gè)slot。RingBuffer容量,默認(rèn)為Snowflake算法中sequence最大值,且為2^N。可通過boostPower配置進(jìn)行擴(kuò)容,以提高RingBuffer 讀寫吞吐量。

Tail指針、Cursor指針用于環(huán)形數(shù)組上讀寫slot:

  • Tail指針 表示Producer生產(chǎn)的最大序號(此序號從0開始,持續(xù)遞增)。Tail不能超過Cursor,即生產(chǎn)者不能覆蓋未消費(fèi)的slot。當(dāng)Tail已趕上curosr,此時(shí)可通過rejectedPutBufferHandler指定PutRejectPolicy
  • Cursor指針 表示Consumer消費(fèi)到的最小序號(序號序列與Producer序列相同)。Cursor不能超過Tail,即不能消費(fèi)未生產(chǎn)的slot。當(dāng)Cursor已趕上tail,此時(shí)可通過rejectedTakeBufferHandler指定TakeRejectPolicy
Springboot整合百度開源分布式ID生成器UIDGenerator

 CachedUidGenerator采用了雙RingBuffer,Uid-RingBuffer用于存儲Uid、Flag-RingBuffer用于存儲Uid狀態(tài)(是否可填充、是否可消費(fèi))

由于數(shù)組元素在內(nèi)存中是連續(xù)分配的,可最大程度利用CPU cache以提升性能。但同時(shí)會帶來「偽共享」FalseSharing問題,為此在Tail、Cursor指針、Flag-RingBuffer中采用了CacheLine 補(bǔ)齊方式。

Springboot整合百度開源分布式ID生成器UIDGenerator

RingBuffer填充時(shí)機(jī)

  • 初始化預(yù)填充 RingBuffer初始化時(shí),預(yù)先填充滿整個(gè)RingBuffer.
  • 即時(shí)填充 Take消費(fèi)時(shí),即時(shí)檢查剩余可用slot量(tail - cursor),如小于設(shè)定閾值,則補(bǔ)全空閑slots。閾值可通過paddingFactor來進(jìn)行配置,請參考Quick Start中CachedUidGenerator配置
  • 周期填充 通過Schedule線程,定時(shí)補(bǔ)全空閑slots??赏ㄟ^scheduleInterval配置,以應(yīng)用定時(shí)填充功能,并指定Schedule時(shí)間間隔

以上為百度的官方介紹,接下來我們將其整合到Springboot項(xiàng)目中

UIDGenerator下載

在下面地址下載uid-generator

Springboot整合百度開源分布式ID生成器UIDGenerator

UIDGenerator環(huán)境配置

創(chuàng)建表

  1. DROP TABLE IF EXISTS WORKER_NODE; 
  2. CREATE TABLE WORKER_NODE 
  3.   ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id'
  4.   HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name'
  5.   PORT VARCHAR(64) NOT NULL COMMENT 'port'
  6.   TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER'
  7.   LAUNCH_DATE DATE NOT NULL COMMENT 'launch date'
  8.   MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time'
  9.   CREATED TIMESTAMP NOT NULL COMMENT 'created time'
  10.   PRIMARY KEY(ID) 
  11. )COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; 

 將其項(xiàng)目中的mapper.xml文件copy到自己項(xiàng)目中,對應(yīng)的WorkerNodeEntity,WorkerNodeDAO,

DisposableWorkerIdAssigner都copy到自己的項(xiàng)目中。

DisposableWorkerIdAssigner主要是修改注入的dao,因?yàn)檫@里我們需要修改默認(rèn)的dao相關(guān)的配置。

項(xiàng)目配置

依賴

  1. <dependency> 
  2.   <groupId>mysql</groupId> 
  3.   <artifactId>mysql-connector-java</artifactId> 
  4.   <scope>runtime</scope> 
  5. </dependency> 
  6. <dependency> 
  7.   <groupId>org.mybatis.spring.boot</groupId> 
  8.   <artifactId>mybatis-spring-boot-starter</artifactId> 
  9.   <version>2.1.4</version> 
  10. </dependency> 
  11. <dependency> 
  12.   <groupId>com.github.pagehelper</groupId> 
  13.   <artifactId>pagehelper-spring-boot-starter</artifactId> 
  14.   <version>1.3.0</version> 
  15. </dependency> 

mybatis配置

  1. pagehelper: 
  2.   helperDialect: mysql 
  3.   reasonable: true 
  4.   pageSizeZero: true 
  5.   offsetAsPageNum: true 
  6.   rowBoundsWithCount: true 
  7. --- 
  8. mybatis: 
  9.   type-aliases-package: com.pack.domain 
  10.   mapper-locations: 
  11.   - classpath:/mappers/*.xml 
  12.   configuration: 
  13.     lazy-loading-enabled: false 
  14.     aggressive-lazy-loading: false  

 mapper文件中的namespace及對應(yīng)domain修改為自己路徑下的。

配置UIDGenerator

  1. @Configuration 
  2. public class UIDConfig { 
  3.      
  4.     @Bean 
  5.     public DefaultUidGenerator defaultUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner) { 
  6.         DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator() ; 
  7.         defaultUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner) ; 
  8.         defaultUidGenerator.setTimeBits(29) ; 
  9.         defaultUidGenerator.setWorkerBits(21) ; 
  10.         defaultUidGenerator.setSeqBits(13) ; 
  11.         defaultUidGenerator.setEpochStr("2021-01-01") ; 
  12.         return defaultUidGenerator ; 
  13.     } 
  14.  

 注意這里的

DisposableWorkerIdAssigner是copy到自己項(xiàng)目中的,不是百度提供的。

  1. @Component 
  2. public class DisposableWorkerIdAssigner implements WorkerIdAssigner { 
  3.   @Resource 
  4.   private WorkerNodeMapper workerNodeDAO; 
  5.   // other code 

 到此所有的都配置完成了。

測試

  1. @Resource 
  2. private DefaultUidGenerator uidGenerator ; 
  3.      
  4. @Test 
  5. public void testGeneratorId() { 
  6.   for (int i = 0; i < 10; i++) { 
  7.     System.out.println(uidGenerator.getUID()) ; 
  8.   } 
Springboot整合百度開源分布式ID生成器UIDGenerator
Springboot整合百度開源分布式ID生成器UIDGenerator

完畢!!!

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2017-07-01 16:02:39

分布式ID生成器

2019-12-27 10:00:34

開源技術(shù) 軟件

2020-11-04 14:40:26

分布式Tinyid數(shù)據(jù)庫

2024-10-07 08:52:59

分布式系統(tǒng)分布式 IDID

2025-03-11 08:50:00

CASID分布式

2023-02-22 14:04:54

2022-01-10 11:58:51

SpringBootPulsar分布式

2019-09-05 13:06:08

雪花算法分布式ID

2011-08-12 10:58:51

Hadoop

2023-01-13 07:39:07

2024-10-29 08:30:31

2016-11-29 09:12:21

數(shù)據(jù)庫分布式ID

2024-12-04 09:36:37

2021-07-23 11:24:54

Create Inc開源G代碼生成器

2024-08-19 00:00:00

表單生成器開發(fā)開源

2022-02-23 07:09:30

分布式ID雪花算法

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2011-10-28 16:19:21

百度搜索

2013-10-12 10:25:20

百度云 Cooliris

2023-01-04 09:23:58

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號