Didi は数千万人の同時ユーザーを持つ分散 ID ジェネレーターをオープンソース化

Didi は数千万人の同時ユーザーを持つ分散 ID ジェネレーターをオープンソース化

Tinyid は、REST API と Java クライアントの 2 つの取得方法を提供する ID ジェネレーター サービスです。 Java クライアント取得方法を使用する場合、公式は単一インスタンスで 1kw QPS (Java クライアントを使用する場合、単一インスタンスあたり1000 万 QPS以上) に到達できると主張しています。すごいですね!

注意: Tinyid には JDK 1.7 以上が必要です。

ギットハブ

Tinyid オープンソース Github アドレス: https://github.com/didi/tinyid

Tinyidを実行する

Tinyid ソースコードをローカルにダウンロードし、idea にインポートしたら、実行する準備が整います。

1. SQLのインポート

Tinyid が依存する SQL スクリプト パスは tinyid/tinyid-server/db.sql です。これは MySQL データベースのスクリプトです。 MySQL クライアントにログインして tinyid データベースを作成した後、コマンド source /data/tinyid/tinyid-server/db.sql を実行します。 show tables コマンドを実行した後、 tiny_id_infotiny_id_tokenの 2 つのテーブルが表示されれば、テーブルは正常に作成されています。そして、スクリプトは次の 2 つのデータを初期化しました。

  1. mysql>tiny_id_tokenからid、トークン、biz_typeを選択します。+----+----------------------------------+----------+|id|token|biz_type|+----+------------------------------------+----------+| 1 |0f673adf80504e2eaa552f5d791b644c|テスト|| 2 |0f673adf80504e2eaa552f5d791b644c|test_odd|+----+----------------------------------+-----------+2rowsinset( 0 .08sec)mysql>selectid、biz_type、begin_id、max_id、step、deltafromtiny_id_info;+----+-----------+----------+----------+---------+---------+--------+|id|biz_type|begin_id|max_id|step|delta|+----+-----------+----------+----------+---------+--------+--------+| 1 |テスト| 1 | 1 | 100000 | 1 || 2 |テスト奇数| 1 | 1 | 100000 | 2 |+----+-----------+----------+---------+--------+-------+2rowsinset( 0 .01秒)
  2. 2. MySQL の依存関係

ここで注目すべき点は、tinyid プロジェクトはデフォルトで MySQL ドライバー パッケージの 5.x バージョンに依存しており、Maven 座標は次のようになることです。

  1. <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version> 5.1 44 </バージョン></依存関係>

MySQL サーバーのバージョンが 8.x の場合 (著者のローカル MySQL は 8.x)、起動プロセス中にデータベース接続エラーが発生する可能性があります。

  1. 原因:java.sql.SQLException:Unabletoloadauthenticationplugin 'caching_sha2_password' .atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java: 868 )~[mysql-connector-java- 5.1 . 44 .jar: 5.1 . 44 ]atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java: 864 )~[mysql-connector-java- 5.1 . 44 .jar: 5.1 . 44 ]atcom.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java: 1746 )~[mysql-connector-java- 5.1 . 44 .jar: 5.1 . 44 ]atcom.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java: 1226 )~[mysql-connector-java- 5.1 . 44 .jar: 5.1 . 44 ]......

この場合、MySQL ドライバーをバージョン 8.x にアップグレードする必要があります (注: 他の MySQL バージョンを使用しており、tinyid の起動時に同様の例外が発生する場合は、状況に応じて MySQL ドライバーのバージョンをアップグレードしてください)。

  1. <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version> 8.0 11 </バージョン></依存関係>

3. 設定を変更する

次に、構成 application.properties ファイルを更新する必要があります。主にデータベース関連の設定を更新します。具体的な値は MySQL 環境によって異なります。

  1. datasource.tinyid.primary.driver- class -name=com.mysql.jdbc.Driverdatasource.tinyid.primary.url=jdbc:mysql: //localhost:3306/tinyid?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8datasource.tinyid.primary.username=afeidatasource.tinyid.primary.password=afei  

4. tinyidを起動する

tinyid プロジェクトは Springboot をベースに開発されているため、開始するのは非常に簡単です。メインクラス TinyIdServerApplication.java を実行するだけです。実行後に次のログが表示された場合、起動は成功したことを意味します。

  1. 00:20:55 761 [main ] [ INFO ] osbcetTomcatEmbeddedServletContainer-Tomcatstartedonport( s ) : 9999 ( http ) 00:20:55 767 [main][INFO]cxutsTinyIdServerApplication - StartedTinyIdServerApplicationin5.092seconds(JVMrunningfor6.29 ) 00:21:00 001 [pool- 3 - thread- 1 ][ INFO ] cxutssiTinyIdTokenServiceImpl -refreshtokenbegin00: 21 : 00 002 [pool- 3 -thread- 1 ][INFO]cxutssiTinyIdTokenServiceImpl-tinyIdtokeninitbegin00: 21 : 00 006 [プール- 3 -スレッド- 1 ][INFO]cxutssiTinyIdTokenServiceImpl-tinyIdtokeninitsuccess、トークン サイズ: 200 : 22 : 00、001 [プール- 3 -スレッド- 1 ][INFO]cxutssiTinyIdTokenServiceImpl-refreshtokenbegin。 。 。 。 。 。

5. 固有のIDを取得する

次に、REST API を通じて配布された一意の ID を取得してみます。リクエスト例は以下のとおりです。 bizTypeとトークンの値については、tiny_id_tokenテーブルを参照してください。

  1. http: //localhost:9999/tinyid/id/nextId?bizType=test&token=0f673adf80504e2eaa552f5d791b644c より 

クライアント統合

tinyid はクライアント統合モードもサポートしており、次の Maven 座標を導入するだけです。

  1. <dependency><groupId>com.xiaoju.uemc.tinyid</groupId><artifactId>tinyid-client</artifactId><version>${tinyid.version}</version></dependency>

次に、クラスパスに次の内容を含む構成ファイル tinyid_client.properties を作成します。これら 2 つのパラメーターは、IdGeneratorFactoryClient.java の tinyid サーバー要求アドレス "http://{0}/tinyid/id/nextSegmentIdSimple?token={1}&bizType=" の最初のパラメーターと 2 番目のパラメーターです。

  1. tinyid.server=localhost:9999tinyid.token=0f673adf80504e2eaa552f5d791b644c

tinyid.server は複数のアドレス構成もサポートしており、複数のアドレスは英語のカンマで区切られます。例: tinyid.server=host1:9999,tinyid.server=host2:9999。

次に、tinyid によってカプセル化された API を呼び出すだけで、分散 ID を取得できます。サンプルコードは次のとおりです。ここで、test は bizType の値です。

  1. //単一の分散 ID を取得 Longid=TinyId.nextId("test"); // 複数の分散 ID を一括で取得します。List<Long>ids=TinyId.nextId("test",10);  

構成から、tinyid-client は基本的に tinyid-server に依存していることがわかりますが、tinyid-server への HTTP リクエストをカプセル化し、ユーザーに最もシンプルな API を公開します。 tinyid-server への HTTP リクエストは TinyIdHttpUtils.java にカプセル化されており、JDK のネイティブ HttpURLConnection に依存しており、okhttp などの他のサードパーティの優れた HTTP クライアント パッケージは使用しません。

TinyIDの原則

tinyid の原理は非常にシンプルです。基本的には、データベース テーブルのデータに基づいて推測できます。これは古典的なセグメントモードであり、Meituan のリーフ原理とほぼ同じです。概略図は以下のとおりです。同じ bizType を例にとると、各 tinyid-server は異なるセグメントに割り当てられます。たとえば、最初の tinyid-server は (1000, 2000] に割り当てられ、2 番目の tinyid-server は (2000, 3000] に割り当てられ、3 番目の tinyid-server は (3000, 4000] に割り当てられます。

最初の tinyid-server を例にとると、そのセグメントが 20% 使用している場合 (コア ソース コード: segmentId.setLoadingId(segmentId.getCurrentId().get() + idInfo.getStep() * Constants.LOADING_PERCENT / 100);、LOADING_PERCENT の値は 20)、つまり、loadingId を 20% のしきい値に設定します。たとえば、現在の ID が 10000 で、ステップ サイズが 10000 の場合、loadingId=12000 になります。その後、リクエストに割り当てられた分散 ID が 12001 に達すると (または再起動後)、つまり loadingId を超えると、特別なコードが返されます: new Result(ResultCode.LOADING, id); tinyid-server は、応答コード ResultCode.LOADING などに応じて、次のセグメント (4000、5000]) を非同期的に割り当てます。

<<:  リアンタイクラスタークリスタルシリーズ製品が発売されました、衝撃的!

>>:  クラウド移行を活用してデジタル変革を推進する方法

推薦する

Alibaba Cloudは、究極のパフォーマンス、セキュリティ、信頼性を備えた初のエンタープライズレベルのブロックストレージ製品、Apsara Block Storageをリリースしました。

6月14日、アリババクラウドは、ローカルデータセンターに導入できる初のエンタープライズレベルのブロッ...

フォーラムの管理方法

しばらく忙しくしていた後、私は徐々に SEO サークルから離れていきました。誰もが私のことを忘れてし...

今日の SEO 業界環境の健全性に影響を与える 3 つの主要グループの解釈

今日の SEO 業界では、SEO の終末が近づいているという発言をよく目にしますが、著者の意見では、...

広州でウェブサイトを構築するにはどれくらいの費用がかかりますか?サーバーの選択方法は?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています普通の顧客...

WordPress 5.x が気に入らないですか? WordPressのバージョンをダウングレードしましょう!

WordPress 5.4 から 5.5 へのアップグレードでは多くの変更があり、アップグレード後に...

ウェブサイトのコンテンツタイトルを最適化するのは得意ですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています魚が水から...

百度の独創性は実はこんな感じ

Baidu の Spark Original Program が開始されて以来、多くのウェブマスター...

ウェブサイトに「ロックを追加」動的パスワードを簡単に実現

インターネットの普及に伴い、ネットワークセキュリティの問題はますます深刻になっています。有名な技術交...

ハイブリッドクラウドセキュリティから学んだ教訓

いつものことですが、特に安全性に関しては、人々は自分の失敗から学ぶよりも他人から学ぶことを好みます。...

Terraform を使用してクラウド構築を高速化します。学びましたか?

この記事では、Terraform と AWS を使用する利点について説明し、理解を深めるためにこのコ...

スパムマーケターへの新年のアドバイス:他人と自分に利益をもたらすことでのみ長期的な成功を達成できる

新年を迎えて、私のブログが大量のジャンクマーケティング情報で始まるとは夢にも思いませんでした。わずか...

トレンド: 2022 年のクラウド コンピューティングに関する 3 つの予測

2021 年には、重要なワークロードを単一のクラウド ベンダーに任せるとかなりのリスクを伴うことがは...

Wikibon: クラウドはビッグデータ分析の恩恵を享受するための触媒となる

近年、ビッグデータ分析はデジタルビジネスの中核となり、データをビジネス価値に変換し、差別化された業務...

SAASオンラインエンパワーメント、不動産エコシステムはフルシナリオ接続とインテリジェントな運用へと移行しています

[51CTO.comからのオリジナル記事] 2016年の「不動産エコシステムの革新を推進する新技術」...

動画ウェブサイトの新たな活路?自社制作ドラマの社内外派生マーケティング

動画ウェブサイトにとって最大の悩みの種は、コンテンツと収益性です。コンテンツがあればユーザートラフィ...