データ通信の最適化:ミルバス、NATSメッセージングを採用
データ処理という複雑なタペストリーにおいて、シームレスなコミュニケーションは業務を結びつける糸である。オープンソース・ベクターデータベースの先駆者であるMilvusは、その最新機能で変革の旅に乗り出した:NATSメッセージングの統合である。この包括的なブログポストでは、この統合の複雑さを解き明かし、そのコア機能、セットアッププロセス、移行のメリット、そして前身であるRocksMQとの比較について説明します。
Milvus におけるメッセージキューの役割を理解する
Milvusのクラウドネイティブアーキテクチャにおいて、メッセージキュー(ログブローカー)は極めて重要な役割を担っています。これは、永続的なデータストリーム、同期、イベント通知、システム復旧時のデータ整合性を保証するバックボーンです。従来、Milvusスタンドアロン・モードでは、特にPulsarやKafkaと比較した場合、RocksMQが最もわかりやすい選択肢でしたが、膨大なデータや複雑なシナリオでは、その限界が明らかになりました。
Milvus 2.3では、シングル・ノードMQ実装であるNATSを導入し、データ・ストリームの管理方法を再定義します。前世代とは異なり、NATSはMilvusユーザをパフォーマンスの制約から解放し、膨大なデータ量の処理においてシームレスな体験を提供します。
NATS とは?
NATSはGoで実装された分散システム接続技術です。システム間のRequest-ReplyやPublish-Subscribeのような様々な通信モードをサポートし、JetStreamを通してデータの永続性を提供し、組み込みのRAFTを通して分散機能を提供します。NATSの詳細についてはNATS公式サイトを参照してください。
Milvus2.3スタンドアロンモードでは、NATS、JetStream、PubSubがMilvusに堅牢なMQ機能を提供します。
NATS の有効化
Milvus2.3では新しいコントロールオプションとしてmq.typeが追加され、ユーザが使用するMQのタイプを指定できるようになった。NATSを有効にするには、mq.type=natsmqと設定する。Milvusインスタンスを起動した後、以下のようなログが表示されれば、メッセージキューとしてNATSを有効にすることができたことになる。
[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq].
MilvusのNATS設定
NATSのカスタマイズオプションには、リスニングポート、JetStreamストレージディレクトリ、最大ペイロードサイズ、および初期化タイムアウトの指定が含まれます。これらの設定を微調整することで、最適なパフォーマンスと信頼性を確保することができます。
natsmq:
サーバーの設定:# natsmq のサーバ側の設定。
ポート:4222 # デフォルトは 4222, nats サーバの待ち受けポート。
storeDir: /var/lib/milvus/nats # デフォルトでは/var/lib/milvus/nats。
maxFileStore:17179869184 # (B) デフォルトでは16GB, 'ファイル'ストレージの最大サイズ.
maxPayload:8388608 # (B) デフォルトでは8MB, メッセージのペイロードの最大バイト数.
maxPending: デフォルト:67108864 # (B) 64MB(デフォルト), 接続時にバッファリングされるバイト数の最大値 クライアント接続時に適用される.
initializeTimeout:4000 # (ms) デフォルトでは4秒、natsmqの初期化が終了するのを待つ。
natsmqの初期化が終了するのを待つ:
trace: false # デフォルトはfalse、trueの場合プロトコルのトレースログメッセージを有効にする。
debug: false # デフォルトはfalse, もしtrueならデバッグログメッセージを有効にする.
logTime: true # デフォルトではtrue、falseに設定するとタイムスタンプなしでログを記録する。
logFile: /tmp/milvus/logs/nats.log # デフォルトでは/tmp/milvus/logs/nats.log, milvusバイナリの ...からの相対パスを使用する場合.
logSizeLimit: 536870912 # (B) 512MB(デフォルト), ログファイルが新しいものにロールオーバーされた後のバイト数.
保持:
maxAge: 4320 # (最小) デフォルトでは3日, Pチャンネルに記録されるメッセージの最大保存期間.
maxBytes:# (B)デフォルトではなし, 一つのPチャンネルが含むことができるバイト数.Pチャンネルがこのサイズを超えた場合, 最も古いメッセージを削除します.
maxMsgs:# デフォルトではなし, 一つのPチャンネルが含むことができるメッセージの数.Pチャンネルがこの制限を超えた場合、最も古いメッセージを削除します。
注意:
NATS サーバのリスニングには
server.portを指定する必要がある。ポートが競合するとMilvusは起動できません。ランダムにポートを選択するにはserver.port=-1を設定してください。storeDir`はJetStreamストレージのディレクトリを指定する。Milvusの読み書きスループットを向上させるため、高性能なソリッドステートドライブ(SSD)にディレクトリを保存することを推奨する。
maxFileStore`はJetStreamストレージサイズの上限を設定します。この上限を超えると、それ以上データを書き込むことができなくなります。
maxPayload` は個々のメッセージのサイズを制限する。書き込み拒否を避けるために、5MB 以上に保つ必要がある。
initializeTimeout`はNATSサーバーの起動タイムアウトを制御する。
monitor` NATS の独立ログを設定する。
retention` は NATS メッセージの保持メカニズムを制御する。
詳しくはNATS official documentationを参照してください。
RocksMQ から NATS への移行
RocksMQからNATSへの移行は、書き込み操作の停止、データのフラッシュ、設定の変更、Milvusのログによる移行の検証などのステップを含むシームレスなプロセスです。
移行を開始する前に、Milvusのすべての書き込み操作を停止します。
Milvus で
FlushALLオペレーションを実行し、その完了を待つ。このステップにより、保留中のデータがすべてフラッシュされ、システムがシャットダウンできる状態になる。mq.type=natsmq
を設定し、natsmq`セクションの関連オプションを調整することで、Milvus設定ファイルを修正する。Milvus 2.3 を起動する。
rocksmq.path`ディレクトリに保存されているオリジナルデータをバックアップし、クリーンアップする。(オプション)
NATS vs. RocksMQ: パフォーマンス対決
Pub/Sub パフォーマンステスト
テスト・プラットフォーム:** M1 Pro チップ / メモリ: 16GB
テストシナリオ:*** トピックへのランダムなデータパケットのサブスクライブおよびパブリッシュを、最後のパブリッシュ結果を受信するまで繰り返す。
結果
より小さなデータパケット(<64kb)では、RocksMQはメモリ、CPU、応答速度に関してNATSを上回る。
より大きなデータパケット(> 64kb)では、NATSがRocksMQを凌駕し、レスポンスタイムがはるかに速い。
| テスト・タイプ|MQ|op数|opあたりのコスト|メモリ・コスト|CPU合計時間|ストレージ・コスト | ------------------- | ------- | -------- | ---------------- | ----------- | -------------- | ------------ | | 5MB100 Pub/Sub | NATS | 50 | 1.650328186 s/op | 4.29 GB | 85.58 | 25G | 5MB100 Pub/Sub|RocksMQ|50|2.47595131 s/op|1.18 GB|81.42|19G | 1MB500 Pub/Sub|NATS|50|2.248722593 s/op|2.60 GB|96.50|25G | 1MB500 Pub/Sub|RocksMQ|50|2.554614279 s/op|614.9 MB|80.19|19G | NATS|50|2.133345262 s/op|3.29 GB|97.59|31G | 64KB10000 Pub/Sub|RocksMQ|50|3.253778195 s/op|331.2 MB|134.6|24G | 1KB50000 Pub/Sub|NATS|50|2.629391004 s/op|635.1 MB|179.67|2.6G | RocksMQ|50|0.897638581 s/op|232.3 MB|60.42|521M
表1: Pub/Subパフォーマンステスト結果
Milvus 統合テスト
データサイズ: 100M
**NATS は、1 億個のベクターデータセットを用いた広範なテストにおいて、ベクター検索とクエリのレイテンシが低いことを示しました。
| メトリクス|RocksMQ (ms)|NATS (ms) | --------------------------------------- | ------------ | --------- | | 平均ベクトル検索レイテンシー|23.55|20.17 | ベクトル検索リクエスト/秒(RPS)|2.95|3.07 | 平均クエリーレイテンシー|7.2|6.74 | クエリーリクエスト/秒(RPS)|1.47|1.54
表2:100mデータセットによるMilvus統合テスト結果
データセット<100M
結果: 100M以下のデータセットでは、NATSとRocksMQは同程度のパフォーマンスを示した。
結論NATSメッセージングによるMilvusの強化
MilvusにNATSが統合されたことで、データ処理は大きく前進した。リアルタイム分析、機械学習アプリケーション、またはデータ集約的なベンチャー企業であろうと、NATSは効率性、信頼性、スピードでプロジェクトを強化します。データ環境が進化する中、ミルバスにNATSのような堅牢なメッセージングシステムがあれば、シームレスで信頼性の高い、高性能なデータ通信が可能になります。
読み続けて

My Wife Wanted Dior. I Spent $600 on Claude Code to Vibe-Code a 2M-Line Database Instead.
Write tests, not code reviews. How a test-first workflow with 6 parallel Claude Code sessions turns a 2M-line C++ codebase into a daily shipping pipeline.

A Developer's Guide to Exploring Milvus 2.6 Features on Zilliz Cloud
Milvus 2.6 marks a shift from “vector search + glue code” to a more advanced retrieval engine, and it is now Generally Available (GA) on Zilliz Cloud (a managed Milvus service).

Creating Collections in Zilliz Cloud Just Got Way Easier
We've enhanced the entire collection creation experience to bring advanced capabilities directly into the interface, making it faster and easier to build production-ready schemas without switching tools.



