メッセージキューの役割と特性

Kafka / RabbitMQ はサービス間の非同期通信・バッファリングを担う。Kafka はログベースの高スループット設計、RabbitMQ は低レイテンシの柔軟なルーティングが得意だ。I/O スループット・OS ページキャッシュ(メモリ)・ネットワーク帯域がスケールアップの主対象となる。

ボトルネックになるリソース

MQ 種ボトルネック確認方法
Kafkaディスク I/O(書き込みスループット)・OS ページキャッシュ・ネットワーク帯域iostat -x / Consumer Lag
RabbitMQメモリ(キュー蓄積)・CPU(高頻度 ACK)・ディスク(スワップ時)Management UI / rabbitmqctl list_queues

スケールアップの内容と効果

① Kafka:I/O スループットとページキャッシュ増強

■ Kafka 必要ディスクスループット試算
必要 MB/s = Producer throughput(MB/s) × レプリカ数 × (1 + コンシューマー数)
例:200 MB/s・レプリカ 3・コンシューマー 2 → 200 × 3 × 3 = 1,800 MB/s → NVMe SSD が必要
Shell — Kafka I/O・Consumer Lag 確認
# JVM ヒープは最小限(ページキャッシュ優先)
# KAFKA_HEAP_OPTS="-Xmx6g -Xms6g"(残りは OS ページキャッシュへ)

iostat -x 1 10
kafka-consumer-groups.sh --bootstrap-server localhost:9092   --group my-group --describe | awk '{print $6}' | sort -n

② RabbitMQ:メモリ増強と flow control 防止

Shell — RabbitMQ メモリ設定
# rabbitmq.conf
vm_memory_high_watermark.relative = 0.6   # 物理メモリの 60% で flow control 開始
rabbitmqctl list_queues name messages consumers
rabbitmqctl status | grep -A5 "memory"

スケールダウンの考え方

状況スケールダウン条件
KafkaConsumer lag がゼロ・ディスク I/O %util < 30%・ページキャッシュに余裕あり
RabbitMQキュー蓄積ほぼゼロ・flow control 未発動・メモリ使用率 < 30%

スケールアップ vs スケールアウト

Kafka スケール判断

① Consumer lag 増加 → コンシューマー並列度(パーティション数)を増やす。② ブローカー I/O 飽和 → ブローカー追加・パーティション再分散(スケールアウト)。③ メモリ不足 → スケールアップでページキャッシュを増やす。

判断指標(監視メトリクス)

MQ 種メトリクススケールアップの目安
Kafkaディスク %util≥ 70% が継続
KafkaConsumer Lag増加傾向が 30 分以上継続
RabbitMQqueue messages(蓄積数)SLA 閾値を超えて増加
RabbitMQflow control 発動回数> 0 が継続

まとめ

項目要点
Kafka の最優先ディスク I/O スループット(NVMe SSD 化)とページキャッシュ(メモリ増強)
RabbitMQ の最優先メモリ増強(flow control 防止)
JVM ヒープKafka は最小限(6GB 程度)に抑えてページキャッシュを優先する
スケールアウトKafka はパーティション追加+ブローカー追加が基本