[zeromq-dev] async client design

Ilja Golshtein ilejncs at narod.ru
Mon Aug 16 15:09:00 CEST 2010


Hello!

  Matt, you are right: it is probably more natural to use UPSTREAM/DOWNSTREAM pair. Although I don't see great difference
between UPSTREAM/DOWNSTREAM pair and one XREQ at client side.
Am I missing something?

  About details.
  Imagine, for example, we are writing a sort of Web crawler.
  It does
- some HTTP downloading (which is slow and we don't want to have a thread per TCP session)
- connect to a Server via 0mq for some processing
  It is rather natural to have communications with the Server in the same eventloop.

  I think I can illustrate my question by Option (2) client implementation. It is here http://pastebin.com/ve5Q6nVp 
(no HTTP or something, just 0mq in eventloop). The server based on "multithreaded server in 10 mins" with minor
modifications http://pastebin.com/2Nwh0x8P .

  My original questions were if a bunch of REQs socket is a problem from performance point of view and if every REQ socket
uses dedicated TCP session. 
Unfortunately answers are Yes and Yes.

  As a conclusion I probably go with Option (1) powered by UPSTREAM/DOWNSTREAM, unless better design is suggested.

Many thanks.



13.08.10, 16:56, "Matt Weinstein" <matt_weinstein at yahoo.com>:

> If the clients are asynchronous you may be using the wrong socket  
>  type, you might look at using PUSH/PULL or PAIR (depending on your  
>  thread configuration), tag each endpoint with per request UUIDs and  
>  junction them into an XREQ with REP servers.  You can keep a count of  
>  requests outstanding by stream and limit it.
>  
>  PAIR requires that the same thread push and pull, whereas PUSH/PULL  
>  you would set up one upstream and one downstream, and your end user  
>  could have a recv thread and a separate send thread if needed (current  
>  restriction).
>  
>  For more suggestions, please send more details about the application ...
>  
>  On Aug 13, 2010, at 7:33 AM, Ilja Golshtein wrote:
>  
>  > Hello!
>  >
>  > I am thinking about single thread client design.
>  >
>  > The server is parallel, some requests are slow, so it must be  
>  > possible to send N+1 request before Nth is processed.
>  > The problem is client have to associate response with request for  
>  > further processing.
>  >
>  > Actually, the option (0) is to send some extra data together with  
>  > request and simply get it back from server, though it is not perfect  
>  > because
>  > of traffic considerations.
>  >
>  > Option (1):
>  > One XREQ socket.
>  > Some storage for extra info (e.g. std::map),
>  > request_id sent as part of a message and returned from server.
>  >
>  >
>  > Option 2:
>  > Pool of REQ sockets.
>  > Some storage for extra info (e.g. std::map EXTRA_INFO>).
>  > When zmq_poll is done, client looks for extra_info based on socket  
>  > fired.
>  >
>  > Please, comment option (2). Is it Ok to have several dozens REQ  
>  > sockets? Is it true this approach
>  > leads to the same number of TCP connections between client and server?
>  >
>  > Suggestions are appreciated.
>  >
>  > Thanks.
>  >
>  > -- 
>  > Best regards,
>  > Ilja Golshtein.
>  > _______________________________________________
>  > zeromq-dev mailing list
>  > zeromq-dev at lists.zeromq.org
>  > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>  
>  _______________________________________________
>  zeromq-dev mailing list
>  zeromq-dev at lists.zeromq.org
>  http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>  
>  

-- 
Best regards,
Ilja Golshtein.



More information about the zeromq-dev mailing list