Como lidar com eventos de arquivo com microservice que expõe uma API REST

5

Um pouco de contexto.

A empresa onde trabalho está começando a fazer a transição para uma arquitetura modular (algo semelhante a microservices) para o nosso principal produto, atualmente monolítico. O primeiro passo é criar um serviço que atualmente não está presente no produto, e queremos construí-lo fora do monolito para parar de aumentar o tamanho e a complexidade dele.

Este componente é um "conector", no sentido de que é algo que deve cuidar de enviar mensagens para partes externas que usam protocolos, padrões e formatos diferentes. Seu objetivo é fornecer uma maneira simples para o cliente interagir com esses serviços externos por meio de API / serviço padronizado. Atualmente nosso produto principal gera as mensagens, mas não se encarrega de enviá-las.

Aqui é onde eu luto. Queremos que este novo conector exponha uma API REST que permitirá ao cliente interagir com ele, para POSTAR uma mensagem para enviá-lo, obter detalhes sobre a mensagem, obter a lista de mensagens enviadas e assim por diante. Tudo isso é bom e bom. O problema é que também queremos que o aplicativo seja capaz de pegar arquivos de um compartilhamento de arquivos e enviá-los, depois mostrar os resultados por meio da API REST. Isso ocorre porque isso é uma melhoria natural em relação ao produto atual: monolito coloca arquivos na pasta X, o conector os pega.

Mas como deve pegá-los? Tenho a sensação de que ter um microserviço acessível por meio do REST e reagir a eventos de arquivos é uma má ideia. O contêiner do servlet cuida de todo o encadeamento ao chamá-lo via REST, então, e os arquivos que seriam capturados por meio do compartilhamento de arquivos? Estamos misturando o compartilhamento de arquivos baseados em eventos e REST síncronos aqui.

Talvez uma ideia melhor seja ter algo que capte os arquivos e POSTE o arquivo para as APIs do conector?

A linguagem escolhida é Java, mas é mais um problema de design!

Obrigado antecipadamente.

    
por GalacticDessert 09.05.2018 / 12:12
fonte

2 respostas

4

A melhor solução é alterar o que for que gera os arquivos para que eles os enviem para sua API, em vez de salvá-los em arquivos.

Isso permite que sua API seja acionada em um novo arquivo sendo adicionado e faça o que for apropriado, ou seja, salve seu conteúdo e metadados em um banco de dados de algum tipo.

Se você não pode mudar a fonte dos arquivos, então sim. Um aplicativo terciário que monitora o diretório e posta os arquivos em resposta a eventos de IO é melhor do que adicionar essa lógica à api.

Em geral, a separação é boa. Algo para ter em mente quando você está falando de uma única API de "conector". Talvez você devesse estar pensando em várias APIs com propósitos mais específicos?

    
por 09.05.2018 / 12:19
fonte
0

Você pode expor os arquivos para suas APIs gerenciadas.

Por exemplo, armazene seus arquivos em um cdn. Com um armazenamento de objeto de arquivo, como os intervalos de armazenamento, você pode armazenar arquivos com permissões diferentes, para que possam ser acessados usando apenas um par {key,client_id} ou, ainda, definir políticas para um filtro ip granulado. Por exemplo, esse recurso mostra como faça isso no S3.

O armazenamento de objetos pode oferecer outras vantagens de uma rede de entrega de conteúdo, como um sistema de arquivos distribuído (muito útil caso os arquivos acessem o mundo todo).

A maneira como você pegaria esses arquivos, permite várias soluções:

Pode-se compartilhar recursos de arquivos protegidos com as APIs adicionando chaves às suas APIs (client_id, key) para que eles possam acessar urls protegidos de arquivos na forma de:

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

Desta forma, você tratará suas APIs como clientes do arquivo cdn.

Outro pode ser o de mascarar o URL, para que os clientes, a fim de obter um arquivo, possam solicitar:

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

No lado da API, internamente, GET o arquivo (localizado em outro lugar) e enviar de volta um fluxo HTTP com o conteúdo do arquivo para o cliente.
Ou, caso você tenha uma API agindo como um dispatcher de solicitação, solicite um fluxo ao serviço de arquivos e encaminhe esse fluxo como resposta.

Mantê-lo simples, geralmente nos dá os melhores resultados.
É possível proteger o URL do arquivo com credenciais controladas que são compartilhadas com suas APIs e definir uma maneira de renovar essas credenciais regularmente.

    
por 10.05.2018 / 12:07
fonte