Pergunta

semântica Na RPC, onde Erlang tem esperança para o melhor, SUN RPC com pelo menos uma vez-e Java RMI com at-mais-uma vez, mas ninguém tem exatamente uma vez semântica.

Por que parece inviável ter exatamente uma vez semântica?

Por exemplo, se o cliente continua a reenviar um pedido exclusivamente marcado até que uma resposta é recebida e um servidor mantém o controle de todos os pedidos tratados de forma a não duplicar um pedido. Isso não seria exatamente uma vez?

Foi útil?

Solução

Considere o que acontece se o servidor trava entre a realização do pedido e gravação que realizou o pedido?

Você pode obter a-mais-uma vez, gravando o pedido, em seguida, levá-lo para fora. se você receber um acidente entre os dois, então você (erroneamente) registrou-o como realizado, assim você não vai fazê-lo novamente. Daí a-mais-uma vez

Curiosamente, este (com tempos de espera) é patenteado: http://www.freepatentsonline.com/7162512 .html . Exceto como defendo acima, ele não garante exatamente-uma vez.

Você começa a-menos-uma vez por realizá-la, em seguida, gravá-la. Se você receber um acidente entre os dois, você vai realizá-lo novamente se o pedido é repetido.

Mas não é realmente viável para dizer "exatamente uma vez" em todas as circunstâncias

(Há cenários semelhantes para erros de rede em vez de servidor trava)

Outras dicas

High-end ônibus de mensagens, como http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.csqzau.doc IBM de WebSphere MQ Do significado a oferta exatamente uma vez entrega. Na verdade, este é o comportamento padrão (como da última vez que eu usei WMQ ...). Eles conseguir isso com registros write-ahead e uma variedade de técnicas de bloqueio.

É claro, eu não tenho dúvida de que em algum lugar em seus documentos legais enterrado "exatamente uma vez" é realmente definido para significar "mensagem pode ou não pode ser entregue, uma vez, mais de uma vez. Ou lotes. Ou menos do que zero ". a fim de cobrir as costas, mas ela não funciona na grande maioria dos casos, inclusive expulsando os cabos de alimentação, tendo eixos de infraestrutura de rede, etc.

Eu acho que a resposta é que você precisaria de um período indefinido de tempo para obter esses semântica, porque o cliente teria que esperar por um resultado definitivo a partir do servidor, que pode nunca chegar. Essa exigência é impraticável em redes reais.

Se o cliente nunca desiste de tentar (ou se o servidor vai para baixo por um período prolongado, quer antes de completar a transação, ou antes de sinalização que é completa, dependendo do que pedir que ele faz essas coisas), então pode haver nenhuma maneira para o cliente para saber se o pedido foi recebido e tratado. Na prática, os sistemas de RPC podem, por exemplo, queremos respeitar o tempo limite padrão TCP, por isso não quero ter que esperar por um sucesso definitivo ou o fracasso do servidor.

Isso é uma suposição que:. Eu nunca ter projetado um protocolo RPC

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top