|
Tinyidは、REST APIとJavaクライアントの2つの取得方法を提供するID生成サービスです。公式発表によると、Javaクライアントを使用すると、単一インスタンスあたり1,000万QPS以上のパフォーマンスを実現できるとのことです。すごいですね! 注意: Tinyid には JDK 1.7 以上が必要です。
ギットハブTinyid のオープンソース GitHub アドレス: https://github.com/didi/tinyid 。 Tinyidの実行Tinyid ソース コードをローカル マシンにダウンロードし、IntelliJ IDEA にインポートしたら、実行する準備が整いました。 1. SQLのインポートTinyidは、MySQLデータベーススクリプトであるSQLスクリプトパスtinyid/tinyid-server/db.sqlに依存しています。MySQLクライアントにログインし、tinyidデータベースを作成した後、コマンド「source /data/tinyid/tinyid-server/db.sql」を実行してください。「show tables」を実行後、tiny_id_infoとtiny_id_tokenという2つのテーブルが表示されれば、データベースの作成は成功です。また、スクリプトによって2つのデータベースエントリが初期化されています。 - 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. MySQLへの依存
tinyid プロジェクトでは、デフォルトで MySQL ドライバー バージョン 5.x が必要であり、Maven 座標は次のようになることに注意することが重要です。 - <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version> 5.1 . 44 </version></dependency>
MySQL サーバーのバージョンが 8.x の場合 (ローカル マシンでは MySQL バージョン 8.x を使用しています)、起動時にデータベース接続エラーが発生する可能性があります。 - 原因: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 ドライバーのバージョンをアップグレードしてください)。 - <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version> 8.0 . 11 </version></dependency>
3. 設定を変更する次に、application.propertiesファイルを更新する必要があります。これは主にデータベース関連の設定の更新を伴い、具体的な値はMySQL環境によって異なります。 - datasource.tinyid.primary.driver- class -name=com.mysql.jdbc.Driverdatasource.tinyid.primary.url=jdbc:mysql:
4. TinyIDを起動するTinyIdプロジェクトはSpring Bootをベースに開発されているため、起動は非常に簡単です。メインクラスであるTinyIdServerApplication.javaを実行するだけです。実行後に以下のログが表示されれば、起動は成功です。 - 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とtokenの値については、tiny_id_tokenテーブルを参照してください。 - http:
クライアント統合tinyid は、次の Maven 座標のみを必要とするクライアント統合モードもサポートしています。 - <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=" の 1 番目と 2 番目のパラメーターです。 - tinyid.server=localhost:9999tinyid.token=0f673adf80504e2eaa552f5d791b644c
tinyid.server は複数のアドレス構成もサポートしており、複数のアドレスはコンマで区切られます。例: tinyid.server=host1:9999,tinyid.server=host2:9999。
次に、tinyid でカプセル化された API を呼び出すことで、分散 ID を簡単に取得できます。以下にサンプルコードを示します。「test」は「bizType」の値です。 -
設定からわかるように、tinyid-client は基本的に tinyid-server に依存しています。tinyid-server への HTTP リクエストをカプセル化し、ユーザーに最も基本的な API を公開しているだけです。tinyid-server への HTTP リクエストは TinyIdHttpUtils.java にカプセル化されており、JDK ネイティブの HttpURLConnection に依存しています。驚くべきことに、okhttp! のような優れたサードパーティ製 HTTP クライアント パッケージは使用していません。 TinyIDの原則TinyIDの原理は非常にシンプルです。データベーステーブルのデータからその構造を大まかに推測できます。これは典型的なセグメントパターンであり、Meituanのリーフモデルとほぼ同じです。下の図はこの原理を示しています。同じBizTypeを例にとると、各TinyIDサーバーは異なるセグメントに割り当てられます。例えば、最初のTinyIDサーバーは[1000, 2000]、2番目は[2000, 3000]、3番目は[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]) を非同期に割り当てます。 |