Cloud Service
OCI Queue
フルマネージドのメッセージキュー。送信側と処理側を疎結合化し、スパイクをバッファして取りこぼさない。AWS の Amazon SQS に相当する。
- 1.仕事を一旦ためる箱で送信側と処理側を疎結合にするキュー。
- 2.急増してもバッファして取りこぼさず、リクエスト課金で従量。
- 3.at-least-once 配信なので処理は冪等に作るのが鉄則。
解決する課題
物理的なメッセージブローカー(Kafka や RabbitMQ など)を自前で構築・運用せずに、疎結合な非同期連携をすぐに始められます。
- アクセス急増でバックエンドが詰まる → キューでバッファ
- 送信側(プロデューサ)と処理側(コンシューマ)を疎結合にして独立にスケールしたい
- 失敗したジョブを安全に退避・再試行したい(DLQ)
- 標準の HTTP/REST API で言語を問わず連携したい
主要概念と用語
- キュー(Queue): メッセージを格納するエンドポイント。作成時にメッセージエンドポイントの FQDN が払い出される
- プロデューサ / コンシューマ: メッセージを送る側 / 取り出して処理する側
- PutMessages / GetMessages / DeleteMessages / UpdateMessages: メッセージの送信・取得・削除・可視性更新を行う REST 操作
- 可視性タイムアウト(Visibility timeout): GetMessages で取り出したメッセージを一時的に他のコンシューマから隠す時間。既定 30 秒
- デッドレターキュー(DLQ): 配信試行回数(delivery count)が上限を超えたメッセージの退避先
- チャネル(Channel): キュー内の論理的なサブグループ。
channelIdを指定して送受信すると、特定チャネルのメッセージだけを順序付きで扱える(関連メッセージのグルーピングに利用) - コンシューマグループ(複数コンシューマ): 同一キューを複数のコンシューマで並列に GetMessages して水平にスケール
仕様・制限・クォータ
- メッセージ保持期間は 最大 7 日(既定値、キュー作成時に設定)
- メッセージ最大サイズは 既定 128 KiB(キュー単位で設定可能。大きいデータは Object Storage に置き参照を渡す)
- 可視性タイムアウトは既定 30 秒、最大 12 時間(43,200 秒)
- ロングポーリングは GetMessages の
timeoutInSecondsで指定(最大 30 秒) - プル型(コンシューマが GetMessages でポーリング)
- 順序保証はチャネル単位で行われる(チャネルを使わない場合は標準キュー同様、ベストエフォート)
- アクセスは REST API / OCI SDK / OCI CLI から。データプレーン操作はメッセージエンドポイント、管理操作(作成・削除)はコントロールプレーン
内部の仕組み
コンシューマがキューを GetMessages でポーリングしてメッセージを取得すると、可視性タイムアウトの間そのメッセージは他のコンシューマから見えなくなり、同時に各メッセージへ一時的な receipt(レシート) が払い出されます。処理が成功したら receipt を使って DeleteMessages で削除、処理が長引く場合は UpdateMessages で可視性タイムアウトを延長します。可視性タイムアウトが切れると再び見えるようになり、別のコンシューマに再配信されます。
メッセージごとに 配信回数(delivery count) がカウントされ、設定した上限(maximum delivery attempts)を超えると DLQ へ自動的に移動します。OCI Queue は at-least-once(最低1回)配信のため、同じメッセージが2回以上配信される可能性があり、コンシューマ側の冪等な処理が前提になります。
OCI Queue は「最低1回」配信なのでまれに重複します。処理は冪等に作るのが鉄則です。関連メッセージの順序が必要なら channelId(チャネル) を使い、同一チャネルのメッセージを順序付きで1つずつ処理します。
設計パターン / ベストプラクティス
- Queue + Functions: メッセージ到着を OCI Functions(FaaS)で処理するワーカー(Connector Hub 連携やポーリングで起動)
- キューの深さでスケール: 滞留メッセージ数に応じてコンシューマ(OKE の Pod や Compute)の台数を増減
- DLQ で失敗を退避し、原因調査・再投入する
- 大きいペイロードは Object Storage に置き、キューにはオブジェクト参照(URI)だけを載せる
- ロングポーリング(
timeoutInSecondsを長め)で空ポーリングのリクエストを減らす - 関連イベントは チャネル でグルーピングし、エンティティ単位の順序を担保する
運用・監視
- OCI Monitoring のメトリクス名前空間
oci_queueを使用。主な指標は以下Messages(可視メッセージ数)/InFlightMessages(処理中のメッセージ数)DeadLetterMessages(DLQ 滞留数)GetMessages/PutMessagesなどの API 呼び出し数
- 滞留増 → コンシューマ不足やダウンストリーム障害を疑う
- DLQ に溜まる → 処理ロジック / 権限(IAM ポリシー)/ メッセージフォーマットを確認
- 操作監査は OCI Audit ログ、メトリクスのしきい値超過は Alarm で通知
コスト
リクエスト課金が中心です。空ポーリングを減らすほど安くなります。
| 課金要素 | 内容 | コスト最適化のポイント |
|---|---|---|
| メッセージ操作(リクエスト) | PutMessages / GetMessages / DeleteMessages などの API 呼び出し数で課金 | ロングポーリングで空ポーリングを削減し、バッチで複数メッセージをまとめて送受信 |
| DLQ | DLQ のメッセージも通常メッセージとして扱われる | 原因を早期に解消し DLQ を溜めない |
| プロビジョニング | キャパシティの事前確保は不要(サーバーレス) | 使った分だけ。アイドル時のコストを気にしなくてよい |
セキュリティ
- IAM ポリシーでアクセス制御。
manage queues(管理)と、データプレーン操作のuse queues/read queuesなどを最小権限で付与する - 通信は TLS(HTTPS) で暗号化。保存時はサービスによる暗号化に加え、カスタマー管理キー(OCI Vault の鍵) を指定可能
- メッセージエンドポイントへのアクセスはネットワークポリシー(プライベートアクセス)で制限する
コンシューマやプロデューサに**広すぎる権限(テナンシ全体の manage queues)**を付けるのは NG。ワーカーには対象キューへの use queues(送受信のみ) に絞った動的グループ + IAM ポリシーを割り当て、管理操作と権限を分離します。
関連サービス・比較(AWS との対応)
| 観点 | OCI Queue | Amazon SQS |
|---|---|---|
| 位置づけ | OCI のフルマネージドメッセージキュー | AWS のフルマネージドメッセージキュー |
| 配信モデル | プル(GetMessages でポーリング) | プル(ポーリング) |
| 配信保証 | at-least-once(最低1回) | 標準=最低1回 / FIFO=exactly-once |
| 順序付け | チャネル(channelId)単位で順序保証 | FIFO キューで順序保証 |
| メッセージ非表示 | 可視性タイムアウト(既定30秒) | 可視性タイムアウト |
| 失敗の退避 | DLQ(最大配信回数で移動) | DLQ(maxReceiveCount で移動) |
| 最大保持期間 | 最大7日 | 最大14日 |
| インターフェース | REST API / SDK / OCI CLI | AWS API / SDK / CLI |
ハンズオン / CLI例
# キューを作成(コンパートメント指定。可視性タイムアウト等は作成後に設定可)
oci queue queue-admin create \
--compartment-id "$COMPARTMENT_OCID" \
--display-name jobs
# 作成したキューのメッセージエンドポイントを確認
oci queue queue-admin get --queue-id "$QUEUE_OCID" \
--query "data.\"messages-endpoint\"" --raw-output
# メッセージを送信(データプレーン: --endpoint にメッセージエンドポイントを指定)
oci queue messages put-messages \
--endpoint "$MESSAGES_ENDPOINT" \
--queue-id "$QUEUE_OCID" \
--messages '[{"content":"{\"id\":\"job-1\"}"}]'
# メッセージを受信(ロングポーリング: timeout-in-seconds=20)
oci queue messages get-messages \
--endpoint "$MESSAGES_ENDPOINT" \
--queue-id "$QUEUE_OCID" \
--visibility-in-seconds 30 \
--timeout-in-seconds 20
# 処理完了後、レシートで削除
oci queue messages delete-message \
--endpoint "$MESSAGES_ENDPOINT" \
--queue-id "$QUEUE_OCID" \
--message-receipt "$RECEIPT"
OCI Service
OCI Queueを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: OCI / カテゴリ: アプリ統合 / 難易度: intermediate
導入後に効く点
急増してもバッファして取りこぼさず、リクエスト課金で従量。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- OCI
- カテゴリ
- アプリ統合
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- reliability / performance / cost / operational
判断チェックリスト
- 自社の用途が「アプリ統合 / reliability」に近いか確認する。
- 強みである「仕事を一旦ためる箱で送信側と処理側を疎結合にするキュー。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
他クラウドの同等サービス
役割が近いサービスです。設計の置き換えや比較検討の参考に。