Otimizando a comunicação de dados: Milvus adota o sistema de mensagens NATS
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.portpara a escuta do servidor NATS. Se houver um conflito de porta, o Milvus não poderá iniciar. Definaserver.port=-1para selecionar uma porta aleatoriamente.storeDirespecifica 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.maxFileStoredefine o limite superior do tamanho de armazenamento do JetStream. Exceder esse limite impedirá novas gravações de dados.maxPayloadlimita 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.monitorconfigura os logs independentes do NATS.retentioncontrola 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.
Antes de iniciar a migração, interrompa todas as operações de gravação no Milvus.
Execute a operação
FlushALLno 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.Modifique o arquivo de configuração do Milvus definindo
mq.type=natsmqe ajustando as opções relevantes na seçãonatsmq.Inicie o Milvus 2.3.
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 Teste | MQ | contagem de op | custo por op | Custo de memória | Tempo Total de CPU | Custo de armazenamento |
|---|---|---|---|---|---|---|
| 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 |
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étricas | RocksMQ (ms) | NATS (ms) |
|---|---|---|
| Latência média de busca vetorial | 23.55 | 20.17 |
| Solicitações de busca vetorial por segundo (RPS) | 2.95 | 3.07 |
| Latência média de consulta | 7.2 | 6.74 |
| Solicitações de consulta por segundo (RPS) | 1.47 | 1.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.
Continue lendo

Notion's Vector Search Is Excellent. Their Next Problem Is Harder.
Notion solved vector search scaling in two years. The next bottleneck — offline context engineering, unified data, and the real-time/offline gap — is harder.

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.



