Springboot は Baidu のオープンソース分散 ID ジェネレータ UIDGenerator を統合します

Springboot は Baidu のオープンソース分散 ID ジェネレータ UIDGenerator を統合します

[[411081]]

環境: sprinboot2.3.12.RELEASE + uid-generator1.0.0

導入

UidGenerator は、Java で実装され、Snowflake アルゴリズムに基づいた一意の ID ジェネレーターです。 UidGenerator は、アプリケーション プロジェクト内でコンポーネントとして動作し、カスタムの workerId 数字と初期化戦略をサポートし、Docker などの仮想化環境での自動インスタンス再起動やドリフトなどのシナリオに適しています。実装の面では、UidGenerator は将来の時間を借用することでシーケンスの自然な並行性の制限を解決します。 RingBuffer は、生成された UID をキャッシュし、UID の生成と消費を並列化し、同時に CacheLine を埋めるために使用され、RingBuffer によって発生するハードウェア レベルの「誤った共有」問題を回避します。最終的には、単一マシンの QPS は 600 万に達します。

依存関係バージョン: Java 8 以上、MySQL (組み込みの WorkerID アロケータ、起動時に DB を通じて割り当てられます。カスタマイズされている場合、DB は必須の依存関係ではありません)

スノーフレークアルゴリズム


スノーフレーク アルゴリズムの説明: 指定されたマシンと同時および特定の同時シーケンスは一意です。これに基づいて、64 ビットの一意の ID (long) を生成できます。デフォルトのバイト割り当て方法は上記のとおりです。

  • sign(1bit) 固定 1 ビットの符号識別子。つまり、生成される UID は正の数です。
  • デルタ秒(28ビット)現在の時刻は、タイムベースポイント「2016-05-20」を基準として秒単位で表され、最大約8.7年までサポートできます。
  • ワーカー ID (22 ビット) マシン ID。最大約 420 万台のマシン起動をサポートできます。組み込み実装は、起動時にデータベースによって割り当てられます。デフォルトの割り当て戦略は「使用して忘れる」であり、再利用戦略は後で提供できます。
  • シーケンス (13 ビット) 1 秒あたりの同時接続数。 13 ビットでは、1 秒あたり 8192 の同時接続をサポートできます。

上記のパラメータはSpringを通じてカスタマイズできます。

キャッシュされたUidジェネレータ

RingBuffer は円形配列であり、配列の各要素がスロットになります。デフォルトでは、RingBuffer の容量は、Snowflake アルゴリズムのシーケンスの最大値、つまり 2^N です。 boostPower 構成を通じて容量を拡張し、RingBuffer の読み取りおよび書き込みスループットを向上させることができます。

テール ポインターとカーソル ポインターは、円形配列のスロットの読み取りと書き込みに使用されます。

  • テール ポインターは、プロデューサーによって生成された最大シーケンス番号を示します (このシーケンス番号は 0 から始まり、増加し続けます)。 Tail は Cursor を超えることはできません。つまり、プロデューサーは未使用のスロットを上書きできません。 Tailがcurosrに追いついたら、rejectedPutBufferHandlerを通じてPutRejectPolicyを指定できます。
  • カーソル ポインターは、コンシューマーによって消費される最小のシーケンス番号を表します (シーケンス番号のシーケンスはプロデューサのシーケンスと同じです)。カーソルはテールを超えることはできません。つまり、未生成のスロットを消費することはできません。カーソルが末尾に追いついたら、rejectedTakeBufferHandlerを通じてTakeRejectPolicyを指定できます。

CachedUidGenerator はデュアル リング バッファを使用します。Uid-RingBuffer は Uid を保存するために使用され、Flag-RingBuffer は Uid ステータス (埋められるかどうか、消費できるかどうか) を保存するために使用されます。

配列要素はメモリ内に連続的に割り当てられるため、CPU キャッシュを最大限に活用してパフォーマンスを向上させることができます。しかし、それは「偽りの共有」の問題も引き起こすでしょう。このため、Tail、Cursor ポインター、Flag-RingBuffer では CacheLine パディング方式が使用されます。


リングバッファ充填時間

  • 事前に入力された RingBuffer を初期化します。初期化すると、RingBuffer 全体が事前に入力されます。
  • テイク消費をリアルタイムで埋める際、残りの使用可能スロット(末尾 - カーソル)をリアルタイムで確認します。設定されたしきい値より少ない場合は、空きスロットを埋めます。しきい値は paddingFactor を通じて設定できます。クイック スタートの CachedUidGenerator 構成を参照してください。
  • 空きスロットを定期的に埋めるために、スケジュール スレッドを通じて定期的な埋め合わせが行われます。 scheduleInterval を使用して、スケジュールされた充填機能を設定し、スケジュールの時間間隔を指定できます。

上記はBaiduの公式紹介です。次に、これを Springboot プロジェクトに統合します。

UIDGenerator ダウンロード

uid-generatorを次のアドレスからダウンロードしてください


UIDGenerator 環境設定

テーブルを作成

  1. 落とす テーブルが存在する場合、WORKER_NODE;
  2. 作成する テーブルWORKER_NODE
  3. IDビッグイント ない  NULL AUTO_INCREMENT COMMENT '自動増分ID' ,
  4. HOST_NAME VARCHAR (64)なし  NULL COMMENT 'ホスト名'
  5. ポート・ヴァーチャー 64)   NULLコメント'ポート'
  6. タイプINT  ない  NULL COMMENT 'ノードタイプ: ACTUAL または CONTAINER'
  7. LAUNCH_DATE日付 ない  NULLコメント「発売日」
  8. 変更されたタイムスタンプ ない  NULLコメント'更新時刻'
  9. 作成日時 ない  NULLコメント「作成時刻」
  10. 主要な キー(ID)
  11. )COMMENT= 'UID ジェネレーターの DB WorkerID アサイナー' 、ENGINE = INNODB;

そのプロジェクト内のmapper.xmlファイルを、WorkerNodeEntity、WorkerNodeDAOに対応する自分のプロジェクトにコピーします。

DisposableWorkerIdAssigner が独自のプロジェクトにコピーされます。

DisposableWorkerIdAssigner は主に、注入された DAO を変更します。ここでは、デフォルトの DAO 関連の設定を変更する必要があるためです。

プロジェクト構成

頼る

  1. <依存関係>
  2. <グループID>mysql</グループID>
  3. <artifactId>mysql-コネクタ-java</artifactId>
  4. <scope>ランタイム</scope>
  5. </依存関係>
  6. <依存関係>
  7. <グループ ID>org.mybatis.spring.boot</グループ ID>
  8. <artifactId>mybatis-spring-boot-starter</artifactId>
  9. <バージョン>2.1.4</バージョン>
  10. </依存関係>
  11. <依存関係>
  12. <groupId>com.github.pagehelper</groupId>
  13. <artifactId>ページヘルパー-スプリングブートスターター</artifactId>
  14. <バージョン>1.3.0</バージョン>
  15. </依存関係>

mybatisの設定

  1. ページヘルパー:
  2. ヘルパー方言: mysql
  3. 合理的:本当 
  4. ページサイズゼロ: true  
  5. ページ番号としてオフセット: true  
  6. 行境界カウント: true  
  7. ---  
  8. マイバティス:
  9. タイプエイリアスパッケージ: com.pack.domain
  10. マッパーの場所:
  11. - クラスパス:/mappers/*.xml
  12. 構成:
  13. 遅延読み込みが有効: false  
  14. 積極的な遅延読み込み: false   

マッパー ファイル内の名前空間と対応するドメインを独自のパスに変更します。

UIDGenerator の設定

  1. @構成
  2. パブリッククラスUIDConfig{
  3.      
  4. @ビーン
  5. パブリックDefaultUidGenerator defaultUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner) {
  6. デフォルトのUidGenerator defaultUidGenerator = 新しい DefaultUidGenerator();
  7. デフォルトの UidGenerator.setWorkerIdAssigner(使い捨ての WorkerIdAssigner);
  8. デフォルトUidGenerator.setTimeBits(29);
  9. デフォルトUidGenerator.setWorkerBits(21);
  10. デフォルトUidGenerator.setSeqBits(13);
  11. デフォルトのUidGenerator.setEpochStr( "2021-01-01" );
  12. defaultUidGeneratorを返します
  13. }
  14.  
  15. }

ご了承ください

DisposableWorkerIdAssigner は Baidu によって提供されるものではなく、独自のプロジェクトにコピーされます。

  1. @成分
  2. パブリッククラス DisposableWorkerIdAssigner は WorkerIdAssigner を実装します {
  3. @リソース
  4. プライベート WorkerNodeMapper workerNodeDAO;
  5. // その他のコード
  6. }

これですべての設定が完了しました。

テスト

  1. @リソース
  2. プライベート DefaultUidGenerator uidGenerator;
  3.      
  4. @テスト
  5. パブリックボイドテストジェネレータID(){
  6. ( int i = 0; i < 10; i++) {
  7. System.out .println (uidGenerator.getUID());
  8. }
  9. }


完了!!!

<<:  2020年、わが国のクラウドコンピューティング市場の規模は1,781億元に達し、成長率は33.6%でした。

>>:  面接で必ず聞かれるJVMランタイムデータ領域について理解していますか?

推薦する

itldc ウクライナ サーバー: €19.9/G1610/4g メモリ/500g ハードディスク/無制限トラフィック

月額料金がわずか 20 ユーロ (1 回限りのセットアップ料金 10 ユーロ)、帯域幅が 100 M...

ターンキーインターネットウェブホスティング $1.48/月 (14 歳)

turnkeyinternet では、この仮想ホストが 50% オフで、リソースは「言葉では言い表せ...

360は資本協力で医薬品露出を共同で推進していると報じられている

2月21日早朝のニュースでは、Jikesouと360が資本提携の可能性について協議中であると報じられ...

クラウドネイティブテクノロジーマップを1つの記事で理解する

クラウド ネイティブ アプリケーションとテクノロジを追跡および調査している場合は、Cloud Nat...

報告書によれば、サイバー犯罪による世界の損失は年間4450億ドル

新浪科技報 北京時間6月10日朝のニュースによると、戦略国際問題研究所(以下、「CSIS」)は月曜日...

クラウドコンピューティングにおけるアプリケーションマッピングの重要性

クラウド アプリケーション マッピングとは、一般的に、従来のオンプレミス サーバー環境からクラウド ...

301リダイレクト戦略はウェブサイトの再設計に必須です

ウェブサイトの改訂は、すべてのウェブマスターにとって頭痛の種です。主な理由は、ウェブサイトが適切に改...

Weibo外部リンクの最適化効果の分析例

Baidu は Weibo の URL を読み取る機能を備えているため、Weibo 上の URL は...

ウェブサイトの合理的な運営はウェブサイトの影響力を高める

良いウェブサイトとは、ウェブサイトの掲載とトラフィックに他なりません。その両方を備えたウェブサイトだ...

Prometheus で Kubernetes ジョブを監視する際の誤検知の問題を解決する

昨日、Prometheus コースの指導グループのクラスメートが、Prometheus 監視ジョブ ...

SEO の方法 高品質のソフトテキストはどのくらいの重みを占めるか - A5 Webmaster Network

多くのウェブサイトビルダーは、SEO という略語に精通しています。なぜなら、ウェブサイトビルダーはこ...

初心者ウェブマスターがウェブサイトの構築方法を学ぶ

今では、初心者のウェブマスターでもウェブサイトを簡単に作成できるようになりました。オープンソース プ...

ドライブしましょう: ドメイン名登録の割引をいくつかご紹介します。10年間の.xyz登録は4.99ドルです。

ドメイン名の割引情報に注目していない人が多いようです。今月登録できる安いドメイン名を簡単に紹介します...

中国のライブEコマースの9つのトレンド

第13回ダブルイレブンが予定通り到来。ネット全体で話題になっている「洛麗」対決は、トップキャスター2...

Pinterestのような製品を活用して購買行動を促進する方法

このウォーターフォール フロー表示方法は、目的もなく閲覧しているユーザーに非常に適しています。ユーザ...