xsequence 分布式序列号生成组件 1.3 发布

栏目: 软件资讯 · 发布时间: 6年前

内容简介:项目介绍 微服务时代,我们需要生产一个连续的友好的序列号,例如订单号等。变得比较麻烦。 这里我提供了两种业界常用的解决方案来实现这个分布式序列号生成组件。 使用集中式存储功能取步长进行分配。目前支持数...

项目介绍

微服务时代,我们需要生产一个连续的友好的序列号,例如订单号等。变得比较麻烦。

这里我提供了两种业界常用的解决方案来实现这个分布式序列号生成组件。

  1. 使用集中式存储功能取步长进行分配。目前支持数据库(Mysql)、Redis

  2. 使用雪花算法获取连续序列号,保证多服务器集群不重复

组件存在的目的就是屏蔽序列号底层实现,支持多样化的算法。让用户开箱即用。方便开发。

Maven支持

<dependency>
    <groupId>com.xuanner</groupId>
    <artifactId>xsequence-core</artifactId>
    <version>1.3</version>
</dependency>

升级说明

v1.3

新加特性:

(1)友好API的封装,让用户尽量少感知底层实现。

(2)对3种实现进行jmh基准测试,并做了结果对比。

(3)优化了雪花算法,支持线程安全。

更新时间:2018/05/31

性能对比

具体的测试报告可以在doc目录下的jmh文件夹里面找,这里做一个简单的介绍

数据库和 redis 部署主机配置:
CPU:1核
内存:1GB
操作系统:CentOS 6.8 64位
使用宽带:1Mbps

实现算法ops/s(每秒产生序列号)备注说明
使用DB获取区间53815 - 76030Mysql是单机部署,具体连接参数看测试包,步长1000
使用Redis获取区间117548 - 152014Redis是单机部署,步长1000
使用雪花算法获取4084391 - 4095248缺点就是长度比较长

总结: 上面取步长生成序列号的性能和具体DB、Redis的性能关系很大,而且和步长设置大小也有很大关系。 这里我用了比较差的机器配置。DB和Redis也都是单机比较差的。在这样的情况下,获取序列号的性能也还可以。 其中雪花算法的性能和机器没啥关系了,他的上限也没有可利用空间。使用Redis方式性能的提升空间最大。

简单使用

(1)使用DB获取区间方式

public class DbTest_Api extends BaseTest { private Sequence sequence; @Before public void setup() { //数据源 DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://121.196.218.206:3306/admin?characterEncoding=UTF-8");
        dataSource.setUsername("admin");
        dataSource.setPassword("xuan5769386");
        dataSource.setMaxActive(300);
        dataSource.setMinIdle(50);
        dataSource.setInitialSize(2);
        dataSource.setMaxWait(500); /**
         * 参数说明如下:
         * dataSource:数据库的数据源
         * bizName:具体某中业务的序列号
         * step:[可选] 默认1000,即每次取redis获取步长值,根据具体业务吞吐量来设置,越大性能越好,但是序列号断层的风险也就越大
         */ sequence = DbSeqBuilder.create().dataSource(dataSource).bizName("userId").build();
    } @Test public void test() {
        long start = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { System.out.println("++++++++++id:" + sequence.nextValue());
        } System.out.println("interval time:" + (System.currentTimeMillis() - start));
    }
}

(2)使用Redis获取区间方式

/** * 参数说明如下: * ip:redis连接ip * port:redis连接port * auth:如果redis设置了密码权限需要设置,没有就可以不用设置 * bizName:具体某中业务的序列号 * step:[可选] 默认1000,即每次取redis获取步长值,根据具体业务吞吐量来设置,越大性能越好,但是序列号断层的风险也就越大 */
sequence = RedisSeqBuilder.create().ip("121.196.218.206").port(6379).auth("xuannerpass").step(1000).bizName( "userId").build();

(3)使用雪花算法方式

 /** * 参数说明如下: * datacenterId: 一般可以设置机房标志,值只能设置[0-31]之间 * workerId: 一般设置主机编号,值只能设置[0-31]之间 * 只用这来那个值保证服务器唯一就可以 */
sequence = SnowflakeSeqBuilder.create().datacenterId(1).workerId(2).build();

GIT主页地址

https://gitee.com/xuan698400/xsequence


【声明】文章转载自:开源中国社区 [http://www.oschina.net]


以上所述就是小编给大家介绍的《xsequence 分布式序列号生成组件 1.3 发布》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

VC++.NET入门

VC++.NET入门

Davis Chapman / 中国电力出版社 / 2003-5 / 55.0

《VC++.NET入门》提供了学习Visual C++工具的循序渐进的指导和创建应用程序的向导。你将学习设计应用程序窗口、使用控件、显示图形、创建SDI和MDI应用程序、操作数据库以及创建多任务程序,也将学习在微软的新.E平台下使用Visual C++的一些基本技巧,以及学习它影响设计和编写应用程序的方式。一起来看看 《VC++.NET入门》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器