Come gestire gli eventi di file con microservice che espone un'API REST

5

Un po 'di contesto.

L'azienda in cui lavoro sta iniziando a passare a un'architettura modulare (qualcosa di simile ai microservizi) per il nostro prodotto principale, attualmente monolitico. Il primo passo è creare un servizio che al momento non è presente nel prodotto, e vogliamo costruirlo all'esterno del monolite per non aumentare le dimensioni e la complessità di esso.

Questo componente è un "connettore", nel senso che è qualcosa che dovrebbe occuparsi dell'invio di messaggi a parti esterne che utilizzano tutti protocolli, standard e formati diversi. Lo scopo è fornire un modo semplice per il cliente di interagire con questi servizi esterni tramite un servizio / API standardizzato. Attualmente il nostro prodotto principale genera i messaggi, ma non si occupa di inviarli.

Qui è dove faccio fatica. Vogliamo che questo nuovo connettore esponga un API REST che consenta al cliente di interagire con esso, al fine di inviare un messaggio per inviarlo, ottenere dettagli sul messaggio, ottenere l'elenco dei messaggi inviati e così via. Va tutto bene. Il problema è che vogliamo anche che l'applicazione sia in grado di raccogliere file da una condivisione file e inviarli, quindi mostrare i risultati tramite REST API. Questo perché si tratta di un miglioramento naturale rispetto al prodotto corrente: i monoliti posizionano i file nella cartella X, il connettore li preleva.

Ma come dovrebbe raccoglierli? Ho la sensazione che avere un microservizio sia accessibile sia tramite REST che reagire agli eventi dei file sia una cattiva idea. Il contenitore servlet si occupa di tutto il threading quando lo chiama tramite REST, quindi per quanto riguarda i file che verrebbero rilevati tramite condivisione file? Qui stiamo mixando REST sincrono e condivisione file basata su eventi.

Forse un'idea migliore è avere qualcosa che prelevi i file e POST il file alle API del connettore?

Il linguaggio scelto è Java, ma è più un problema di progettazione!

Grazie in anticipo.

    
posta GalacticDessert 09.05.2018 - 12:12
fonte

2 risposte

4

La soluzione migliore è modificare ciò che genera i file in modo che li invii alla tua API anziché salvarli in file.

Ciò consente alla tua API di essere attivata su un nuovo file che viene aggiunto e fa tutto ciò che è appropriato, cioè salva il suo contenuto e i metadati in un database di qualche tipo.

Se non puoi cambiare la fonte dei file, allora si. Un'applicazione terziaria che monitora la directory e pubblica i file in risposta agli eventi di I / O è meglio che aggiungere quella logica all'api.

In generale, la separazione è buona. Qualcosa da tenere a mente quando parli di un singolo "connettore" api. Forse dovresti pensare a più apis con scopi più specifici?

    
risposta data 09.05.2018 - 12:19
fonte
0

Potresti esporre i file alle tue API gestite.

Ad esempio, archivia i tuoi file in un cdn. Con una memoria di oggetti file, come i bucket di archiviazione, è possibile archiviare file con permessi diversi, in modo che potessero essere accessibili solo usando una coppia {key,client_id} , o anche, impostando le politiche per un filtro ip granulare. Ad esempio, questa risorsa ti mostra come fallo su S3.

Lo storage degli oggetti potrebbe offrire altri vantaggi di una rete di distribuzione dei contenuti, come un file system distribuito (molto utile nel caso in cui i file siano accessibili in tutto il mondo).

Il modo in cui raccogli questi file ti consente diverse soluzioni:

Uno potrebbe essere condividere le risorse di file protette con le API aggiungendo chiavi alle tue API (client_id, chiave) in modo che possano accedere a url protetti di file nella forma di:

https://files.anycdn.com/path/to/file.extension?Policy=bnQiOldGF0ZW1lt7IlJl-SaeO27zJXgtYtk&KeyPairId=APKAQADZ7BCN2PFPW8DA

In questo modo tratterai le tue API come client del file cdn.

Un altro potrebbe essere quello di mascherare l'url, quindi i client, per ottenere un file, potrebbero richiedere:

GET https://rest.api/file/endpoint/filename

Nel lato API, internamente, OTTIENI il file (che si trova altrove) e rimandi uno stream HTTP con il contenuto del file al client.
O nel caso in cui tu abbia un'API che agisce come un dispatcher di richieste, richiedi un flusso al servizio file e poi inoltra questo stream come risposta.

Mantengalo semplice, generalmente ci dà i migliori risultati.
È possibile rendere i file URL protetti da credenziali controllate condivise con le tue API e impostare un modo per rinnovare regolarmente queste credenziali.

    
risposta data 10.05.2018 - 12:07
fonte

Leggi altre domande sui tag