zoukankan      html  css  js  c++  java
  • Java版分布式ID生成器技术介绍

    分布式全局ID生成器作为分布式架构中重要的组成部分,在高并发场景下承载着分担数据库写瓶颈的压力。
    之前实现过PHP+Swoole版,性能和稳定性在生产环境下运行良好。这次使用Java进行重写,目前测试情况表现还不错,下面我简要介绍下java版的项目情况。
     
    技术架构:Netty + Zookeeper + Redis Protocol
    • Netty:是一个基于NIO的客户、服务端编程框架(类似于swoole)。使用netty作为服务端应用接收客户端请求,对Redis协议数据进行编解码,响应redis客户端请求。
    • Zookeeper:主要两个作用。一是生成器服务每个节点需预先定义唯一serverId,并注册到zk,由zk统一管理集群节点连接状态;二是自增序列sequenceId可交由zk管理,集群中的自增序列在毫秒级内共用一个值,不过这涉及到共享锁的资源竞争和网络传输,性能很差,默认没开启,下面有具体的压测情况。
     
    下面是通过redis-benchmark压测工具在本机对php版、java版、及原生redis-server进行压测的QPS数据(使用默认并发50)
     
    PHP版测试命令:redis-benchmark -h 127.0.0.1 -p 9501 -t get -n 200000 -q
     
    Java版测试命令:redis-benchmark -h 127.0.0.1 -p 3308 -t get -n 200000 -q
     
    自增序列sequenceId交由zk管理后性能堪忧~测试命令:redis-benchmark -h 127.0.0.1 -p 9300 -t get -n 2000 -q
     
    原生redis-server测试命令:redis-benchmark -h 127.0.0.1 -p 6379 -t get -n 200000 -q
    从压测数据上看,Java版相对于PHP版有接近一倍的性能提升,已经接近c语言编写的redis server。
    仅支持get命令,key格式固定如下:
     
    172.19.19.233:9303> get id.1
    4612394007866114075
    172.19.19.233:9303> get id.1.3
    4612394014021255195,4612394014021271579,4612394014021287963
    172.19.19.233:9303> get parse.4612393968093626395
    [1, 2018:11:16 15:15:02.707, 0, 1, 11]
     
    命令解释:
    get id.1 获取单个id,1为业务id,支持0-1023
    get id.1.3 一次性获取3个id,1为业务id
    get parse.4612393968093626395 解析id信息,反解出时间戳,业务id,集群节点id,自增id信息 
     
    敲其它命令会返回error信息。
  • 相关阅读:
    iphone、UI设计和PKM的混谈
    社保名单核对的难题
    LVDS技术原理和设计简介
    系统级芯片设计语言和验证语言的发展
    芯片封装(Chip Package)类型70种
    数字电平标准 TTL CMOS ECL LVDS CML...
    什么是施密特触发器(Schmitt Trigger)?
    组合逻辑电路中竞争冒险的分析
    ASIC设计流程(ASIC design flow)
    这18条背下来没人敢和你忽悠CPU
  • 原文地址:https://www.cnblogs.com/gouyg/p/IDIdentifier-for-java.html
Copyright © 2011-2022 走看看