リバースピラミッドモデル
アーキテクチャにおける「リバースピラミッドモデル」とは
リバースピラミッドモデルは、最も重要で最低限の情報/機能が最初に送信され、保証され、重要な詳細が段階的かつオプションで追加されるシステムとプロトコルを設計する方法です。この用語はジャーナリズムからアイデアを借りています(主なものは最初はです)が、エンジニアリングのタスクに適応しています。クリティカルパスはどのような条件でも機能し、他のすべては「豊かな層」です。
直感的なイメージ:上の狭いトップは「最小保証契約」(MGC)、以下は拡張、最適化、およびリソース/互換性がある場合にシステムが適用される豊富な機能です。
適用される場所
ネットワークプロトコルとAPI: REST/gRPC/GraphQL、 webhook、イベントブローカー。
ストリーミングチャンネル:WebSocket、 SSE、 Kafka/NATS、 RTC。
サービスアーキテクチャ:クリティカルパスと副作用(監査、分析、キャッシュのウォーミング)。
モバイル/ウェブクライアント:最初の「スケルトン」UIとキーデータ、そしてメディアと推奨事項の遅延ロード。
支払いとリスクチェーン:承認/予約-優先順位で;不正防止/分析-非同期、期限付き。
観測可能性:常にログ/最小レベルのメートル;トレース/プロファイリング-サンプリングによる。
モデルの原則
1.最低保証契約(MGC)
スクリプトが意味を持たないフィールドと操作のセット。安定しており、後方互換性があり、最初に通過します。
2.プログレッシブエンリッチメント
追加のフィールド/関数はオプションの拡張機能(機能/フィーチャーフラグ/ネゴシエーション)として提供されます。
3.障害のない劣化
オーバーロードまたは部分的に使用できない場合、システムはオプションのレイヤーを破棄し、MGCの動作を維持します。
4.明示的な優先順位付けとSLA
各レイヤーには独自のSLO(レイテンシー、可用性)、キュー、およびサービスのクラス(QoS)があります。
5.回路の付加的進化
新しいフィールドはnullable/optionalとして追加され、クライアントを壊すことはありません。ハードチェンジ-新しいバージョンを介してのみ。
6.レイヤーごとの可視性
メトリクスとログはcriticality: 'coreでマークされています。'、'enh。'、'バッチ。"システムが負荷の下で犠牲にするものを見るために。
「クラシック」レイヤーピラミッドとの比較
クラシックアーキテクチャ(bottoms-base、 tops-UI)は依存関係を強調します。
逆ピラミッドは、配達の重要性と順序を強調しています:最初の「コア」、次に「nice-to-have」。
モデルプロトコル設計
1) REST/HTTP
MGC:最小リソース/エンドポイントと必須フィールド。
拡張機能:- コンテンツの否定('Accept'、 'Prefer')、
- パラメータ'?include='/'?選択的粒度のためのfields='、
- インラインの代わりに「重い」添付ファイル(事前署名されたURL)へのリンク。
- 劣化:タイムアウト時、ネストされたコレクションなしでMGCを与えます。206大ボディのための部分的な内容
- バージョン管理:古い契約を変更せずに添加フィールド;変更を破るためだけのメジャーバージョン。
2) gRPC
proto:安全なタグ番号付きの新しい'オプション'フィールド;削除されたタグを再利用しないでください。
サーバー側の締め切りとメソッドごとのQoS(優先度より重要なRPC)。
ストリーミング:最初のメッセージ-ヘッダー/合計、次にチャンクによる詳細。
3)イベントバス(カフカ/NATS)
Event-core: 'event_type'、 'id'、 'occuled_at'、最小のビジネスフィールド。
豊かさ:私達はoutbox/CDCおよび個々のトピック'-enriched'で取り出します。
最初に要約し、後で詳細をまとめます。消費者はコアでビジネスプロセスを完了でき、詳細は非同期にロードされます。
逆ピラミッドによく合うパターン
Critical Path First:同期の「必須」と非同期の副作用を分離します。
Write-ahead/Outbox:イベントの事実を記録し、残りはバックグラウンド配信です。
Lazy&Incremental Fetch:ページネーション、カーソル、'If-Modified-Since '/ETag。
Capabilities Discovery-サポートする拡張機能をサーバー/クライアントが明示的に通信します。
Backpressure&Budgets:締め切り、レイヤーごとのCPU/IO制限;ロード中のセカンダリタスクのキャンセル。
SLO-Scoped Caching:「コア」をより積極的にキャッシュし、豊かにします。
実装アルゴリズム
1.シナリオマッピング:ユーザージャーニーを書き留め「、価値の瞬間」を強調表示します。
2.MGC:値を達成するための最小フィールド/操作を定義します。
3.層に分ける:'core'、 'extended'、 'analytics/batch'。
4.レイヤーごとにSLO/SLAとQoSを設定します。
5.設計の劣化:N%の失敗/p95の成長で破棄するものは何ですか?
6.スキームの進化:バージョン・ポリシー、additive-first。
7.オブザビリティ:メトリック/ログ/トラック内のレイヤータグ、「コア」上のアラート。
8.テスト:層によるカオスエンジニアリングおよび欠陥注入。
9.起動とフィードバック:フィッシュフラグの拡張機能をオンにし、カナリアでロールアウトします。
レイヤーごとのメトリックとSLO
コア:p95/p99レイテンシ、成功したクリティカル操作の割合、劣化時のフォールトトレランス。
拡張:豊富な応答の割合、平均読み込み時間。
バッチ/アナリティクス:リアルタイムからの遅延、ウィンドウごとに処理されたイベントの割合。
ビジネスメトリクス:過負荷での「値の点」への変換は正常です。
アンチパターン
「すべてがコア」:拡張が必須になり、劣化が不可能になります。
新しいメジャーバージョンなしでMGCの変更を破る。
隠された脆弱性:クリティカルパスは外部の「セカンダリ」依存関係(同期詐欺防止コールなど)に依存します。
暗黙的な拡張機能:クライアントは何が有効/無効にできるかを知りません。
観測能力の欠如:システムは「静かに」劣化し、どこに表示されません。
例:
- A。ユーザープロファイル(REST)
MGC: 'id'、 'display_name'、 'avatar_url'、 'tier'。
拡張機能:'badges[]'、'social_links[]'、'recent_activity[]'by'?include='。
劣化:タイムアウト時に、MGCと共有リソースへのリンク(HATEOAS/URL)を与えます。
B。支払い承認
MGC:承認結果(承認/拒否)、'transaction_id'、 'amount'、' currency'。
拡張機能:3DSテレメトリー、リスクレート、ジオアトリビューション、パートナーアトリビューション-イベントの支払いによって非同期。承認されました。
劣化:アナリティクスが失敗すると、支払いが進み、監査/スコアリングが追いつきます。
B。ストリームの引用符
MGC:最新の価格「スナップショット」。
拡張機能:ガラスの深さ、集約されたインジケータ-スナップショット後のストリーム。
劣化:負荷下では、拡張の更新頻度は低下しますが、スナップショットは安定しています。
バージョン管理と進化
Additional-first:新しいフィールド'optional/nullable'、古いフィールドは残ります。
セマンティックバージョン:カーネルの'v1';'v1。x'-拡張;'v2'-MGCが変更されたとき。
コード内の契約:JSON Schema/Protobuf+「非破壊的」拡散のCI検証。
安全性とコンプライアンス
MGC署名/認証:フィールドの最小セットには暗号整合性があります。
最小特権:個々のスコープによる濃縮へのアクセス。
PII/財務データ:拡張、キー分離、TTLのテイクアウト。
可視性とデバッグ
メトリックプレフィックス: 'core。お願いします。期間'、'enh。添付してください。load_time'、バッチ。「遅い」
サンプリング:コアエラーの100%ログ。サンプルエクステンション。
フィーチャーフラグテレメトリー:どの拡張機能がどの顧客で有効になっているかがわかります。
実装チェックリスト(短い)
- MGC定義および文書化。
- 拡張機能はcapabilities/flagsで宣言されます。
- レイヤーごとにSLO/QoS/キューを設定しました。
- カオステストによってテストされた劣化。
- スキームの進化は「休憩」なしの添加物に過ぎない。
- メトリック/トレイル/ログはレイヤー化されています。
- 拡張機能を有効にするお客様向けのドキュメント。
FAQ(よくある質問
リバースピラミッドはレイヤードアーキテクチャを置き換えますか?
いいえ、そうではありません。これは直交原理です:おなじみのレイヤーよりも機能を提供し、優先順位を付ける方法。
いつ申請しないのですか?
オフラインパッケージでは、部分的な配信は無意味です(原子性を持つ暗号プロトコル)、またはすべてのフィールドが等しく重要な場合。
優雅な劣化とは何が違うのですか?
リバースピラミッドは、最初は最小限の十分な契約とその優先順位を投影し、「事実の後に」既に過負荷のシステムを保存しようとしません。
[結果]
リバースピラミッドモデルは、アーキテクチャとプロトコルが任意の負荷の下で有用なままであるのに役立ちます。それ以外は可能であれば。これにより、クリティカルパスの可用性が向上し、機能の表示が高速化され、故障のない進化が簡素化されます。