Tenho a seguinte situação pra debater a respeito, tenho uma lista de hoteis afiliados que disponibilizam uma API Rest para consulta de quartos disponíveis com base nas datas de entrada e saída do hóspede. Vamos pensar que esses endpoints são padronizados e devolvem a response no mesmo formato, sempre.
Tenho uma API que vai receber como parâmetro do usuário as datas de entrada e saída. Em seguida, preciso disparar de uma só vez as requisições para cada um dos endpoints dos afiliados em busca dos quartos disponíveis em cada um deles. Porém, tenho um requisito não funcional no meio do caminho: a requisição que durar mais que 1 minuto pra ter resposta é ignorada. Logo, as N requisições devem ser feitas de forma independentes, ou seja, se uma delas der erro,somente ela é ignorada. Se a requisição demorar mais do que 1 minuto, somente a que demorou é ignorada.
Eis que surge o problema, qual é a melhor forma de trabalhar com um requisito desses? Como definir que o rempo de response deve ser menor ou igual a um minuto? Como disparar N consultas ao mesmo tempo, capturar todas as respostas e montar uma response única pro usuário?
Bom, inicialmente pensei em trabalhar com tópicos JMS, uma vez que a requisição do usuário poderia gerar um Publisher enviando o broadcast pra todos os Receivers, no caso os afiliados. Dessa forma eu mato o problema de reuquisitar todos ao mesmo tempo, além de definir que as mensagens que não forem tratadas em 5 segundos são ignoradas. Mas é possível definir o tempo de processamento da resposta? Como eu pegaria o retorno de cada receiver e montaria um response único para o usuário, ou seja, uma lista contendo todos os quartos dos afiliados xpto. Essa é uma boa arquitetura para este problema?
Um outro ponto de vista me levou a pensar num processamento batch pra esta requisição, mas como nunca usei, sequer imagino se é viável. Porém, as nuances que li sobre o assunto implementado no JEE 7 me parece um pouco dentro do contexto, uma vez que posso ter um JobOperator fazendo o processamento particionado da requisição. Mas volto aos mesmos questionamentos: como tratar o tempo de resposta? eu consigo moldar o chunk para capturar os itens processados durante um checkpoint, por exemplo, e montar uma lista? E no final de tudo isso, como unificar o resultado dos N chunks?
Não espero uma resposta com solução pronta ou coisa do tipo, pois o intuito dessa pergunta é mais fazer um brainstorm e avaliar possíveis arquiteturas para a solução do problema. Quem sabe a partir daí o papo evolua pra dúvidas mais hands-on.
Sendo assim, peço que quem puder contribuir com ideias, mesmo que no final elas não façam tanto sentido, por favor, postem!