Оптимизация обмена данными: Milvus внедряет обмен сообщениями NATS
В сложной мозаике обработки данных бесшовная коммуникация — это нить, связывающая операции воедино. Milvus, новаторская векторная база данных с открытым исходным кодом, отправилась в трансформационное путешествие со своей новейшей функцией: интеграцией обмена сообщениями NATS. В этой подробной публикации блога мы разберём тонкости этой интеграции, рассмотрев её ключевые функции, процесс настройки, преимущества миграции и то, как она выглядит на фоне своего предшественника, RocksMQ.
Понимание роли очередей сообщений в Milvus
В cloud-native архитектуре Milvus очередь сообщений, или Log Broker, имеет ключевое значение. Это основа, обеспечивающая постоянные потоки данных, синхронизацию, уведомления о событиях и целостность данных во время восстановления системы. Традиционно RocksMQ был самым простым выбором в режиме Milvus Standalone, особенно по сравнению с Pulsar и Kafka, но его ограничения стали очевидны при больших объёмах данных и сложных сценариях.
Milvus 2.3 представляет NATS, одноузловую реализацию MQ, переосмысливая управление потоками данных. В отличие от своих предшественников, NATS освобождает пользователей Milvus от ограничений производительности, обеспечивая бесшовный опыт обработки значительных объёмов данных.
Что такое NATS?
NATS — это технология связности распределённых систем, реализованная на Go. Она поддерживает различные режимы коммуникации, такие как Request-Reply и Publish-Subscribe между системами, обеспечивает персистентность данных через JetStream и предлагает распределённые возможности благодаря встроенному RAFT. Для более подробного понимания NATS вы можете обратиться к официальному сайту NATS.
В режиме Milvus 2.3 Standalone NATS, JetStream и PubSub предоставляют Milvus надёжные возможности MQ.
Включение NATS
Milvus 2.3 предлагает новую опцию управления, mq.type, которая позволяет пользователям указать тип MQ, который они хотят использовать. Чтобы включить NATS, установите mq.type=natsmq. Если после запуска экземпляров Milvus вы видите журналы, похожие на приведённые ниже, значит, вы успешно включили NATS в качестве очереди сообщений.
[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]
Настройка NATS для Milvus
Параметры настройки NATS включают указание порта прослушивания, каталога хранения JetStream, максимального размера полезной нагрузки и тайм-аута инициализации. Точная настройка этих параметров обеспечивает оптимальную производительность и надёжность.
natsmq:
server: # server side configuration for natsmq.
port: 4222 # 4222 by default, Port for nats server listening.
storeDir: /var/lib/milvus/nats # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
maxFileStore: 17179869184 # (B) 16GB by default, Maximum size of the 'file' storage.
maxPayload: 8388608 # (B) 8MB by default, Maximum number of bytes in a message payload.
maxPending: 67108864 # (B) 64MB by default, Maximum number of bytes buffered for a connection Applies to client connections.
initializeTimeout: 4000 # (ms) 4s by default, waiting for initialization of natsmq finished.
monitor:
trace: false # false by default, If true enable protocol trace log messages.
debug: false # false by default, If true enable debug log messages.
logTime: true # true by default, If set to false, log without timestamps.
logFile: /tmp/milvus/logs/nats.log # /tmp/milvus/logs/nats.log by default, Log file path relative to .. of milvus binary if use relative path.
logSizeLimit: 536870912 # (B) 512MB by default, Size in bytes after the log file rolls over to a new one.
retention:
maxAge: 4320 # (min) 3 days by default, Maximum age of any message in the P-channel.
maxBytes: # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
maxMsgs: # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.
Примечание:
Необходимо указать
server.portдля прослушивания сервером NATS. При конфликте портов Milvus не сможет запуститься. Установитеserver.port=-1, чтобы выбрать порт случайным образом.storeDirуказывает каталог для хранилища JetStream. Мы рекомендуем хранить каталог на высокопроизводительном твердотельном накопителе (SSD) для лучшей пропускной способности чтения/записи Milvus.maxFileStoreзадает верхний предел размера хранилища JetStream. Превышение этого предела предотвратит дальнейшую запись данных.maxPayloadограничивает размер отдельного сообщения. Следует поддерживать его выше 5MB, чтобы избежать отказов при записи.initializeTimeoutуправляет тайм-аутом запуска сервера NATS.monitorнастраивает независимые логи NATS.retentionуправляет механизмом хранения сообщений NATS.
Для получения дополнительной информации обратитесь к официальной документации NATS.
Миграция с RocksMQ на NATS
Миграция с RocksMQ на NATS — это бесшовный процесс, включающий такие шаги, как остановка операций записи, сброс данных, изменение конфигураций и проверка миграции через логи Milvus.
Перед началом миграции остановите все операции записи в Milvus.
Выполните операцию
FlushALLв Milvus и дождитесь ее завершения. Этот шаг гарантирует, что все ожидающие данные будут сброшены и система готова к завершению работы.Измените файл конфигурации Milvus, установив
mq.type=natsmqи настроив соответствующие параметры в разделеnatsmq.Запустите Milvus 2.3.
Создайте резервную копию и очистите исходные данные, хранящиеся в каталоге
rocksmq.path. (Необязательно)
NATS против RocksMQ: сравнение производительности
Тестирование производительности Pub/Sub
Платформа тестирования: M1 Pro Chip / память: 16GB
Сценарий тестирования: Подписка и многократная публикация случайных пакетов данных в тему до получения последнего опубликованного результата.
Результаты:
Для меньших пакетов данных (< 64kb) RocksMQ превосходит NATS по использованию памяти, CPU и скорости отклика.
Для более крупных пакетов данных (> 64kb) NATS превосходит RocksMQ, обеспечивая гораздо более быстрое время отклика.
| Тип теста | MQ | кол-во операций | стоимость операции | Затраты памяти | Общее время CPU | Затраты хранилища |
|---|---|---|---|---|---|---|
| 5MB*100 Pub/Sub | NATS | 50 | 1.650328186 s/op | 4.29 GB | 85.58 | 25G |
| 5MB*100 Pub/Sub | RocksMQ | 50 | 2.475595131 s/op | 1.18 GB | 81.42 | 19G |
| 1MB*500 Pub/Sub | NATS | 50 | 2.248722593 s/op | 2.60 GB | 96.50 | 25G |
| 1MB*500 Pub/Sub | RocksMQ | 50 | 2.554614279 s/op | 614.9 MB | 80.19 | 19G |
| 64KB*10000 Pub/Sub | NATS | 50 | 2.133345262 s/op | 3.29 GB | 97.59 | 31G |
| 64KB*10000 Pub/Sub | RocksMQ | 50 | 3.253778195 s/op | 331.2 MB | 134.6 | 24G |
| 1KB*50000 Pub/Sub | NATS | 50 | 2.629391004 s/op | 635.1 MB | 179.67 | 2.6G |
| 1KB*50000 Pub/Sub | RocksMQ | 50 | 0.897638581 s/op | 232.3 MB | 60.42 | 521M |
Таблица 1: Результаты тестирования производительности Pub/Sub
Интеграционное тестирование Milvus
Размер данных: 100M
Результат: В ходе обширного тестирования с набором данных из 100 миллионов векторов NATS продемонстрировал меньшую задержку векторного поиска и запросов.
| Метрики | RocksMQ (ms) | NATS (ms) |
|---|---|---|
| Средняя задержка векторного поиска | 23.55 | 20.17 |
| Запросов векторного поиска в секунду (RPS) | 2.95 | 3.07 |
| Средняя задержка запроса | 7.2 | 6.74 |
| Запросов в секунду (RPS) | 1.47 | 1.54 |
Таблица 2: Результаты интеграционного тестирования Milvus с набором данных 100m
Набор данных: <100M
Результат: Для наборов данных меньше 100M NATS и RocksMQ демонстрируют схожую производительность.
Заключение: расширение возможностей Milvus с помощью обмена сообщениями NATS
Интеграция NATS в Milvus знаменует значительный шаг вперед в обработке данных. Будь то аналитика в реальном времени, приложения машинного обучения или любой проект с интенсивным использованием данных, NATS обеспечивает вашим проектам эффективность, надежность и скорость. По мере развития ландшафта данных наличие надежной системы обмена сообщениями, такой как NATS, в Milvus обеспечивает бесперебойную, надежную и высокопроизводительную передачу данных.
Читать далее

Zilliz Cloud Just Landed in Claude Code
The Zilliz Cloud Plugin brings the full power of Zilliz Cloud directly into your Claude Code terminal as natural-language conversations.

Introducing Zilliz Cloud Global Cluster: Region-Level Resilience for Mission-Critical AI
Zilliz Cloud Global Cluster delivers multi-region resilience, automatic failover, and fast global AI search with built-in security and compliance.

How to Build RAG with Milvus, QwQ-32B and Ollama
Hands-on tutorial on how to create a streamlined, powerful RAG pipeline that balances efficiency, accuracy, and scalability using the QwQ-32B and Milvus.



