TinyID——分布式ID生成方案

TinyID是美团点评在分布式系统中作为唯一ID生成服务的开源框架,具有高性能、高可用、易扩展等特点。它的设计初衷是支持亿级业务的高并发场景下分布式ID的生成需求,可以应用于分布式系统或单体系统中。

一、优点

TinyID在设计之初就考虑了分布式场景下ID生成的需求,具有以下特点:

1.高性能

TinyID的ID生成是基于Twitter的snowflake算法的改进版,使用类似于rang(区间)的方式预分配ID,实现了高效的ID生成和毫秒级的响应。同时,通过与业务ID的分离,使得ID生成与具体业务无关,使得生成ID成为一种无状态的服务。

    /**
     * 获取下一个 id block
     *
     * @return
     */
    public BlockAllocator generate() {
        long newCursor = this.cursor + eachAllocatorSize;
        BlockAllocator blockAllocator = new BlockAllocator(this.cursor, newCursor);
        this.cursor = newCursor;
        return blockAllocator;
    }

2.高可用

TinyID采用分布式架构来保证服务的高可用性,即多个TinyID集群间通过Redis进行数据同步,实现任意数量的TinyID集群之间的无缝切换,同时还对Master节点进行了检测,确保业务量大的情况下极少重分配。

    /**
     * 尝试从 master 重新获取策略,避免 master 挂掉后一段时间内,tiny_server_list 持有老的策略
     */
    private synchronized void refreshTinyServerList() {
        try {
            String tinyServerList = getConfig(CONFIG_TINY_SERVER_LIST);
            if (StringUtils.isBlank(tinyServerList)) {
                LOGGER.error("tinyServerList is blank.");
                return;
            }
            Map newTinyServerMap = new ConcurrentSkipListMap();
            String[] tinyServerArray = tinyServerList.split(",");
            for (String tinyServer : tinyServerArray) {
                String addr = StringUtils.trim(tinyServer.split(":")[0]);
                newTinyServerMap.put(addr, "");
            }
            this.tinyServerAddrSet = newTinyServerMap.keySet();
        } catch (Exception e) {
            LOGGER.error("refreshTinyServerList error.", e);
        }
    }

3.易扩展

可以通过TinyID的机制添加新的实例来扩展系统的能力,并且不会影响已有的实例。

    /**
     * init tiny server list
     */
    private void initTinyServerList() {
        String tinyServerList = getConfig(CONFIG_TINY_SERVER_LIST);
        if (StringUtils.isBlank(tinyServerList)) {
            LOGGER.error("tinyServerList is blank.");
            return;
        }
        String[] tinyServerArray = tinyServerList.split(",");
        for (String tinyServer : tinyServerArray) {
            String addr = StringUtils.trim(tinyServer);
            TinyServerInfo serverInfo = new TinyServerInfo(addr);
            this.tinyServerInfoList.add(serverInfo);
        }
    }

二、使用方法

在使用TinyID之前,需要首先搭建好相关环境,安装好Java和Redis,然后按照以下方法使用TinyID:

1.下载TinyID的源代码

2.配置TinyID

tiny.servers.configuration.filepath=tiny-servers.properties
tiny.redis.configuration=file:/data/appdatas/tair.properties

3.编译TinyID

$ cd ~/tinyid
$ mvn package

4.启动TinyID server

$ java -jar target/tinyid-server-${version}.jar  #version为当前版本号

5.使用TinyID

// 获取可用的 id block
TinyIdClient tinyIdClient = new TinyIdClient("http://localhost:9999");
BlockResp resp = tinyIdClient.nextIdBlock(bizType);
Long start = resp.getStartId();
Long end = resp.getEndId();

三、总结

TinyID作为一种分布式ID生成方案,具有可靠性高,复杂度低的特点,更适用于大规模、高并发的分布式系统。以上是我们对TinyID的简要介绍和使用方法的详细说明,希望可以帮助读者更好地理解和使用它。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 05:03
下一篇 2024-11-26 05:03

相关推荐

  • KeyDB Java:完美的分布式高速缓存方案

    本文将从以下几个方面对KeyDB Java进行详细阐述:KeyDB Java的特点、安装和配置、使用示例、性能测试。 一、KeyDB Java的特点 KeyDB Java是KeyD…

    编程 2025-04-29
  • openeuler安装数据库方案

    本文将介绍在openeuler操作系统中安装数据库的方案,并提供代码示例。 一、安装MariaDB 下面介绍如何在openeuler中安装MariaDB。 1、更新软件源 sudo…

    编程 2025-04-29
  • Java Hmily分布式事务解决方案

    分布式系统是现在互联网公司架构中的必备项,但随着业务的不断扩展,分布式事务的问题也日益凸显。为了解决分布式事务问题,Java Hmily分布式事务解决方案应运而生。本文将对Java…

    编程 2025-04-28
  • Python性能优化方案

    本文将从多个方面介绍Python性能优化方案,并提供相应的示例代码。 一、使用Cython扩展 Cython是一个Python编译器,可以将Python代码转化为C代码,可显著提高…

    编程 2025-04-28
  • 使用RPC研发云实现分布式服务交互

    本文将基于RPC研发云,阐述分布式服务交互实现的过程和实现方式。 一、RPC研发云简介 RPC研发云是一种基于分布式架构的服务框架,在处理不同语言之间的通信上变得越来越流行。通过使…

    编程 2025-04-28
  • JL Transaction – 实现分布式事务管理的利器

    本文将为大家介绍JL Transaction,这是一款可以实现分布式事务管理的开源事务框架,它可以帮助企业在分布式环境下有效地解决事务的一致性问题,从而保障系统的稳定性和可靠性。 …

    编程 2025-04-28
  • NB设备上传数据方案

    NB(Narrow Band)是一种物联网通信技术,可以实现低功耗、宽覆盖、多连接等特点。本文旨在探讨如何使用NB设备上传数据。在这篇文章中,我们将介绍NB设备上传数据的基本原理、…

    编程 2025-04-27
  • 分布式文件系统数据分布算法

    数据分布算法是分布式文件系统中的重要技术之一,它能够实现将文件分散存储于各个节点上,提高系统的可靠性和性能。在这篇文章中,我们将从多个方面对分布式文件系统数据分布算法进行详细的阐述…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27
  • Rappor——谷歌推出的安全数据收集方案

    Rappor是一种隐私保护技术,可以在保持用户私密信息的前提下,收集用户的随机信号数据。它可以用于应对广泛的数据收集需求,让用户在参与数据收集的过程中感到安全和安心。 一、Rapp…

    编程 2025-04-27

发表回复

登录后才能评论