← プロジェクト一覧へ
ビジネスサービス
設定 & アクセス制御サービス
テナント設定、ドメイン管理、優先度ベースの許可/拒否エンジン
初版作成者 · ルールエンジンを再構築 · 2024年3月 — 2026年6月
Go go-zero gRPC MySQL/GORM Redis Kafka
概要
プラットフォームとテナントの設定:ドメイン、バナー、バージョン、テナント設定、アクセスルール。初版を書き、独立したサービスとして分離し(分離時点で 42 RPC)、2025年にアクセス制御ルールを単一のエンジンに再構築した。
アーキテクチャ
ゲートウェイミドルウェア → 設定 gRPC サービス → ルールエンジン(アカウント・ニックネーム・IP による許可リストが優先。拒否ルールはアカウント、ニックネーム、IP、IP の所在地、銀行カードを組み合わせてマッチ)→ テナント別 Redis ハッシュ → ミス時は MySQL。
主な技術ポイント
01
旧来の2つの許可/拒否リストを、5つのマッチ次元を持つ優先度ベースの単一エンジンに統合。ルールを読み込めない場合はアクセスを拒否
02
テナント別の TTL 付き Redis ハッシュからルールを提供し、DB へのフォールバックは singleflight で保護
03
既存ルールを一度限りの SQL マイグレーションで新テーブルへ移行(CSV → JSON 配列)
04
テナントのドメイン管理:リンク検証、Redis セットによる一意性チェック、手動キャッシュ再同期
05
コンテンツカテゴリ別のバナー配信対象指定と、接続中クライアントへの Kafka 変更イベント
コア実装
1
統合ルールエンジン
アクションと優先度を持つ1つのルールテーブル。リクエストごとにメモリ上で正規化・評価し、ログ用にどの次元がマッチしたかを返す。
Why: 別々のコードパスを持つ2つのリストはエッジケースで結果が食い違っていた。明示的な優先度を持つ1つのエンジンの方が、理解も監査もしやすい。
技術的意思決定
| 技術的意思決定 | 選択 | 代替案 | 理由 |
|---|---|---|---|
| ルールキャッシュの構成 | テナントごとに1つの Redis ハッシュを持ち、メモリ上で評価 | 次元の値ごとに1つの Redis キー | テナントごとのルールセットは小さい。テナント単位で1回取得する方がシンプルで、多数のインデックスキーの整合性を保つ必要もない。 |