分散IDジェネレーター-Tinyid

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して11日目です。クリックしてイベントの詳細をご覧ください

image.png

1. Tinyid

inyidは、データベース番号セグメントアルゴリズム(Didiによって開発された)に基づいてJavaで開発された分散ID生成システムです。このアルゴリズムは、MeituanのLeaf分散リーフセグメントデータベースソリューションに似ています。Snowflakeアルゴリズムの実装は提供されていません。Tinyidの機能:

  • 提供されるIDは長いタイプであり、MeituanのLeafおよびSnowflakeアルゴリズムによって生成されたIDと同じです。
  • Httpアクセスを提供し、Javaクライアントも提供します。このクライアントメソッドは、Httpが使用できない場合でもローカルで生成できます。(可用性はステップサイズによって異なります)。Javaクライアントは、データ生成のパフォーマンスを大幅に向上させます。
  • 同様の注文のシナリオには適用されません。これはMeituan'sLeafと同じです。注文量を簡単に予測できます。

2.TinyidJavaの実装

2.1 Tinyid Service

クローンコード:

git clone https://github.com/didi/tinyid.git
复制代码

スクリプトを実行します。

CREATE TABLE `tiny_id_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `biz_type` varchar(63) NOT NULL DEFAULT '' COMMENT '业务类型,唯一',
  `begin_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '开始id,仅记录初始值,无其他含义。初始化时begin_id和max_id应相同',
  `max_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '当前最大id',
  `step` int(11) DEFAULT '0' COMMENT '步长',
  `delta` int(11) NOT NULL DEFAULT '1' COMMENT '每次id增量',
  `remainder` int(11) NOT NULL DEFAULT '0' COMMENT '余数',
  `create_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '更新时间',
  `version` bigint(20) NOT NULL DEFAULT '0' COMMENT '版本号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_biz_type` (`biz_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT 'id信息表';

CREATE TABLE `tiny_id_token` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `token` varchar(255) NOT NULL DEFAULT '' COMMENT 'token',
  `biz_type` varchar(63) NOT NULL DEFAULT '' COMMENT '此token可访问的业务类型标识',
  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  `create_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT 'token信息表';

INSERT INTO `tiny_id_info` (`id`, `biz_type`, `begin_id`, `max_id`, `step`, `delta`, `remainder`, `create_time`, `update_time`, `version`)
VALUES
	(1, 'test', 1, 1, 100000, 1, 0, '2018-07-21 23:52:58', '2018-07-22 23:19:27', 1);

INSERT INTO `tiny_id_info` (`id`, `biz_type`, `begin_id`, `max_id`, `step`, `delta`, `remainder`, `create_time`, `update_time`, `version`)
VALUES
	(2, 'test_odd', 1, 1, 100000, 2, 1, '2018-07-21 23:52:58', '2018-07-23 00:39:24', 3);


INSERT INTO `tiny_id_token` (`id`, `token`, `biz_type`, `remark`, `create_time`, `update_time`)
VALUES
	(1, '0f673adf80504e2eaa552f5d791b644c', 'test', '1', '2017-12-14 16:36:46', '2017-12-14 16:36:48');

INSERT INTO `tiny_id_token` (`id`, `token`, `biz_type`, `remark`, `create_time`, `update_time`)
VALUES
	(2, '0f673adf80504e2eaa552f5d791b644c', 'test_odd', '1', '2017-12-14 16:36:46', '2017-12-14 16:36:48');
复制代码

ヒント:データはCHARSETによって変更され、utf8はutf8mb4になりました

image.png

設定の変更:

修改tinyid-server/src / main / resources / offset / application.properties

datasource.tinyid.type=org.apache.tomcat.jdbc.pool.DataSource

datasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driver
datasource.tinyid.primary.url=jdbc:mysql://192.168.43.129:3306/leaf?useUnicode=true&characterEncoding=utf-8
datasource.tinyid.primary.username=root
datasource.tinyid.primary.password=sys123456
复制代码

mysql8を使用しているので、コードmysql-connector-javaのました。

サービスを開始します。

cd tinyid-server/
sh build.sh offline
java -jar output/tinyid-server-0.1.0-SNAPSHOT.jar
复制代码

起動後:

image.png

このスタートアップは、Meituan'sLeafよりもはるかにシンプルで簡単です。

2.2 REST API

nextId:
curl 'http://localhost:9999/tinyid/id/nextId?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response:{"data":[2],"code":200,"message":""}

nextId Simple:
curl 'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response: 3

with batchSize:
curl 'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test&token=0f673adf80504e2eaa552f5d791b644c&batchSize=10'
response: 4,5,6,7,8,9,10,11,12,13

Get nextId like 1,3,5,7,9...
bizType=test_odd : delta is 2 and remainder is 1
curl 'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test_odd&batchSize=10&token=0f673adf80504e2eaa552f5d791b644c'
response: 3,5,7,9,11,13,15,17,19,21
复制代码

image.png

tinyidは、単一IDの生成とバッチ生成を提供します。

ヒント:バッチ生成は効率を向上させますが、呼び出し元が使用されていない生成されたバッチIDを使用すると無駄になります。

2.3Javaクライアントの使用

tinyidプロジェクトのjava-clientのテストクラスを使用できます。

image.png

tinyid_client.propertiesを変更します

tinyid.server=172.27.53.158:9999
tinyid.token=0f673adf80504e2eaa552f5d791b644c
复制代码

3.まとめ

tinyidのアイデアは、セグメンテーションを通じてMeituanLeafと同じセグメンテーションモードを実現することです。Meituanのセグメントモードが改善されました。同時に、クライアントモードが提供されます。クライアントモードは、ID生成の効率を高め、フォールトトレランス率を向上させます。HTTPが利用できないが、ローカルクライアントがしばらく利用できる場合。使用される時間の長さは、ステップの長さとIDが消費される速度にも依存します。

私は象を運ぶアリです。記事はあなたに役立ちます。いいねしてフォローしてください。記事が間違っている場合はコメントを残してください〜ありがとう

参照:

おすすめ

転載: juejin.im/post/7085350471023460388