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

Build Multimodal Search for 3D Assets with Tripo and Zilliz Cloud
Generate 3D assets with Tripo, then search them by text, image, and metadata with multimodal embeddings and Zilliz Cloud.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

Similarity Metrics for Vector Search
Exploring five similarity metrics for vector search: L2 or Euclidean distance, cosine distance, inner product, and hamming distance.



