Оптимизация обмена данными: 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 обеспечивает бесперебойную, надежную и высокопроизводительную передачу данных.
Читать далее

VDBBench Adds Cost-Aware Benchmarking for Vector Databases
Compare Zilliz Cloud, Pinecone, and turbopuffer with VDBBench cost-aware vector database benchmarks across latency, freshness, multitenancy, and cold starts.

What Is a Vector Lakebase?
A Vector Lakebase is a unified, lake-native data architecture for AI that combines vector-database-grade serving with open lake storage, reusable lake-level indexes, and a shared semantic layer.

How to Use Anthropic MCP Server with Milvus
MCP + Milvus: Streamline AI agent development with standardized data access, eliminating integration hassles while enhancing context and flexibility.



