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つの特徴

推薦する

レクティアンの失敗:市場ポジショニングの観点から見た中国人の習慣

中国の国力が強まるにつれ、大きなケーキはますます甘くなり、多国籍企業はその一切れを手に入れようと躍起...

#黑5# changeip: 30% オフ、Shark データセンター VPS、無制限のトラフィック + 20Gbps の高防御、Windows 搭載

Changeip は長い間登場していないようです。Shark Data Center の VPS は...

タオバオアフィリエイトウェブサイトが百度重み7を獲得し、1年間で10万以上のトラフィックを獲得した方法の分析

今日、Xianyunはフォーラムで、Baidu Indexの巨大なキーワードの秘密を説明する記事を見...

どのようなウェブサイトを運営すればよいでしょうか?

私が初めてインターネットに触れたとき、インターネットに対する期待は大きく、自分自身のインターネットビ...

openitc-$6.7/8コアCPU/1gメモリ/13g SSD/42Tトラフィック

2008 年に設立され、英国に登録されている openitc (サブブランド XenVZ もあります...

VLANを写真と文章で詳しく解説しているので、一目でVLANがわかります

1. VLAN が必要な理由は何ですか? 1.1. VLANとは何ですか? VLAN (Virtua...

Inmaise マーケティング ディレクター You Yajie との独占インタビュー: 学びを深め、自分を超えよう!

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

コミュニティサイトのユーザー分析の3つのタイプは「人」の存在に焦点を当てている

コミュニティ内の3つのタイプの人々オンライン コミュニティの作成はますます人気が高まっており、「ソー...

インターネット上でウェブサイトを構築するのは複雑ではありません。鍵となるのは、5 つの「本質」を理解することです (パート 2)

前回の記事では、ドメイン名登録の安全性、適時性、適用性について主に説明しました。ウェブマスターがドメ...

世界のパブリッククラウドサービスの市場価値は2019年に2,334億ドルに達する

インターナショナル・データ・コーポレーション(IDC)のデータによると、2019年、インフラストラク...

JS、大きな画像、FLASHがウェブサイトの速度とSEOに与える影響について話す

ページの美しさや特殊効果に対する要求から、ウェブサイトにあまり詳しくない多くの顧客は、ウェブサイトの...

重複ページの原因とその対処方法について簡単に説明します。

SEO 担当者として、日々の最適化を行う中で、サイト上の重複コンテンツが原因で検索エンジンからペナル...

SEO初心者のための学習ガイド

みなさんこんにちは。私の名前はヤンです。私は長年にわたりさまざまなウェブサイトに携わってきたウェブマ...

Google のウェブサイト最適化ソリューション

昨夜9時頃、グループ内の友人からQQメッセージを受け取り、Googleの最適化について何か調査したこ...