Estou desenvolvendo uma solução baseada em wcf para uma camada de serviço da web que dispositivos móveis "conectados ocasionalmente" usarão. O serviço não usará filas (neste estágio) devido às complexidades adicionais e, portanto, estará operando uma abordagem simples de Solicitação / Resposta.
Obviamente, sendo um dispositivo móvel, é possível que os dispositivos fiquem sem sinal no meio da inserção / atualização. O próprio serviço da web pode ter concluído a transação, mas o cliente nunca receberá esta mensagem. Por isso, ele reenviará a solicitação, quando o servidor precisará reconhecê-la como uma solicitação duplicada e retornará a mesma resposta que tentou na primeira instância.
Por isso, estou tentando tornar os serviços idempotentes. Para conseguir isso, estou implementando objetos DTO do Request Paramter, que consistem no RequestID, além dos parâmetros necessários para concluir a chamada.
No entanto, minha dificuldade está em implementar uma maneira de monitorar os IDs de solicitação. Desde que o serviço esteja atualmente sem estado, a única maneira que eu posso imaginar atualmente é ter uma tabela ServiceRequest no banco de dados, que tomará o RequestID como primário. Obviamente, consultar isso indicará se a solicitação já foi acionada, pois o cliente enviará o mesmo RequestID. Mas o serviço também precisa saber qual mensagem enviar. No caso de uma inserção / atualização, o ID raiz agregado afetado também precisará ser armazenado em algum lugar, diretamente na tabela de solicitação ou em uma tabela RequestToObjectLookup
Então, eu estou querendo saber se existe uma maneira de práticas recomendadas de implementar isso? Meu pensamento é ter uma tabela ServiceRequest (específica para o serviço), que armazena solicitações, informações adicionais e também uma pesquisa no ID do objeto de resultado (em um salvar / inserir / atualizar). Portanto, quando uma nova solicitação entra, essa tabela pode ser consultada antes de prosseguir com o restante da solicitação, seja para executar o salvamento ou apenas retornar o objeto atualizado anteriormente (que foi acionado na primeira tentativa de solicitação).
Também estou pensando (como declarado) que só preciso manter o ID agregado raiz referenciado com a solicitação, pois só devo usar os relacionamentos para obter o restante das informações.
fonte