networking - sintaxis - ¿Por qué es exactamente una vez la semántica inviable?
semantica html5 ejemplos (3)
Considere lo que sucede si el servidor falla entre la realización de la solicitud y la grabación de que ha llevado a cabo la solicitud.
Puede obtener como máximo una vez registrando la solicitud y luego llevándola a cabo. si consigues un choque entre los dos, entonces (erróneamente) lo registraste como llevado a cabo, por lo que no lo volverás a hacer. Por lo tanto a lo más una vez
Curiosamente, este (con tiempos de espera) está patentado: http://www.freepatentsonline.com/7162512.html . Excepto como argumento arriba, no garantiza exactamente una vez.
Obtienes al menos una vez llevándolo a cabo y luego grabándolo. Si consigues un choque entre los dos, lo llevarás a cabo nuevamente si la solicitud se repite.
Pero no es realmente posible decir "exactamente una vez" en todas las circunstancias
(Hay escenarios similares para errores de red en lugar de fallos del servidor)
En semántica de RPC donde Erlang tiene la esperanza de lo mejor, SUN RPC con al menos una vez y Java RMI con a lo sumo pero ninguna tiene exactamente una vez semántica.
¿Por qué no parece factible tener exactamente una vez semántica?
Por ejemplo, si el cliente sigue reenviando una solicitud etiquetada de forma exclusiva hasta que se recibe una respuesta y un servidor realiza un seguimiento de todas las solicitudes gestionadas para no duplicar una solicitud. ¿No sería eso exactamente una vez?
Creo que la respuesta es que necesitarías un tiempo indefinido para obtener esa semántica, porque el cliente tendría que esperar un resultado definitivo del servidor, que tal vez nunca llegue. Ese requisito no es práctico en redes reales.
Si el cliente alguna vez deja de intentarlo (o si el servidor deja de funcionar durante un período prolongado antes de completar la transacción, o antes de indicar que está completo, dependiendo del orden en que lo hace), entonces no habrá forma de que el cliente saber si la solicitud fue recibida y manejada. En la práctica, los sistemas RPC pueden, por ejemplo, querer respetar los tiempos de espera de TCP predeterminados, por lo que no quieren tener que esperar un éxito o falla definitiva del servidor.
Sin embargo, eso es una suposición: nunca he diseñado un protocolo RPC.
Los buses de mensajería de alta gama, como WebSphere MQ de IBM, pretenden ofrecer exactamente una entrega. De hecho, este es el comportamiento predeterminado (como la última vez que utilicé WMQ ...). Lo logran con registros Write-ahead y una variedad de técnicas de bloqueo.
Por supuesto, no dudo que enterrado en algún lugar de sus documentos legales, "exactamente una vez" en realidad se define como "mensaje que puede o no entregarse, una vez, más de una vez. O lotes. O menos de cero". con el fin de cubrir sus espaldas, pero funciona en la gran mayoría de los casos, incluyendo expulsar los cables de alimentación, llevar los ejes a la infraestructura de la red, etc.