Skip to content

なぜメッセージキューが重要なのか

📨 なぜメッセージキューが重要なのか

Section titled “📨 なぜメッセージキューが重要なのか”

メッセージキューは、非同期処理とサービス間通信を実現する重要な仕組みです。適切なメッセージキューの使用により、システムのスケーラビリティと信頼性を向上させられます。

❌ メッセージキューなしのシステムの問題

Section titled “❌ メッセージキューなしのシステムの問題”

❌ 問題のある実装:

// 同期処理: メール送信が完了するまで待機
async function createOrder(orderData: OrderData) {
// 注文を作成
const order = await db.orders.create(orderData);
// メール送信(時間がかかる)
await sendEmail(order.userEmail, 'Order created');
// 在庫更新
await updateInventory(order.items);
// 問題点:
// - メール送信が失敗すると全体が失敗
// - レスポンスタイムが長くなる
// - スケーラビリティが低い
}

⚠️ 影響:

  • ⏱️ レスポンスタイムの増加
  • ⚠️ エラー時の影響範囲の拡大
  • 📉 スケーラビリティの低下

✅ メッセージキューによる解決

Section titled “✅ メッセージキューによる解決”

✅ 改善された実装:

// 非同期処理: メッセージキューを使用
async function createOrder(orderData: OrderData) {
// 注文を作成
const order = await db.orders.create(orderData);
// メール送信をキューに追加(非同期)
await messageQueue.publish('email.send', {
to: order.userEmail,
subject: 'Order created',
template: 'order_created'
});
// 在庫更新をキューに追加(非同期)
await messageQueue.publish('inventory.update', {
orderId: order.id,
items: order.items
});
// メリット:
// - レスポンスタイムが短縮される
// - エラーが他の処理に影響しない
// - スケーラビリティが向上する
}

定義: 1つのメッセージを1つのコンシューマーが処理します。

使用例:

// タスクキュー
await queue.send('process-payment', {
orderId: order.id,
amount: order.amount
});
// 1つのワーカーが処理
worker.on('process-payment', async (job) => {
await processPayment(job.data);
});

定義: 1つのメッセージを複数のコンシューマーが処理します。

使用例:

// イベントの発行
await pubsub.publish('order.created', {
orderId: order.id,
userId: order.userId
});
// 複数のサブスクライバーが処理
pubsub.subscribe('order.created', async (data) => {
await sendEmail(data.userId);
await updateAnalytics(data.orderId);
await notifyWarehouse(data.orderId);
});
// 時間のかかる処理を非同期で実行
await queue.send('generate-report', { userId });
// すぐにレスポンスを返す
// 複数のワーカーで処理を分散
// ワーカー1: タスク1を処理
// ワーカー2: タスク2を処理
// ワーカー3: タスク3を処理
// メッセージが失われない
// 処理が失敗した場合、リトライ可能

メッセージキューが重要な理由:

  • 非同期処理: 時間のかかる処理を非同期で実行できる
  • 負荷分散: 処理を複数のワーカーで分散できる
  • 信頼性: メッセージが失われない、リトライ可能
  • スケーラビリティ: システムのスケーラビリティが向上する
  • 疎結合: サービス間の疎結合を実現できる

適切なメッセージキューの使用により、スケーラブルで信頼性の高いシステムを構築できます。