Otimizando a comunicação de dados: Milvus adota o sistema de mensagens NATS

Oct 11, 20235 min read

Na intricada tapeçaria do processamento de dados, a comunicação fluida é o fio que une as operações. Milvus, o pioneiro banco de dados vetorial open-source, embarcou em uma jornada transformadora com seu recurso mais recente: integração de mensageria NATS. Nesta publicação abrangente do blog, vamos desvendar as complexidades dessa integração, explorando seus principais recursos, processo de configuração, benefícios de migração e como ela se compara à sua predecessora, RocksMQ.

Entendendo o papel das filas de mensagens no Milvus

Na arquitetura nativa em nuvem do Milvus, a fila de mensagens, ou Log Broker, tem importância fundamental. Ela é a espinha dorsal que garante fluxos de dados persistentes, sincronização, notificações de eventos e integridade dos dados durante recuperações do sistema. Tradicionalmente, o RocksMQ era a escolha mais direta no modo Milvus Standalone, especialmente quando comparado ao Pulsar e ao Kafka, mas suas limitações se tornaram evidentes com grandes volumes de dados e cenários complexos.

O Milvus 2.3 introduz o NATS, uma implementação de MQ de nó único, redefinindo como gerenciar fluxos de dados. Diferentemente de seus predecessores, o NATS liberta os usuários do Milvus das restrições de desempenho, proporcionando uma experiência fluida ao lidar com volumes substanciais de dados.

O que é NATS?

NATS é uma tecnologia de conectividade de sistemas distribuídos implementada em Go. Ela oferece suporte a vários modos de comunicação, como Request-Reply e Publish-Subscribe, entre sistemas, fornece persistência de dados por meio do JetStream e oferece recursos distribuídos por meio do RAFT integrado. Você pode consultar o site oficial do NATS para uma compreensão mais detalhada do NATS.

No modo Milvus 2.3 Standalone, NATS, JetStream e PubSub fornecem ao Milvus recursos robustos de MQ.

Habilitando o NATS

O Milvus 2.3 oferece uma nova opção de controle, mq.type, que permite aos usuários especificar o tipo de MQ que desejam usar. Para habilitar o NATS, defina mq.type=natsmq. Se você vir logs semelhantes aos abaixo após iniciar as instâncias do Milvus, você habilitou com sucesso o NATS como fila de mensagens.

[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]

Configurando o NATS para o Milvus

As opções de personalização do NATS incluem especificar a porta de escuta, o diretório de armazenamento do JetStream, o tamanho máximo do payload e o tempo limite de inicialização. Ajustar essas configurações garante desempenho e confiabilidade ideais.

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.

Observação:

  • Você deve especificar server.port para a escuta do servidor NATS. Se houver um conflito de porta, o Milvus não poderá iniciar. Defina server.port=-1 para selecionar uma porta aleatoriamente.

  • storeDir especifica o diretório para o armazenamento do JetStream. Recomendamos armazenar o diretório em uma unidade de estado sólido (SSD) de alto desempenho para melhor taxa de transferência de leitura/gravação do Milvus.

  • maxFileStore define o limite superior do tamanho de armazenamento do JetStream. Exceder esse limite impedirá novas gravações de dados.

  • maxPayload limita o tamanho de mensagens individuais. Você deve mantê-lo acima de 5MB para evitar quaisquer rejeições de gravação.

  • initializeTimeoutcontrola o tempo limite de inicialização do servidor NATS.

  • monitor configura os logs independentes do NATS.

  • retention controla o mecanismo de retenção das mensagens do NATS.

Para obter mais informações, consulte a documentação oficial do NATS.

Migrando do RocksMQ para o NATS

Migrar do RocksMQ para o NATS é um processo contínuo que envolve etapas como interromper operações de gravação, descarregar dados, modificar configurações e verificar a migração por meio dos logs do Milvus.

  1. Antes de iniciar a migração, interrompa todas as operações de gravação no Milvus.

  2. Execute a operação FlushALL no Milvus e aguarde sua conclusão. Esta etapa garante que todos os dados pendentes sejam descarregados e que o sistema esteja pronto para o desligamento.

  3. Modifique o arquivo de configuração do Milvus definindo mq.type=natsmq e ajustando as opções relevantes na seção natsmq.

  4. Inicie o Milvus 2.3.

  5. Faça backup e limpe os dados originais armazenados no diretório rocksmq.path. (Opcional)

NATS vs. RocksMQ: Um Confronto de Desempenho

Teste de Desempenho Pub/Sub

  • Plataforma de Teste: Chip M1 Pro / Memória: 16GB

  • Cenário de Teste: Assinar e publicar pacotes de dados aleatórios em um tópico repetidamente até que o último resultado publicado seja recebido.

  • Resultados:

    • Para pacotes de dados menores (< 64kb), o RocksMQ supera o NATS em relação à memória, CPU e velocidade de resposta.

    • Para pacotes de dados maiores (> 64kb), o NATS supera o RocksMQ, oferecendo tempos de resposta muito mais rápidos.

Tipo de TesteMQcontagem de opcusto por opCusto de memóriaTempo Total de CPUCusto de armazenamento
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

Tabela 1: Resultados do teste de desempenho Pub/Sub

Teste de Integração do Milvus

Tamanho dos dados: 100M

Resultado: Em testes extensivos com um conjunto de dados de 100 milhões de vetores, o NATS demonstrou menor latência de busca e consulta vetorial.

MétricasRocksMQ (ms)NATS (ms)
Latência média de busca vetorial23.5520.17
Solicitações de busca vetorial por segundo (RPS)2.953.07
Latência média de consulta7.26.74
Solicitações de consulta por segundo (RPS)1.471.54

Tabela 2: Resultados do teste de integração do Milvus com conjunto de dados de 100m

Conjunto de dados: <100M

Resultado: Para conjuntos de dados menores que 100M, NATS e RocksMQ apresentam desempenho semelhante.

Conclusão: Fortalecendo o Milvus com mensagens NATS

A integração do NATS ao Milvus marca um avanço significativo no processamento de dados. Seja explorando análises em tempo real, aplicações de machine learning ou qualquer iniciativa intensiva em dados, o NATS fortalece seus projetos com eficiência, confiabilidade e velocidade. À medida que o cenário de dados evolui, ter um sistema de mensagens robusto como o NATS dentro do Milvus garante uma comunicação de dados fluida, confiável e de alto desempenho.

Atualizado em Jul 09, 2026