Goで開発された分散型ユニークID生成システム

Goで開発された分散型ユニークID生成システム

[[433936]]

今日は、分散環境で一意の ID を生成することを主な機能とするオープンソース プロジェクト、id-maker を紹介します。先週は 1 週間更新を停止しましたが、その間もこのプロジェクトに関連するコードの開発とテストを行っていました。

Meituan には、Java を使用して開発された Leaf と呼ばれるオープンソース プロジェクトがあります。このプロジェクトは、このアイデアに基づいて Go を使用して開発および実装されています。

プロジェクト全体のコード量はそれほど多くありません。実際の本番環境で使用したい場合でも、練習するためのプロジェクトを見つけたい場合でも、良い選択だと思います。

プロジェクトの背景

ほとんどのシステムでは、グローバルに一意の ID が必須です。たとえば、速達、テイクアウト、映画などでは、注文番号の一意性を確保するために、すべて一意の ID を生成する必要があります。

ID 番号に対するビジネス システムの要件は何ですか?

  • グローバル一意性: 重複する ID 番号は存在できません。これは一意の識別子であるため、最も基本的な要件です。
  • 増加傾向: MySQL InnoDB エンジンでクラスター化インデックスが使用されています。ほとんどの RDBMS はインデックス データを格納するために B ツリー データ構造を使用するため、主キーを選択するときは、書き込みパフォーマンスを確保するために順序付けられた主キーを使用するようにしてください。
  • 単調増加: トランザクション バージョン番号、IM 増分メッセージ、ソート、その他の特別な要件など、次の ID が前の ID よりも大きいことを確認します。
  • 情報セキュリティ: ID が連続している場合、悪意のあるユーザーは指定された URL を順番にダウンロードするだけで簡単に ID をスクレイピングできます。注文番号の場合は、競合他社が当社の毎日の注文量を直接知ることができるため、さらに危険です。したがって、一部のアプリケーション シナリオでは、ID は不規則で規制されていない必要があります。

この文脈では、可用性の高い一意の ID 生成システムを持つことが重要です。

プロジェクトの使用

ID を生成するには 2 つの方法があります。

  • データベースに基づいて ID を生成します。
  • スノーフレーク アルゴリズムに基づいて ID を生成します。

インターフェースを呼び出す方法は 2 つあります。

  • HTTP メソッド
  • gRPC の方法

HTTP メソッド

1. 健康チェック:

  1. カール http://127.0.0.1:8080/ping

2. IDを取得する:

タグテストのIDを取得します。

  1. カール http://127.0.0.1:8080/v1/id/test

3. Snowflake IDを取得します。

  1. カール http://127.0.0.1:8080/v1/snowid

gRPC の方法

1. IDを取得する:

  1. grpcurl -plaintext -d '{"tag":"test"}' -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetId

2. Snowflake IDを取得します。

  1. grpcurl -plaintext -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetSnowId

地域開発

  1. # MySQL を実行する
  2. $ 作成する
  3.  
  4. #移行を使用してアプリを実行する
  5. $ 実行

プロジェクトアーキテクチャ

このプロジェクトは go-clean-template アーキテクチャ テンプレートを使用して開発されており、ディレクトリ構造は次のようになります。

各ディレクトリの簡単な説明は次のとおりです。

  • cmd: プログラムエントリ
  • config: 設定ファイル
  • docs: 生成されたプロジェクトドキュメント
  • 統合テスト: 統合テスト
  • 内部: ビジネスコード
  • pkg: パッケージと呼ばれるもの

公式写真を2枚拝借:

全体的な階層関係は次のようになります。最も内側はテーブル構造を定義するモデルであり、中央はビジネス ロジック レイヤーです。ビジネス ロジック レイヤーは、最も外側の API が呼び出すためのインターフェイスを提供します。最も外側の層は、いくつかのツールと呼び出しエントリです。

これを実行する最大の利点は分離です。最外層がどのように変更されても、対応するインターフェースがビジネス ロジック層に実装されている限り、コア コードをまったく変更する必要がない場合があります。

したがって、それらの間の呼び出し関係は次のようになります。

  1. HTTP > ユースケース
  2. ユースケース > リポジトリ (Postgres)
  3. ユースケース < リポジトリ (Postgres)
  4. HTTP < ユースケース

以上が今回のプロジェクトの内容となります。ご興味がございましたら、ご連絡のためにメッセージを残してください。星を付けて頂けると嬉しいです。

プロジェクトアドレス:

  • https://github.com/yongxinz/id-maker

この記事はWeChatの公開アカウント「AlwaysBeta」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合はAlwaysBeta公式アカウントまでご連絡ください。

<<:  分散リンク トレーシング: Spring Cloud Sleuth に関する 9 つの致命的な質問

>>:  クラウドネイティブの5つの特徴

推薦する

東京オリンピックは観客なしで開幕、IOCバッハ氏:初のクラウド放送を支えるためにアリババクラウドが活用される

東京オリンピックがもうすぐ開幕します。今年は観客がほとんどおらず、テレビやオンラインの生放送のみで行...

新しいメディアは徐々にオンラインプロモーションの新しい方法になりつつあります。ウェブマスターは SEO のジレンマから抜け出すことができるでしょうか?

最近、多くのウェブマスターの友人とチャットをしていますが、オンラインプロモーションについて話すと、草...

いわゆるSEOトレーニングサークル

私は長い間、これらのことを書き留めたいと思っていましたが、同僚からの悪意のある攻撃や中傷のために、こ...

2021 年のクラウド ネイティブ テクノロジーに関する 9 つの予測

過去1年間、疫病の影響により、企業の生産およびコラボレーションモデルは大きな変化を遂げ、オフラインか...

K8S トラブルシューティング ガイド: ネットワークの問題のトラブルシューティングのアイデア

1. はじめにプライベート化された環境では、顧客のネットワークアーキテクチャや使用されるクラウドプラ...

専門家の予測:2021年にクラウドコンピューティング分野で出現するトレンド

クラウド コンピューティングが 2021 年に持続的な成長の傾向を示すことは明らかです。しかし、クラ...

グラフィックカード仮想化の過去と現在

クラウド デスクトップの使用体験の違いは、構成の違い、より直接的には、グラフィック カードが仮想化さ...

flokinet、アイスランド VPS/アイスランド サーバー、高度なプライバシー保護、1Gbps 帯域幅、1Tbps の高度な防御を内蔵

アイスランドのサーバー業者 flokinet (~) は、アイスランドのデータセンターでアイスランド...

バレンタインデーがやってきました。海外の新しい出会い系・婚活サイトモデルを見てみましょう

春節を前に、Weiboで「春節に帰省する若者の悩み」というトピックが白熱した議論を巻き起こした。春節...

SaaS起業家に冷水を浴びせる

1995 年、オラクルの CEO ラリー・エリソンは、ネットワーク コンピュータと呼ばれるデバイスを...

モバイルアプリモールシステムの成功の鍵

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

2018年上半期の中国モバイルインターネット産業の発展に関する分析レポート

2018年上半期の中国モバイルインターネット産業の発展に関する分析レポートキーワード: 安全、上場、...

licloud: 月額 39 ドル、香港物理サーバー、30M 帯域幅、e3-1230v3/16G メモリ/1T ハードディスク

licloud からの公式ニュース: 現在、香港データセンターの約 100 台の物理マシン (香港サ...

クラウドでのウェブサイトテストの利点

クラウドで Web サイトのテストを実行すると、より高速でコスト効率が高くなり、自動化とアジャイル ...