Ottimizzare la comunicazione dei dati: Milvus adotta la messaggistica NATS
Nell’intricato arazzo dell’elaborazione dei dati, la comunicazione senza interruzioni è il filo che lega insieme le operazioni. Milvus, il pionieristico database vettoriale open-source, ha intrapreso un percorso trasformativo con la sua ultima funzionalità: l’integrazione della messaggistica NATS. In questo post completo del blog, sveleremo le complessità di questa integrazione, esplorandone le funzionalità principali, il processo di configurazione, i vantaggi della migrazione e come si confronta con il suo predecessore, RocksMQ.
Comprendere il ruolo delle code di messaggi in Milvus
Nell’architettura cloud-native di Milvus, la coda di messaggi, o Log Broker, riveste un’importanza fondamentale. È la spina dorsale che garantisce flussi di dati persistenti, sincronizzazione, notifiche di eventi e integrità dei dati durante i ripristini del sistema. Tradizionalmente, RocksMQ era la scelta più immediata nella modalità Standalone di Milvus, soprattutto se confrontato con Pulsar e Kafka, ma i suoi limiti sono diventati evidenti con dati estesi e scenari complessi.
Milvus 2.3 introduce NATS, un’implementazione MQ a nodo singolo, ridefinendo il modo di gestire i flussi di dati. A differenza dei suoi predecessori, NATS libera gli utenti Milvus dai vincoli di prestazioni, offrendo un’esperienza fluida nella gestione di volumi di dati consistenti.
Che cos’è NATS?
NATS è una tecnologia di connettività per sistemi distribuiti implementata in Go. Supporta varie modalità di comunicazione come Request-Reply e Publish-Subscribe tra sistemi, fornisce persistenza dei dati tramite JetStream e offre capacità distribuite tramite RAFT integrato. Puoi consultare il sito ufficiale di NATS per una comprensione più dettagliata di NATS.
Nella modalità Standalone di Milvus 2.3, NATS, JetStream e PubSub forniscono a Milvus solide capacità MQ.
Abilitazione di NATS
Milvus 2.3 offre una nuova opzione di controllo, mq.type, che consente agli utenti di specificare il tipo di MQ che desiderano utilizzare. Per abilitare NATS, imposta mq.type=natsmq. Se vedi log simili a quelli riportati di seguito dopo aver avviato le istanze Milvus, hai abilitato con successo NATS come coda di messaggi.
[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]
Configurazione di NATS per Milvus
Le opzioni di personalizzazione di NATS includono la specifica della porta di ascolto, della directory di archiviazione JetStream, della dimensione massima del payload e del timeout di inizializzazione. La regolazione fine di queste impostazioni garantisce prestazioni e affidabilità ottimali.
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.
Nota:
È necessario specificare
server.portper l’ascolto del server NATS. Se c’è un conflitto di porte, Milvus non può avviarsi. Impostaserver.port=-1per selezionare casualmente una porta.storeDirspecifica la directory per lo storage JetStream. Consigliamo di archiviare la directory in un’unità a stato solido (SSD) ad alte prestazioni per una migliore velocità di lettura/scrittura di Milvus.maxFileStoreimposta il limite superiore della dimensione dello storage JetStream. Il superamento di questo limite impedirà ulteriori scritture di dati.maxPayloadlimita la dimensione del singolo messaggio. Dovresti mantenerlo sopra 5MB per evitare eventuali rifiuti di scrittura.initializeTimeoutcontrolla il timeout di avvio del server NATS.monitorconfigura i log indipendenti di NATS.retentioncontrolla il meccanismo di retention dei messaggi NATS.
Per ulteriori informazioni, consulta la documentazione ufficiale di NATS.
Migrazione da RocksMQ a NATS
La migrazione da RocksMQ a NATS è un processo fluido che prevede passaggi come l’arresto delle operazioni di scrittura, il flush dei dati, la modifica delle configurazioni e la verifica della migrazione tramite i log di Milvus.
Prima di avviare la migrazione, arresta tutte le operazioni di scrittura in Milvus.
Esegui l’operazione
FlushALLin Milvus e attendi il suo completamento. Questo passaggio garantisce che tutti i dati in sospeso vengano scaricati e che il sistema sia pronto per l’arresto.Modifica il file di configurazione di Milvus impostando
mq.type=natsmqe regolando le opzioni pertinenti nella sezionenatsmq.Avvia Milvus 2.3.
Esegui il backup e pulisci i dati originali archiviati nella directory
rocksmq.path. (Opzionale)
NATS vs. RocksMQ: Una sfida prestazionale
Test delle prestazioni Pub/Sub
Piattaforma di test: M1 Pro Chip / Memoria: 16GB
Scenario di test: Sottoscrizione e pubblicazione ripetuta di pacchetti di dati casuali su un topic fino alla ricezione dell’ultimo risultato pubblicato.
Risultati:
Per pacchetti di dati più piccoli (< 64kb), RocksMQ supera NATS in termini di memoria, CPU e velocità di risposta.
Per pacchetti di dati più grandi (> 64kb), NATS supera RocksMQ, offrendo tempi di risposta molto più rapidi.
| Tipo di test | MQ | conteggio op | costo per op | Costo memoria | Tempo totale CPU | Costo storage |
|---|---|---|---|---|---|---|
| 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 |
Tabella 1: Risultati dei test delle prestazioni Pub/Sub
Test di integrazione di Milvus
Dimensione dei dati: 100M
Risultato: In test approfonditi con un dataset di 100 milioni di vettori, NATS ha mostrato una latenza inferiore nella ricerca vettoriale e nelle query.
| Metriche | RocksMQ (ms) | NATS (ms) |
|---|---|---|
| Latenza media della ricerca vettoriale | 23.55 | 20.17 |
| Richieste di ricerca vettoriale al secondo (RPS) | 2.95 | 3.07 |
| Latenza media delle query | 7.2 | 6.74 |
| Richieste di query al secondo (RPS) | 1.47 | 1.54 |
Tabella 2: Risultati dei test di integrazione di Milvus con dataset da 100m
Dataset: <100M
Risultato: Per i dataset inferiori a 100M, NATS e RocksMQ mostrano prestazioni simili.
Conclusione: potenziare Milvus con la messaggistica NATS
L’integrazione di NATS in Milvus segna un significativo passo avanti nell’elaborazione dei dati. Che si tratti di approfondire l’analisi in tempo reale, le applicazioni di machine learning o qualsiasi iniziativa ad alta intensità di dati, NATS offre ai tuoi progetti efficienza, affidabilità e velocità. Con l’evolversi del panorama dei dati, disporre di un sistema di messaggistica robusto come NATS all’interno di Milvus garantisce una comunicazione dei dati fluida, affidabile e ad alte prestazioni.
Continua a leggere

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.

Introducing Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud
We're announcing the general availability of Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud.

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.



