位运算生成多柜台分布式交易系统中生成唯一订单ID

19 阅读2分钟

IDConverter 类说明文档

public class IDConverter {

    public static long combineInt2Long(int high, int low) {
        // 使用无符号转换避免负数符号扩展问题
        return (((long) high & 0xFFFFFFFFL) << 32) | ((long) low & 0xFFFFFFFFL);
    }

    public static int[] seperateLong2Int(long val) {
        int[] res = new int[2];
        res[1] = (int) (val & 0xFFFFFFFFL); // 低位
        res[0] = (int) ((val >>> 32) & 0xFFFFFFFFL); // 高位,使用逻辑右移
        return res;
    }

}

概述

IDConverter 是一个用于在分布式交易系统中处理ID转换的工具类。它提供了将两个32位整数合并为一个64位长整数,以及将64位长整数拆分为两个32位整数的功能。

功能说明

combineInt2Long 方法

将两个32位整数(高位和低位)合并成一个64位长整数。

seperateLong2Int 方法

将一个64位长整数拆分成两个32位整数数组,索引0为高位,索引1为低位。

设计目的

在分布式交易系统中,需要生成全局唯一的订单ID。该类的主要目的是:

  1. 组合分布式ID: 将柜台ID(高32位)和本地订单ID(低32位)组合成一个全局唯一的64位订单ID
  2. 信息编码: 在单一ID中同时携带柜台信息和订单信息,便于后续解析和追踪
  3. 简化处理: 提供便捷的方法来组合和拆分ID,方便在不同系统组件间传递和解析

使用场景

主要用于订单系统的ID生成,特别是在以下场景中:

  1. 多柜台分布式交易系统中生成唯一订单ID
  2. 需要根据订单ID反向解析出所属柜台和本地订单编号的场景
  3. 系统间数据传输时保持ID的完整性和可解析性

优势

  1. 简单直观: 实现简洁,易于理解和维护
  2. 信息丰富: 单个ID包含了柜台和订单两层信息
  3. 双向转换: 支持组合和拆分操作,使用灵活
  4. 高效性能: 采用位运算实现,执行效率高

注意事项

  1. 输入的两个整数都应为正数,避免符号位影响
  2. 确保高低位整数值在32位范围内,防止数据溢出
  3. 在分布式环境中使用时,需保证各柜台ID的唯一性

行业对比

虽然此方案能满足基本需求,但在实际工业级应用中,更推荐使用以下成熟的分布式ID生成方案:

  1. Snowflake算法: Twitter开源的分布式ID生成算法,具有时间有序性,是业界广泛采用的标准方案
  2. UUID: 通用唯一识别码,适用于各种分布式场景
  3. 专门的ID生成服务: 如美团的Leaf、百度的UidGenerator等