※これはAnnouncing OCI Queue Fan-out with Filtering (Consumer Groups)の翻訳です
この新機能により、単一のOCI Queueから一対多のメッセージ配信が可能となり、ユーザーが依存するプル型消費モデルを維持します。
Fan-outとフィルタリングにより、以下のことが可能になります:
・単一メッセージを複数の独立したコンシューマーに配信
・Consumer Groupごとに選択的なフィルタリングを適用
・決定論的な配信セマンティクスを維持
・下位互換性を保持
・高スループットのアプリケーションtoアプリケーション(A2A)ワークロードをスケーリング
重要性
イベント駆動型システムでは、以下が必要となることがよくあります:
・1つのイベントを複数のマイクロサービスに送信
・特定のイベントを特定のサービスにルーティング
・プロデューサーの重複を回避
・メッセージの耐久性と可視性制御を維持
ネイティブのFan-out機能がない場合、ユーザーは通常以下を行います:
・重複したキューを作成
・アプリケーションコードにルーティングロジックを実装する
・カスタムディスパッチャーを構築
・運用上のオーバーヘッドを導入
OCI Queue Fan-out とフィルタリングはこの複雑さを解消します。
新機能
Consumer Group
Consumer Groupは、Fan-outを可能にするOCI Queueのメインのリソースとなりました。
各Consumer Groupは:
・独立したプル型消費パスを表す
・オプションでフィルタ式を定義可能
・独立した可視性と配信試行を維持
・有効化/無効化可能
・IAMによるセキュリティ保護
Fan-out有効時、キューに公開されたメッセージは全Consumer Groupで評価される。
プライマリConsumer Group(下位互換性)
キューでFan-outを有効化すると:
・Primary Consumer Groupが自動生成
・全メッセージを受信
・削除不可
・フィルタ非対応
・必要に応じて無効化可能
これにより既存アプリケーションの変更なしに動作を継続します。
メッセージ・フィルタリング
SQL風フィルタ式をConsumer Groupに適用可能になりました。
フィルタ評価は以下で実行:
・公開時間
・メッセージ属性(本文ではない)に基づく
・論理演算子と比較演算子を使用
サポートされるフィルタ:
・キー存在判定::region
・文字列等価性::type = 「order」
・数値比較::age > 40
・論理演算子:AND, OR, NOT
・関数:hasPrefix(), hasSuffix()
メッセージに一致するConsumer Groupが存在しない場合:
・メッセージは破棄される
・メトリックが発行される
・メッセージは後から取得できない
これにより、決定論的で予測可能な動作が保証されます。
動作原理
内部処理:
1. メッセージがキューに公開される。
2. サービスがすべてのConsumer Groupフィルターを評価
3. メッセージは一致するConsumer Groupに論理的に配信される
4. ペイロードは一度保存され、参照カウントされる
5. メッセージは、一致するすべてのグループが消費した後にのみ削除される
この設計により:
・メッセージの重複を回避
・パフォーマンスを維持
・クリーンなスケーリングを実現
・コスト効率を維持
ステップ・バイ・ステップ:Fan-outとフィルタリングの有効化
以下は OCI コンソールを使用した手順です。
ステップ1: キューの作成
OCIコンソールで:
1. [Developer Services] → [Queues] に移動
2. [Create Queue] をクリック
3. キュー名を入力
4. 構成を選択(デフォルトまたはカスタム)
5. [Queue capabilities] で以下を有効化:
[Enable consumer groups]
これによりFan-out機能が有効になります。

ステップ2: Primary Consumer Groupの確認
キュー作成後:
1. 該当キューに移動
2. [Consumer groups] タブを開く
以下が表示されます:
・プライマリConsumer Group(アクティブ)
・フィルタ式なし

ステップ 3: フィルタリング付きセカンダリConsumer Groupの作成
選択的配信を有効化するには:
1. Consumer Groupの追加をクリック
2. 名前を入力(例: 「別のConsumer Group」)
3. オプションで DLQ 配信試行回数を設定
4. フィルタ式を追加
例:
:age > 40

これで以下が作成されます:
・プライマリConsumer Group(全メッセージを受信)
・セカンダリConsumer Group(年齢 > 40 のメッセージのみ受信)

ステップ4:属性付きメッセージの送信
1. メッセージを数件送信
2. メッセージ本文を入力
3. メッセージ属性を追加
例:
・キー: age, 値: 50
・キー: age, 値: 60
・キー: age, 値: 30

3件送信後:
・プライマリConsumer Groupは全3件を受信 (フィルタリングなしのため)
・フィルタリングされたConsumer Groupは2通を受信(50 > 40のため)

ステップ5:メッセージ配信の観察
メッセージをポーリングする場合:
・プライマリConsumer Group → 全メッセージが表示
・フィルタリングされたConsumer Group → 一致するメッセージのみが表示


配信保証とドロップセマンティクス
フィルタリング動作を理解することが重要です:
・フィルタは公開時のみ評価されます。
・プライマリConsumer Groupが無効化され、他のConsumer Groupが一致しない場合:
・メッセージは破棄される。
・メトリックが発行される。
・メッセージは後から復元できない。
これにより予測可能で決定論的なルーティングが保証される。
IAMとセキュリティ
Consumer Groupは第一級のIAMリソースである。
以下の操作が可能:
・特定の動的グループが特定のConsumer Groupから消費することを許可
・きめ細かいアクセス権限の付与
・キュー管理とFan-out設定の分離
例:
dynamic-group AppConsumers がコンパートメント MyCompartment 内の queue-pull を使用することを許可 target.consumer-group.id = 『』
ユースケース
マイクロサービスルーティング
1つのイベントを以下に送信:
・課金
・不正検知
・通知
・分析
各サービスが独立して消費。
優先度ルーティング
高優先度メッセージを1つのサービスにルーティング:
マルチテナントシステム
以下の属性を使用:
:tenantId = 「tenantA」
パフォーマンス特性
・プル型消費 (REST API)
・低遅延配信(p90 < 500 ms)
・最大1MBのメッセージサイズ
・独立したコンシューマーのスケーリング
・コンシューマーグループ間で共有される保持期間
強力な理由
OCI Queue Fan-out with Filtering は以下を組み合わせています:
・キューのシンプルさ
・パブ/サブの柔軟性
・プル型消費の決定性
・エンタープライズグレードのIAM制御
これらすべてを、別途メッセージングサービスを必要とせずに実現します。
今すぐ始めましょう
OCI Queue Fan-out with Filtering(Consumer Group)が利用可能になりました。
お試し手順:
1. キューを作成
2. コンシューマーグループを有効化
3. フィルタリングされたコンシューマーグループを追加
4. 属性付きメッセージを送信
5. 選択的配信を確認
詳細は OCI Queue ドキュメントをご覧ください。
皆様の構築成果を楽しみにしています。
