UidGenerator适配GaussDB开源开发总结

举报
yd_255530874 发表于 2024/12/09 10:29:44 2024/12/09
【摘要】 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。本文提供了一种使用GaussDB存储worker node的方法

简介:UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。
UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略,
从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。
在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制;
采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费,
同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万

适配过程

  1. 在github fork baidu/uid-generator 代码,并下载

  2. 根据需要集成 uid-generator 项目的需求,修改pom文件,例如:mybatis、spring的版本

  3. 打包 uid-generator

  4. 在项目中引入 uid-generator ,过程如下:

    • 在项目根目录下新建lib目录,将打包好的uid-generator jar包复制进来,修改项目pom,如下
      <dependency>
          <groupId>com.baidu.fsg</groupId>
          <artifactId>uid-generator</artifactId>
          <version>1.0.0-SNAPSHOT</version>
          <scope>system</scope>
          <systemPath>${project.basedir}/lib/uid-generator-1.0.0-SNAPSHOT.jar</systemPath>
      </dependency>
      在build中修改plugin配置:
      <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <configuration>
            <includeSystemScope>true</includeSystemScope>
          </configuration>
      </plugin>
      
    • 添加spring-boot-starter-jdbc、opengauss等其它依赖
  5. 拷贝 uid-generator的mybatis xml文件,结构如下

    mysql存放原有的xml,gaussdb存放gauss的xml,修改两个xml配置

  6. 复制 uid-generator源码:DisposableWorkerIdAssigner.java、WorkerNodeDAO.java到项目目录下

  7. 新建配置类,部分代码如下

    • mybatis配置
    @Primary
    @Bean
    public SqlSessionFactory sqlSessionFactory(final DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            DatabaseMetaData metaData = dataSource.getConnection().getMetaData();
            String databaseProductName = metaData.getDatabaseProductName().toLowerCase();
            logger.info("===>database product name is {}", databaseProductName);
            String xmlPath = XmlPathSelectFactory.selectXmlPath(databaseProductName).selectXmlPath();
            sqlSessionFactoryBean.setMapperLocations(resolver.getResources(xmlPath));
            return sqlSessionFactoryBean.getObject();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return null;
    }
    
    1. UidGenerator 配置:
    @Bean
    @ConditionalOnMissingBean
    public WorkerIdAssigner disposableWorkerIdAssigner() {
        return new DisposableWorkerIdAssigner();
    }
    
    @Bean
    @ConditionalOnMissingBean
    @Lazy
    public UidGenerator uidGenerator() {
        CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
        cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
        cachedUidGenerator.setScheduleInterval(60);
        cachedUidGenerator.setWorkerBits(15);
        cachedUidGenerator.setSeqBits(16);
        cachedUidGenerator.setTimeBits(32);
        cachedUidGenerator.setEpochStr("2022-01-01");
        return cachedUidGenerator;
    }
    

DEMO开发

  1. 在resource-server中开发 /v1/uid/create 接口

  2. 在接口的实现中调用:

    @Autowired
    private UidGenerator uidGenerator;
    
    @Override
    public String getUID() {
        long uid = uidGenerator.getUID();
        return uidGenerator.parseUID(uid);
    }
    
  3. 在启动类添加MapperScan注解

  4. 接口返回,如下信息:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。