要件定義
分散システムにおいてデータやメッセージの一意識別は重要課題である。特にテーブルシャーディング環境では、データベースの自動採番機能では要件を満たせない。ID生成システムに求められる要件は以下の通り:
- グローバル一意性: 重複IDの発生を排除
- 単調増加傾向: インデックス構造を持つRDBMSの書き込み性能最適化
- 厳密な単調増加: トランザクションバージョン管理など特殊要件対応
- 情報セキュリティ: 連番推測を防止する非連続性
システム可用性についても高い水準が要求され、平均レイテンシとTP999レイテンシの最小化、99.999%の可用性、高スループットが必須条件となる。
Leafアーキテクチャ
Leafはセグメント発行方式とsnowflake改良方式を併用したハイブリッドアプローチを採用する。
セグメント発行方式
従来のDB直接発行方式を改良し、プロキシサーバによるバッチ取得を導入。主要テーブル設計:
| フィールド | 型 | 説明 |
|---|---|---|
| ビジネスタグ | varchar(128) | 業務区分識別子 |
| 最大ID | bigint(20) | 現在割当済み最大ID |
| ステップ | int(11) | 割当単位サイズ |
ID取得プロセス:
BEGIN TRANSACTION; UPDATE id_table SET max_id = max_id + STEP WHERE biz_tag = @tag; SELECT max_id, step FROM id_table WHERE biz_tag = @tag; COMMIT;
二重バッファ最適化
発行レイテンシ改善のため二重バッファメカニズムを実装:
- 現在使用中のセグメントが10%消費された時点で次セグメントの非同期取得を開始
- セグメント長 = ピーク時QPS × 600(10分相当)
高可用性設計
マスター-スレーブ構成によるDB冗長化:
- 異なるデータセンターへの配置
- セミ同期レプリケーション
- IDCローカル優先のサービス呼出し
Snowflake拡張実装
セキュリティ要件が高い場景向けにsnowflakeパターンを拡張:
- ZooKeeperの永続順序ノードによるワーカーID自動割当
- ローカルファイルキャッシュによる依存性軽減
- 時刻巻き戻し検知メカニズム
時刻整合性制御
時刻不整合発生時の対応ロジック:
if (currentTimestamp < lastTimestamp) {
long delta = lastTimestamp - currentTimestamp;
if (delta <= 5) {
Thread.sleep(delta * 2);
currentTimestamp = System.currentTimeMillis();
if (currentTimestamp < lastTimestamp) {
throw new ClockMovedBackException();
}
} else {
throw new ClockMovedBackException();
}
}