要約 (TL;DR)
イベント駆動型APIは、外部通知にウェブフックを、内部処理にメッセージキューを使用します。イベントをキュー(RabbitMQ、Kafkaなど)に発行し、非同期で処理し、ウェブフックを通じてクライアントに通知します。モダンなPetstoreAPIは、注文処理、在庫更新、支払い通知にこのパターンを使用しています。
はじめに
顧客が注文を行います。あなたのAPIは、支払い処理、在庫更新、メール送信、倉庫への通知、ウェブフックのトリガーを行う必要があります。これらすべてを同期的に行い、顧客を10秒間待たせますか?それとも、すぐに応答し、非同期で処理しますか?
イベント駆動型APIは、迅速に応答し、バックグラウンドで処理を行います。注文のエンドポイントはすぐに201 Createdを返します。イベントがバックグラウンド処理をトリガーします。完了すると、ウェブフックがクライアントに通知します。
モダンPetstoreAPIは、注文、支払い、在庫にイベント駆動型アーキテクチャを使用しています。
Apidogは、ウェブフックのテスト、イベントフローの検証、非同期処理のシミュレーションを支援します。
イベント駆動型アーキテクチャ
イベント駆動型APIは、何かが発生したときにイベントを発行します。他のサービスが購読し、反応します。
コンポーネント
- イベントプロデューサー - イベントを発行するAPIエンドポイント
- イベントバス/キュー - イベントをルーティングします(RabbitMQ、Kafka、SQSなど)
- イベントコンシューマー - イベントを処理するバックグラウンドワーカー
- ウェブフック - 外部クライアントに通知します
フロー
Client → POST /orders → API
API → "order.created"を発行 → キュー
API → 201 Createdを返す → Client
Worker → イベントを消費 → 注文を処理
Worker → "order.completed"を発行 → キュー
Webhook Worker → ウェブフックを送信 → Client
外部イベントのためのウェブフック
ウェブフックは、外部クライアントにイベントを通知します。
// 注文が作成されたときにイベントを発行
app.post('/v1/orders', async (req, res) => {
const order = await createOrder(req.body);
await eventBus.publish('order.created', {
orderId: order.id,
userId: order.userId,
total: order.total
});
res.status(201).json(order);
});
// バックグラウンドワーカーがウェブフックを送信
eventBus.subscribe('order.completed', async (event) => {
const webhooks = await getWebhooks(event.userId, 'order.completed');
for (const webhook of webhooks) {
await sendWebhook(webhook.url, {
event: 'order.completed',
data: event
});
}
});
内部イベントのためのメッセージキュー
メッセージキューは内部イベント処理を扱います。
RabbitMQの例
// 発行者 (Publisher)
await publishEvent('order.created', { orderId: '019b4132' });
// 消費者 (Consumer)
await consumeEvents('order.*', async (event) => {
await processOrder(event);
});
モダンPetstoreAPIがイベント駆動型APIをどのように実装しているか
注文処理
- POST /orders はすぐに201を返します
- order.createdイベントを発行します
- 支払いワーカーが支払いを処理します
- 在庫ワーカーが在庫を更新します
- メールワーカーが確認メールを送信します
- ウェブフックワーカーがクライアントに通知します
モダンPetstoreAPIのイベントアーキテクチャをご覧ください。
Apidogによるテスト
Apidogはイベント駆動型APIテストをサポートしています:
- ウェブフックの配信をテスト
- イベントペイロードを検証
- 非同期処理をシミュレート
- リトライロジックをテスト
結論
イベント駆動型APIは、パフォーマンスとスケーラビリティを向上させます。外部通知にはウェブフックを、内部処理にはメッセージキューを使用します。モダンPetstoreAPIは、本番環境で利用できるイベント駆動型パターンを示しています。
よくある質問
ウェブフックとメッセージキューの違いは何ですか?
ウェブフックはHTTP経由で外部クライアントに通知します。メッセージキューは内部サービス間の通信を処理します。
どのメッセージキューを使用すべきですか?
シンプルさにはRabbitMQ、高スループットにはKafka、マネージドサービスにはAWS SQSです。
ウェブフックの失敗はどのように処理しますか?
指数関数的バックオフを用いたリトライロジックを実装します(ウェブフックの信頼性ガイドを参照)。
メッセージキューなしでイベントを使用できますか?
はい、しかしキューは耐久性、リトライ、分離を提供します。
イベント駆動型APIはどのようにテストしますか?
Apidogを使用してウェブフックをテストし、イベントフローを検証します。
