Goaインターセプター

横断的関心事のためのGoaの型安全なインターセプターシステムについて学ぶ

概要

Goaインターセプターは、サービスメソッドに横断的関心事を注入するための強力な型安全な メカニズムを提供します。完全な型安全性と優れたIDE対応を備え、クライアントとサーバーの 両側でリクエストとレスポンスの両方を傍受して変更することができます。

インターセプターとは?

インターセプターは、サービスメソッドの前、後、または周囲で実行される振る舞いを追加できる コンポーネントです。以下のことが可能です:

  • 受信リクエストの読み取りと変更
  • 送信レスポンスの読み取りと変更
  • エラーの処理
  • コンテキスト情報の追加
  • ロギング、モニタリング、データ変換などの横断的関心事の実装

主要な機能

  • 型安全性:生成されたヘルパー型により、すべてのインターセプターの相互作用が完全に型付けされます
  • 柔軟な配置:サービスレベルとメソッドレベルの両方に適用可能
  • 双方向性:クライアント側とサーバー側の両方のインターセプションをサポート
  • ストリーミングサポート:単項操作とストリーミング操作の完全サポート
  • クリーンなDSL:インターセプターを定義するための明確な宣言的構文
  • 明示的なアクセス制御:アクセス可能なペイロードとリザルトのフィールドを明確に指定

基本的な例

以下は、クライアント側のリトライインターセプターを定義する簡単な例です:

var RetryPolicy = Interceptor("RetryPolicy", func() {
    Description("失敗した操作に対して指数バックオフリトライを実装します")
    
    // リザルトでリトライ試行回数を追跡
    WriteResult(func() {
        Attribute("attempts")
    })
})

var _ = Service("payment", func() {
    // すべてのサービスメソッドにリトライポリシーを適用
    ClientInterceptor(RetryPolicy)
    
    Method("process", func() {
        Payload(func() {
            Attribute("amount", Int, "支払い金額")
            Attribute("currency", String, "支払い通貨")
        })
        Result(func() {
            Attribute("id", String, "トランザクションID")
            Attribute("status", String, "トランザクションステータス")
            Attribute("attempts", Int, "リトライ試行回数")
        })
        // メソッド固有の設定...
    })
})

この例では、失敗した操作に対して指数バックオフを実装するRetryPolicyインターセプターを 定義しています。主要なコンポーネントを見てみましょう:

  1. インターセプターの定義

    var RetryPolicy = Interceptor("RetryPolicy", func() {
    

    “RetryPolicy"という名前の新しいインターセプターを作成します。

  2. リザルトの変更

    WriteResult(func() {
        Attribute("attempts")
    })
    

    インターセプターは、必要だったリトライ回数を追跡するために、レスポンスの"attempts” フィールドに書き込むことを宣言します。

  3. サービスへの適用

    ClientInterceptor(RetryPolicy)
    

    インターセプターはサービスレベルで適用され、サービス内のすべてのメソッドに影響を与えます。

  4. メソッドの定義

    processメソッドは、インターセプターがサービスとどのように統合されるかを示しています:

    • ペイロードは支払いの詳細(金額と通貨)を定義
    • リザルトは標準的なトランザクションフィールド(idとステータス)を含む
    • リザルトのattemptsフィールドにより、リトライインターセプターがその活動を報告可能

実装されると、このインターセプターは失敗した操作を試行間隔を増やしながら自動的に リトライし、一時的な障害に対する回復力を提供します。

インターセプターの使用タイミング

インターセプターは、サービスアーキテクチャにおける以下のような一般的なユースケースに 最適です:

  • クライアントの回復力:リトライポリシーとサーキットブレーカーの実装
  • リソース管理:レート制限とリクエストスロットリング
  • モニタリング:操作のメトリクスとパフォーマンスの追跡
  • データ変換:システムを流れるデータの変更または強化
  • 相関:リクエストの相関とトレースIDの追加
  • キャッシング:クライアント側またはサーバー側のキャッシングの実装
  • バリデーション:Goaの組み込みバリデーションを超えたカスタムバリデーションルールの追加
  • エラー処理:エラーレスポンスとリカバリー戦略の標準化

認証と認可などのセキュリティ関連の懸念事項については、より堅牢で専門的なセキュリティ機能を 提供するGoaの組み込みセキュリティDSLを使用すべきことに注意してください。

次のステップ