Ottimizzare la comunicazione dei dati: Milvus adotta la messaggistica NATS

Oct 11, 20235 min read

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.port per l’ascolto del server NATS. Se c’è un conflitto di porte, Milvus non può avviarsi. Imposta server.port=-1 per selezionare casualmente una porta.

  • storeDir specifica 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.

  • maxFileStore imposta il limite superiore della dimensione dello storage JetStream. Il superamento di questo limite impedirà ulteriori scritture di dati.

  • maxPayload limita la dimensione del singolo messaggio. Dovresti mantenerlo sopra 5MB per evitare eventuali rifiuti di scrittura.

  • initializeTimeoutcontrolla il timeout di avvio del server NATS.

  • monitor configura i log indipendenti di NATS.

  • retention controlla 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.

  1. Prima di avviare la migrazione, arresta tutte le operazioni di scrittura in Milvus.

  2. Esegui l’operazione FlushALL in 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.

  3. Modifica il file di configurazione di Milvus impostando mq.type=natsmq e regolando le opzioni pertinenti nella sezione natsmq.

  4. Avvia Milvus 2.3.

  5. 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 testMQconteggio opcosto per opCosto memoriaTempo totale CPUCosto storage
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

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.

MetricheRocksMQ (ms)NATS (ms)
Latenza media della ricerca vettoriale23.5520.17
Richieste di ricerca vettoriale al secondo (RPS)2.953.07
Latenza media delle query7.26.74
Richieste di query al secondo (RPS)1.471.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.

Aggiornato il Jul 09, 2026