一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して11日目です。クリックしてイベントの詳細をご覧ください。
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になりました
設定の変更:
修改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
复制代码
起動後:
このスタートアップは、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
复制代码
tinyidは、単一IDの生成とバッチ生成を提供します。
ヒント:バッチ生成は効率を向上させますが、呼び出し元が使用されていない生成されたバッチIDを使用すると無駄になります。
2.3Javaクライアントの使用
tinyidプロジェクトのjava-clientのテストクラスを使用できます。
tinyid_client.propertiesを変更します:
tinyid.server=172.27.53.158:9999
tinyid.token=0f673adf80504e2eaa552f5d791b644c
复制代码
3.まとめ
tinyidのアイデアは、セグメンテーションを通じてMeituanLeafと同じセグメンテーションモードを実現することです。Meituanのセグメントモードが改善されました。同時に、クライアントモードが提供されます。クライアントモードは、ID生成の効率を高め、フォールトトレランス率を向上させます。HTTPが利用できないが、ローカルクライアントがしばらく利用できる場合。使用される時間の長さは、ステップの長さとIDが消費される速度にも依存します。
私は象を運ぶアリです。記事はあなたに役立ちます。いいねしてフォローしてください。記事が間違っている場合はコメントを残してください〜ありがとう
参照: