RocketMQ の概要

目次

序文:

1。概要

2. ダウンロードとインストール、クラスタ構築

3. メッセージモデル

4. スループットを確保する方法

4.1. メッセージの保存

4.1.1 シーケンシャル読み取りと書き込み

4.1.2. 非同期ブラッシング

4.1.3. ゼロコピー

4.2. ネットワーク送信


序文:

RocketMQ のコード例には、インストール ディレクトリに詳細なデモの完全なセットが含まれているため、この記事では API などの廃止されたものではなく、RocketMQ の特性に焦点を当てます。メッセージ ミドルウェアは、スループット、メッセージの信頼性、メッセージ モデルの 3 つの点に焦点を当てる必要があります。メッセージ ミドルウェアの類似点と相違点は、これら 3 つの側面に反映されます。この記事では、これら 3 つの側面から RocketMQ についても説明します。

この記事は、著者による RocketMQ シリーズの記事の最後です。いくつかの基本的な概念、ダウンロードとインストール、クラスタリング、基本的なメッセージ モデルなどについては、別の記事ですでに説明しています。各記事は非常に単純で、2 ~ 3 回もかかりません。 1 つの記事を読むのに 3 分なので、コンテンツに直接リンクされます。

1。概要

RocketMQ は 、Alibaba Group によって元々開発され、オープンソース化されたオープンソースの分散メッセージング ミドルウェアです。分散システムに信頼性が高く、高性能でスケーラブルなメッセージ通信機能を提供することを目的としています。RocketMQ、RabbitMQ、KAFKA が 3 つの主流メッセージ ミドルウェアとして挙げられています。

RocketMQ の基本概念とアーキテクチャ:

RocketMQ__BugMan のブログの基本概念 - CSDN ブログ

2. ダウンロードとインストール、クラスタ構築

RocketMQ のダウンロードとインストールのチュートリアル + クラスター構築のチュートリアル:

RocketMQ のダウンロードとインストール、クラスター構築の乳母レベルのチュートリアル_rocketmq クラスターのインストール_BugMan のブログ-CSDN ブログ

3. メッセージモデル

RocketMQ のメッセージ モデルは次のとおりです。

  • 連続メッセージ。コンシューマはプロデューサによって送信された順序で消費します。
  • ブロードキャスト メッセージ。メッセージは複数のコンシューマーによって消費されます。
  • 遅延メッセージ、滞留時間、コンシューマはメッセージを消費できます。
  • バッチ メッセージ。プロデューサーによるメッセージのバッチ送信をサポートします。
  • メッセージをフィルタリングし、タグを介して、消費者は同じトピックの下で興味のあるメッセージを利用できます。
  • トランザクション メッセージの場合、プロデューサのメッセージ生成はトランザクション ロールバックをサポートします。

RocketMQ メッセージ モデルの詳細な説明:

__BugMan のブログを使用した RocketMQ の詳細な説明 - CSDN ブログ

4. スループットを確保する方法

4.1. メッセージの保存

RocketMQ の最大の特徴は、次の一文に要約できます。

これにより、メッセージの信頼性が保証されるだけでなく、スループットも保証されます。

信頼性とスループットは実際には相互に排他的な 2 つの点であり、信頼性を確保するには、電力損失を防ぐためにメッセージをディスクに保存する必要があります。ディスク ストレージに追いつかないと、このメッセージを読み取るときのディスク IO によってスループットが低下します。したがって、RocketMQ の核心は、実際にはデータをディスクにドロップし、スループットを向上させるためにあらゆる手段を試みることです。

RocketMQ の生成と消費のプロセス:

  • プロデューサーから送信されたメッセージを受信し、保存します

  • メッセージをコンシューマにプッシュした後、コンシューマの ACK を待ち、ACK の受信後にメッセージを消費済みとしてマークします。

  • 期限切れのメッセージを定期的に削除します。

RocketMQ がスループットを向上させるために使用する手段は次のとおりです。

  • シーケンシャルライト

  • 非同期ブラッシング

  • ゼロコピー

4.1.1 シーケンシャル読み取りと書き込み

ディスクのシーケンシャル読み取りおよび書き込みパフォーマンスは、ランダム読み取りおよび書き込みよりもはるかに優れています。ディスクからデータを読み取るたびに、最初にアドレスを指定して、ディスク上のデータの物理的な場所を見つける必要があるためです。機械式ハードディスクの場合、磁気ヘッドを移動させるため時間がかかります。ランダムな読み取りおよび書き込みと比較して、シーケンシャルな読み取りおよび書き込みはアドレス指定時間のほとんどを節約し、読み取りおよび書き込みを続けるために必要なアドレスは 1 回だけであるため、パフォーマンスはランダムな読み取りおよび書き込みよりもはるかに優れています。

RocketMQ はこの機能を利用します。すべてのメッセージ データは、無限に増大するファイル キュー CommitLog に保存されます。CommitLog は、1G メモリ マップ ファイル キューのグループで構成されます。書き込み時は定位置から書き込みを続け、ファイルがいっぱいになると新しいファイルを開いて順次読み書きを行います。

RocketMQ シーケンシャル ディスク書き込みのプロセスは次のとおりです。

  1. プロデューサーは RocketMQ Broker にメッセージを送信します。ブローカーはメッセージを受信すると、そのメッセージをメモリ内のページ キャッシュ (ページ キャッシュ) に順番に書き込みます。

  2. メッセージは、メモリのページ キャッシュ内で連続したデータ ブロックを形成します。RocketMQ のシーケンシャル書き込み戦略により、同じトピックとキュー ID を持つメッセージは、ディスク上にランダムに散在するのではなく、送信された順序に従ってバッチに配置され、連続したデータ ブロックを形成します。

  3. 次に、バックグラウンド スレッドが、ページ キャッシュ内の順次データ ブロックを、「CommitLog」と呼ばれるディスク上のストレージ ファイルに定期的に書き込みます。データが連続的に書き込まれるため、ディスクへの書き込み動作が効率化され、ディスクのシーク時間や断片化が減少し、書き込みパフォーマンスが向上します。

ディスクへの順次書き込みは、すべてのメッセージが順番に書き込まれることを意味するのではなく、同じトピック ID とキュー ID を持つメッセージが送信された順序で連続したデータ ブロックとしてディスクに書き込まれることに注意してください。トピック ID とキュー ID が異なるメッセージの場合、ディスク上でインターリーブされる場合があります。

4.1.2. 非同期ブラッシング

RocketMQ の非同期フラッシュ (Async Flush) は、メッセージ書き込みのパフォーマンスとスループットを向上させるために使用される最適化方法です。メッセージの保存に関して、RocketMQ は最初にディスクに書き込んでから戻る戦略に従います。つまり、メッセージがディスクに書き込まれる前に、まずメッセージをオペレーティング システムのページ キャッシュ (ページ キャッシュ) に書き込みます。 、すぐに成功した書き込み応答をプロデューサーに返します。その後、バックグラウンド スレッドがページ キャッシュ内のデータをディスクに非同期的にフラッシュします。

4.1.3. ゼロコピー

ゼロコピーは、データ転送、特にファイル転送やネットワーク データ転送の効率とパフォーマンスを向上させるために設計された最適化テクノロジです。従来のデータ送信方法では複数のデータ コピーが必要ですが、ゼロ コピーでは不必要なデータ コピー操作を回避することでデータ送信のオーバーヘッドが削減され、システム パフォーマンスが向上します。

ディスクからファイルを読み取ってネットワーク経由で送信するなど、従来のデータ転送では、通常、次の手順が必要になります。

  1. ディスクからカーネル空間 (カーネル バッファ) にデータを読み取ります。
  2. カーネル空間からユーザー空間 (ユーザー バッファー) にデータをコピーします。
  3. ユーザー空間からネットワーク バッファー (ネットワーク バッファー) にデータをコピーします。
  4. 最後に、データはネットワーク経由で送信されます。

この従来のデータ転送方法には複数のデータ コピーが含まれ、各コピーには CPU の参加が必要であり、カーネル空間とユーザー空間の間のデータ コピーが必要となるため、追加のオーバーヘッドと遅延が発生します。

ゼロコピー テクノロジの主なアイデアは、カーネル空間とユーザー空間の間でデータを直接転送することで、不必要なデータのコピーを回避し、CPU とメモリの使用量を削減することです。

0 コピーに関する非同期ブロガーによる別の記事により詳細な内容が記載されています。

ネットワーク全体で最も明確なゼロコピーの詳細な説明。一度読んでください。

4.2. ネットワーク送信

シリアル化とシリアル化を使用する理由についてよくわからない学生は、別のブロガーの記事に移動できます。

JAVAシリアル化の詳しい解説__BugManのブログ - CSDNブログ

RocketMQ メッセージはシリアル化を使用し、シリアル化と逆シリアル化はプロデューサー側とコンシューマー側の SDK によって実装されます。

RocketMQ で現在サポートされているシリアル化メソッドは次のとおりです。

  1. RocketMQ カスタム シリアル化: RocketMQ は、カスタム シリアル化プロトコルを使用してメッセージをエンコードおよびデコードします。このシリアル化プロトコルは、リモート コマンド プロトコルと呼ばれます。このプロトコルはバイナリ形式を使用し、メッセージを効率的にエンコードおよびデコードして、高いパフォーマンスと低遅延を実現します。

  2. JSON シリアル化: RocketMQ は、送信用にメッセージを JSON 形式に変換することをサポートしています。JSON シリアル化方法は、複雑な構造のメッセージの処理に適しており、読み取りとデバッグが簡単ですが、バイナリ形式と比較して、一定量の送信オーバーヘッドが増加します。

  3. Java ネイティブ シリアル化: RocketMQ は、Java ネイティブ シリアル化 (Java Serialization) の使用もサポートしています。Java ネイティブ シリアル化は、Java 標準ライブラリによって提供されるシリアル化メソッドですが、パフォーマンスの点で他のシリアル化フレームワークほど優れていない可能性があります。

  4. Hessian シリアル化: Hessian は、複数のプログラミング言語をサポートするバイナリ シリアル化フレームワークです。RocketMQ は、ヘッセ行列を使用してメッセージを送信用のバイナリ データにシリアル化することをサポートしています。

おすすめ

転載: blog.csdn.net/Joker_ZJN/article/details/131993079