La ricerca tra i dati attraversa diversi microservizi


13

Ho i dati per un determinato dominio distribuito tra un microservizio e un database legacy. Ho una ricerca che si estende su campi sia su database legacy che su microservizi. In precedenza (prima della suddivisione del microservizio), veniva eseguito con 1 query sql. Ora ho bisogno di una chiamata REST e una query al database legacy per servire questa funzionalità di ricerca. Stiamo parlando di alcuni milioni di file qui. Come posso modellarlo al meglio? A causa del volume di dati, di solito la chiamata REST restituisce risultati impaginati. L'approccio ingenuo per eseguire una chiamata SQL e combinare e unire i risultati con la risposta REST è troppo lento e non molto pratico.

Risposte:


21

Una funzione di ricerca può essere modellata come un servizio separato con responsabilità distinta dai due servizi citati. Pertanto, l'approccio qui potrebbe essere quello di creare un nuovo servizio ("ricerca") e di archiviare una copia dei dati da entrambi i servizi in una forma che sia facile da indicizzare e cercare, possibilmente anche denormalizzata al fine di dare rapidamente risultati in il formato desiderato.

Quindi, ad esempio, potresti avere il database SQL legacy utilizzando ad esempio mySql, l'altro microservizio utilizzando ad esempio MongoDB e il nuovo servizio di ricerca utilizzando elasticsearch con i dati di entrambi già incollati insieme (denormalizzati) per un accesso più conveniente. ovviamente i dettagli dipenderanno dal tipo di ricerche che devi eseguire.

I dati dei due servizi dovrebbero essere trasferiti in modo asincrono all'indice di ricerca tramite un bus di eventi come Kafka o Hermes al fine di aumentare la produttività e ridurre l'accoppiamento tra i servizi. Una modifica in uno dei due servizi invierebbe un evento che informa il servizio di ricerca di aggiornare anche i suoi dati.

Naturalmente c'è il costo di un ulteriore ritardo tra i cambiamenti nei servizi e nel servizio di ricerca, ma poiché i microservizi sono generalmente utilizzati in sistemi distribuiti, alcuni ritardi e incoerenze temporanee sono inevitabili comunque. Avere un servizio aggiuntivo e utilizzare l'archiviazione aggiuntiva per una copia di dati che è già presente negli altri due servizi è anche un costo tipico di avere un sistema altamente distribuito e scalabile che utilizza microservizi.


Ho già pensato alla creazione di un servizio separato. L'unica cosa che mi dà un po 'di disagio: creare un altro database solo per la ricerca (alimentarlo con l'elastico sarebbe un'altra opzione, ma abbiamo alcuni colli di bottiglia nell'infrastruttura)
senseiwu,

7
@zencv Sfortunatamente, i microservizi hanno costi come questo. Essere in grado di ridimensionare orizzontalmente significa che l'accoppiamento deve essere debole e ciò significa che spesso ci sarà la duplicazione dei dati. Ottieni anche molto più traffico di rete. La scalabilità spesso implica un calo delle prestazioni per unità hardware e la scelta di un'architettura piuttosto che di un'altra (ad es. Microservizi vs monolito) deve tenere conto di questo compromesso.
Michał Kosmulski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.