キュー
キューシステムは、非同期メッセージのパブリッシャー、ドライバー、キュー、コンシューマー、ハンドラー関数を接続します。
このページは設定および動作のリファレンスです。YAML のコードブロックは、完全なドキュメントを示す場合を除き、既存のエントリリストに配置する断片です。外部ドライバーの例では、ブローカーまたは AWS 互換サービスがすでに存在することを前提としています。
アーキテクチャ
flowchart LR
P[Publisher] --> D[Driver]
D --> Q[Queue]
Q --> C[Consumer]
C --> W[Worker Pool]
W --> F[Function]
- ドライバー — バックエンド実装(memory、AMQP、SQS)
- キュー — ドライバーに関連付けられた論理キュー
- コンシューマー — 並行処理設定を使ってキューとハンドラーを接続
- ワーカープール — メッセージを並行処理
複数のキューで 1 つのドライバーを共有できます。複数のコンシューマーで同じキューを処理できます。
エントリ種別
| 種別 | 説明 |
|---|---|
queue.driver.memory |
インメモリキュードライバー |
queue.driver.amqp |
AMQP(RabbitMQ)ドライバー |
queue.driver.sqs |
AWS SQS ドライバー(LocalStack、ElasticMQ にも対応) |
queue.queue |
ドライバー参照を持つキュー宣言 |
queue.consumer |
メッセージを処理するコンシューマー |
ドライバー設定
メモリドライバー
インプロセスドライバーは開発環境および単一ノードのデプロイ向けで、外部依存関係はありません。
- name: memory_driver
kind: queue.driver.memory
lifecycle:
auto_start: true
AMQP ドライバー
RabbitMQ および AMQP 0-9-1 互換ブローカー用です。
- name: amqp_driver
kind: queue.driver.amqp
url: "amqp://guest:guest@localhost:5672/"
vhost: "/"
connection_name: "wippy-service"
heartbeat: "10s"
connection_timeout: "30s"
reconnect_delay: "1s"
reconnect_max_delay: "30s"
default_message_ttl: "1h"
default_queue_expiry: "24h"
prefetch_count: 10
lifecycle:
auto_start: true
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
url |
string | amqp://guest:guest@localhost:5672/ |
ブローカー URL |
vhost |
string | - | 仮想ホストの上書き |
connection_name |
string | - | ブローカー UI に表示される識別子 |
auth_mechanism |
string | PLAIN |
PLAIN、EXTERNAL(mTLS)、または AMQPLAIN |
heartbeat |
duration | - | Keep-alive 間隔 |
connection_timeout |
duration | - | 接続タイムアウト |
reconnect_delay |
duration | 1s |
初回再接続のバックオフ |
reconnect_max_delay |
duration | 30s |
再接続バックオフの最大値 |
default_message_ttl |
duration | - | パブリッシャーが有効期限を設定しない場合に使用するメッセージ単位の有効期限 |
default_queue_ttl |
duration | - | キューレベルのメッセージ TTL(x-message-ttl)のデフォルト値 |
default_queue_expiry |
duration | - | 未使用キューの有効期限(x-expires)のデフォルト値 |
prefetch_count |
int | - | チャネルレベルのプリフェッチ上限 |
frame_size |
int | - | AMQP フレームサイズの上限 |
channel_max |
int | - | 接続あたりの最大チャネル数 |
tls |
object | - | TLS 設定(下記参照) |
tls の下に TLS を設定します。
tls:
enabled: true
server_name: "rabbit.example.com"
cert: ${env:app.env:amqp_cert}
key: ${env:app.env:amqp_key}
ca: ${env:app.env:amqp_ca}
insecure_skip_verify: false
cert/key/ca は PEM コンテンツを保持します。インライン、file:// 経由、または env レジストリで解決される ${env:NAME} プレースホルダ経由で指定できます。insecure_skip_verify は証明書検証を無効化します(開発用のみ)。従来の cert_env/key_env/ca_env ディレクティブも同じように解決されますが非推奨です。${env:NAME} を使用してください。
SQS ドライバー
AWS SQS および SQS 互換エンドポイント(LocalStack、ElasticMQ)用です。認証情報、リージョン、その他の AWS SDK 設定は、共有の config.aws リソースから取得されます。
- name: aws_config
kind: config.aws
region: us-east-1
access_key_id: ${env:app:AWS_ACCESS_KEY_ID}
secret_access_key: ${env:app:AWS_SECRET_ACCESS_KEY}
- name: sqs_driver
kind: queue.driver.sqs
config: app:aws_config
endpoint: "http://localhost:9324"
message_retention_period: 86400
default_delay_seconds: 0
lifecycle:
auto_start: true
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
config |
Registry ID | 必須 | リージョンと認証情報を提供する config.aws リソース |
endpoint |
string | - | カスタムエンドポイント URL(LocalStack、ElasticMQ);実 AWS では省略 |
message_retention_period |
int | - | キューレベル保持期間(秒)(60–1209600)。作成時にキュー属性として設定される。省略するとAWSのデフォルトである345600(4日)のままになる。 |
default_delay_seconds |
int | 0 |
CreateQueue で適用されるデフォルト配信遅延(0–900) |
disable_message_checksum_validation |
bool | false |
送受信時の SQS メッセージチェックサム検証を無効化 |
use_fips |
bool | false |
FIPS 準拠のエンドポイントを使用 |
use_dual_stack |
bool | false |
デュアルスタック(IPv4 + IPv6)エンドポイントを使用 |
キューは初回使用時にドライバによって自動作成されます。発行時に SQS 固有のフィールドを指定するには SQS プレフィックス付きヘッダを使用してください。sqs.delay_seconds、sqs.message_group_id、sqs.message_deduplication_id は型付きの SQS メッセージフィールドにマッピングされます。それ以外のヘッダ(correlation_id や content_type のような中立的なキー、および任意の sqs.message_attributes.* キー)は SQS メッセージ属性としてそのまま運ばれます。
キュー設定 {id="queue-configuration"}
- name: tasks
kind: queue.queue
driver: app.queue:memory_driver
codec: json/plain
queue_name: "app_tasks"
driver_options:
memory:
max_length: 500
dead_letter:
queue: app.queue:tasks_dlq
max_attempts: 5
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
driver |
Registry ID | はい | キュードライバ |
codec |
string | いいえ | メッセージ本体のワイヤエンコーディング。デフォルトは json/plain(コーデックを参照) |
queue_name |
string | いいえ | 外部キュー名(デフォルトはエントリ名) |
driver_options |
object | いいえ | ドライバ kind でキー付けされたドライバごとのサブバッグ |
dead_letter.queue |
Registry ID | いいえ | 失敗メッセージのキュー ID(受け付けられるが、組み込みドライバではまだ適用されない) |
dead_letter.max_attempts |
int | いいえ | DLQ にルーティングするまでの試行回数(受け付けられるが、組み込みドライバではまだ適用されない) |
ドライバーオプション
driver_options のキーはドライバー名でスコープされます。ドライバーは自身のサブバッグだけを読み取ります。他のキーは休眠状態となるため、必要に応じて単一のキューエントリで複数のドライバーの設定を宣言できます。
memory:
| キー | 説明 |
|---|---|
max_length |
境界バッファサイズ(0 または未設定 = デフォルト 1000) |
amqp:
| キー | 説明 |
|---|---|
durable |
ブローカーの再起動後も維持 |
auto_delete |
最後のコンシューマーが切断したときに削除 |
message_ttl |
キューごとのメッセージ TTL の上書き |
queue_expiry |
未使用キューの有効期限 |
max_length |
保持する最大メッセージ数 |
コーデック {id="codecs"}
codec は、メッセージ本文をブローカーに渡す前のシリアライズ方法を選択します。ペイロード形式を表す文字列で、デフォルトは json/plain です。
| コーデック | 形式 |
|---|---|
json/plain |
JSON(デフォルト) |
application/msgpack |
MessagePack |
AMQP ドライバーは、発行するメッセージに対応する content-type(application/json または application/msgpack)を設定します。不明なコーデックは発行時ではなく、キューの宣言時に失敗します。
コンシューマー設定
- name: task_consumer
kind: queue.consumer
queue: app.queue:tasks
func: app.queue:task_handler
concurrency: 4
prefetch: 20
auto_ack: false
driver_options:
amqp:
consumer_tag: "worker-1"
exclusive: false
lifecycle:
auto_start: true
requires:
- app.queue:tasks
| フィールド | デフォルト | 説明 |
|---|---|---|
queue |
必須 | キューのレジストリ ID |
func |
必須 | ハンドラー関数のレジストリ ID |
concurrency |
1 | 並列ワーカー数 |
prefetch |
10 | 配信バッファの合計 / ワーカー間で共有される最大処理中メッセージ数 |
auto_ack |
false | true の場合、ランタイムはブローカー ack を呼び出さない;ハンドラの成功/失敗が唯一の settle シグナル |
driver_options |
- | ドライバごとのサブバッグ(キューと同じ構造) |
amqp コンシューマーオプション:
| キー | 説明 |
|---|---|
exclusive |
単一コンシューマーによるキューアクセス |
no_local |
同じ接続で発行されたメッセージを拒否 |
no_wait |
サブスクライブ時にブローカーの確認を待たない |
consumer_tag |
このサブスクリプションの識別子 |
ワーカープール
ワーカーは並行して実行されます。
concurrency: 3, prefetch: 10
1. Driver delivers up to 10 messages to the shared buffer
2. 3 workers pull from the buffer and can each hold an active delivery
3. As workers finish, buffer refills
4. Backpressure when all workers busy and buffer full
ハンドラー関数
コンシューマーハンドラーは、デコード済みのメッセージ本文を最初の引数として受け取ります。配信メタデータ(id、headers)には queue.message() でアクセスします。
local queue = require("queue")
local logger = require("logger")
local function main(body)
local msg, msg_err = queue.message()
if msg_err then return nil, msg_err end
local message_id, id_err = msg:id()
if id_err then return nil, id_err end
local correlation_id, header_err = msg:header("correlation_id")
if header_err then return nil, header_err end
logger:info("processing", {
id = message_id,
correlation_id = correlation_id
})
local ok, err = process_task(body)
if err then
return nil, err -- nack: ドライバに応じて再配信
end
return true -- ack: remove from queue
end
return { main = main }
- name: task_handler
kind: function.lua
source: file://task_handler.lua
method: main
modules:
- queue
- logger
確認応答
ハンドラーが明示的に確定しない限り、コンシューマーは関数の呼び出し結果に基づいて確定します。
| ハンドラ結果 | アクション |
|---|---|
任意のプレーンな戻り値(false を含む) |
Ack |
nil, err の戻り値 |
Nack(ドライバに応じて再配信) |
| 投げられたエラー | Nack |
false を含む通常の戻り値では、確認応答の動作は選択されません。明示的に確定するには msg:ack() または msg:nack() を呼び出します。確定は一度だけ行われ、最初に到達した呼び出しが優先されます。
Dead-Letter ルーティング
Dead-letter ルーティングはまだ実装されていません。dead_letter ブロック(キュー設定を参照)は設定として受け付けられますが、現時点で試行回数を数え、nack されたメッセージを設定済みの DLQ にルーティングし、x_dead_letter_* ヘッダを設定する組み込みドライバはありません。nack されたメッセージはドライバ自身のポリシーに従って再配信されます。x_* ヘッダ名前空間は将来の DLQ 記録用に予約されているため、発行者は x_* ヘッダを設定しないでください。
メッセージの発行
Lua コードから発行します。
local queue = require("queue")
local published, publish_err = queue.publish("app.queue:tasks", {
id = "task-123",
action = "process",
data = payload
})
if publish_err then return nil, publish_err end
return published
Lua の発行 API とメッセージ API については、キューモジュールを参照してください。
グレースフルシャットダウン
コンシューマーの停止時には次の処理を行います。
- 新しい配信の受け付けを停止
- ワーカーコンテキストをキャンセル
- 処理中のメッセージを待機(タイムアウトあり)
- ワーカーが時間内に終了しない場合はエラーを返す
関連項目
- キューモジュール - Lua API リファレンス
- キューコンシューマーガイド - コンシューマーのパターンとワーカープール
- スーパービジョン - コンシューマーのライフサイクル管理