[zeromq-dev] Client-Server synchronization with timeout

Christopher Jakob cja at domdv.de
Tue Aug 9 15:54:32 CEST 2011


Hello,

for a business application I would like to use ZMQ with kind of a 
two-way commited protocoll:
A req/rep between server and client that is guaranteed that the 
transmitted changes are processed either on both or on none of the systems.
The abort-condition of the req/rep is a timeout, that means, that the 
client needs the reply in a certain time frame  otherwise the request 
has to be
reverted or dropped, depending on how far the server has processed the 
request. The dimension of the timeouts a talk about is about 300-500ms.

Example:
A client sends a login request. The server checks certain settings and 
then changes the state of the user in the database to "logged in".
If the server needs to long to process, or network latency is too high, 
the client aborts the login, e.g. showing a timeout message.
Now the server has to rollback the change to the database, otherwise the 
client would appear as "logged in" in the database although it isn't,
and a further login request would result in wrong behaviour.

In the documentation I found the different pirate patterns, which are 
able to detect timouts, but unfortunatelly only from the clients point 
of view.
The worst case using those patterns would be the client sending a 
request, the server doing a change to a database, but not answering fast
enough, would lead to inconsistent data between client and server.  If 
the server would be able to detect a client closing the connection,
that would solve my problem, because then I could use the lazy pirate 
pattern, simply closing the socket if the server is too slow.
The server would recognize the closing socket and know that he has to 
rollback the possibly done changes.
I thought that would be the easiest way to inform the server about being 
too late, but unfortunatelly did not found a way to recognize client
socket shutdown with the API.

Another possibility would be to implement a kind of 3-way handshake:
Client sending a request -> server sending reply -> client answering 
with ack or nack depending whether the reply was in time or not.
But then I have to deal with possible loss of ACK and NACK messages, 
which leads me to a chicken-or-the-egg-dilemma...

Any help or comments would be really appreciated

Kind regards
Christopher



More information about the zeromq-dev mailing list