46.6kЗаказать демоВойтиНачать бесплатно

Оптимизация обмена данными: Milvus внедряет обмен сообщениями NATS

Oct 11, 20235 min read

В сложной мозаике обработки данных бесшовная коммуникация — это нить, связывающая операции воедино. 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.

  1. Перед началом миграции остановите все операции записи в Milvus.

  2. Выполните операцию FlushALL в Milvus и дождитесь ее завершения. Этот шаг гарантирует, что все ожидающие данные будут сброшены и система готова к завершению работы.

  3. Измените файл конфигурации Milvus, установив mq.type=natsmq и настроив соответствующие параметры в разделе natsmq.

  4. Запустите Milvus 2.3.

  5. Создайте резервную копию и очистите исходные данные, хранящиеся в каталоге rocksmq.path. (Необязательно)

NATS против RocksMQ: сравнение производительности

Тестирование производительности Pub/Sub

  • Платформа тестирования: M1 Pro Chip / память: 16GB

  • Сценарий тестирования: Подписка и многократная публикация случайных пакетов данных в тему до получения последнего опубликованного результата.

  • Результаты:

    • Для меньших пакетов данных (< 64kb) RocksMQ превосходит NATS по использованию памяти, CPU и скорости отклика.

    • Для более крупных пакетов данных (> 64kb) NATS превосходит RocksMQ, обеспечивая гораздо более быстрое время отклика.

Тип тестаMQкол-во операцийстоимость операцииЗатраты памятиОбщее время CPUЗатраты хранилища
5MB*100 Pub/SubNATS501.650328186 s/op4.29 GB85.5825G
5MB*100 Pub/SubRocksMQ502.475595131 s/op1.18 GB81.4219G
1MB*500 Pub/SubNATS502.248722593 s/op2.60 GB96.5025G
1MB*500 Pub/SubRocksMQ502.554614279 s/op614.9 MB80.1919G
64KB*10000 Pub/SubNATS502.133345262 s/op3.29 GB97.5931G
64KB*10000 Pub/SubRocksMQ503.253778195 s/op331.2 MB134.624G
1KB*50000 Pub/SubNATS502.629391004 s/op635.1 MB179.672.6G
1KB*50000 Pub/SubRocksMQ500.897638581 s/op232.3 MB60.42521M

Таблица 1: Результаты тестирования производительности Pub/Sub

Интеграционное тестирование Milvus

Размер данных: 100M

Результат: В ходе обширного тестирования с набором данных из 100 миллионов векторов NATS продемонстрировал меньшую задержку векторного поиска и запросов.

МетрикиRocksMQ (ms)NATS (ms)
Средняя задержка векторного поиска23.5520.17
Запросов векторного поиска в секунду (RPS)2.953.07
Средняя задержка запроса7.26.74
Запросов в секунду (RPS)1.471.54

Таблица 2: Результаты интеграционного тестирования Milvus с набором данных 100m

Набор данных: <100M

Результат: Для наборов данных меньше 100M NATS и RocksMQ демонстрируют схожую производительность.

Заключение: расширение возможностей Milvus с помощью обмена сообщениями NATS

Интеграция NATS в Milvus знаменует значительный шаг вперед в обработке данных. Будь то аналитика в реальном времени, приложения машинного обучения или любой проект с интенсивным использованием данных, NATS обеспечивает вашим проектам эффективность, надежность и скорость. По мере развития ландшафта данных наличие надежной системы обмена сообщениями, такой как NATS, в Milvus обеспечивает бесперебойную, надежную и высокопроизводительную передачу данных.

Обновлено Jul 09, 2026