なぜメッセージキューが重要なのか
📨 なぜメッセージキューが重要なのか
Section titled “📨 なぜメッセージキューが重要なのか”メッセージキューは、非同期処理とサービス間通信を実現する重要な仕組みです。適切なメッセージキューの使用により、システムのスケーラビリティと信頼性を向上させられます。
🎯 メッセージキューの重要性
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 });
// メリット: // - レスポンスタイムが短縮される // - エラーが他の処理に影響しない // - スケーラビリティが向上する}メッセージキューの種類
Section titled “メッセージキューの種類”1. Point-to-Point(1対1)
Section titled “1. Point-to-Point(1対1)”定義: 1つのメッセージを1つのコンシューマーが処理します。
使用例:
// タスクキューawait queue.send('process-payment', { orderId: order.id, amount: order.amount});
// 1つのワーカーが処理worker.on('process-payment', async (job) => { await processPayment(job.data);});2. Pub/Sub(1対多)
Section titled “2. Pub/Sub(1対多)”定義: 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);});メッセージキューのメリット
Section titled “メッセージキューのメリット”1. 非同期処理
Section titled “1. 非同期処理”// 時間のかかる処理を非同期で実行await queue.send('generate-report', { userId });// すぐにレスポンスを返す2. 負荷の分散
Section titled “2. 負荷の分散”// 複数のワーカーで処理を分散// ワーカー1: タスク1を処理// ワーカー2: タスク2を処理// ワーカー3: タスク3を処理3. 信頼性
Section titled “3. 信頼性”// メッセージが失われない// 処理が失敗した場合、リトライ可能メッセージキューが重要な理由:
- 非同期処理: 時間のかかる処理を非同期で実行できる
- 負荷分散: 処理を複数のワーカーで分散できる
- 信頼性: メッセージが失われない、リトライ可能
- スケーラビリティ: システムのスケーラビリティが向上する
- 疎結合: サービス間の疎結合を実現できる
適切なメッセージキューの使用により、スケーラブルで信頼性の高いシステムを構築できます。