シナリオ: プロデューサーからコンシューマーへの伝搬遅延を小さくしたい低ボリュームのトピック (~150 メッセージ/秒) があります。
プロデューサーからのタイム スタンプを追加し、それをコンシューマーで読み取って伝播遅延を記録しました。デフォルトの構成では、メッセージ (20 バイト) は 1960 ミリ秒から 1230 ミリ秒の伝播遅延を示しました。同じマシンで 1 つのプロデューサーと 1 つの単純なコンシューマーを試したので、ネットワークの遅延は発生しませんでした。
トピックのフラッシュ間隔を 20 ミリ秒に調整しようとすると、1100 ミリ秒から 980 ミリ秒に低下します。次に、消費者"fetcher.backoff.ms"
を10msに調整してみました.1070ms - 860msに落ちました。
問題: 20 バイトのメッセージの場合、伝播遅延をできるだけ低くしたいと考えており、~950 ミリ秒はより高い数字です。
質問: 構成で見逃しているものはありますか? 私はコメントを歓迎します。あなたが得た遅延は最小限です。
仮定: Kafka システムには、コンシューマがプロデューサからメッセージを取得する前にディスク I/O が含まれており、これはハードディスクの RPM などに関連しています。
更新:耐久性と待ち時間のためにログ フラッシュ ポリシーを調整しようとしました。
構成は次のとおりです。
# The number of messages to accept before forcing a flush of data to disk
log.flush.interval=10
# The maximum amount of time a message can sit in a log before we force a flush
log.default.flush.interval.ms=100
# The interval (in ms) at which logs are checked to see if they need to be
# flushed to disk.
log.default.flush.scheduler.interval.ms=100
同じ 20 バイトのメッセージの場合、遅延は 740 ミリ秒から 880 ミリ秒でした。
次のステートメントは、構成自体で明確にされています。
いくつかの重要なトレードオフがあります。
- 耐久性: フラッシュされていないデータは、クラッシュが発生した場合に失われるリスクが高くなります。
- Latency : データは、フラッシュされるまで消費者に提供されません (これによりレイテンシが追加されます)。
- スループット: 一般に、フラッシュは最もコストのかかる操作です。
したがって、150ms ~ 250ms のマークに到達する方法はないと思います。(ハードウェアのアップグレードなし) .