Hello.

I have been experimenting with zmq and now I realize that this zfl library is 
exactly what I need. I'm trying to build classic database client-server 
communication with zmq. 

Here is what I have in my mind. I would appreciate any comments.

---

In my system one client must be tied and communicate with exactly one (and 
always the same) server side process. Trouble here is that my programming 
language has it's own process system and everything runs basically inside one 
operating system process (or thread, I'm not sure). So I have to use poll loop 
in my language. 

Trouble here is:
* If I have for example 50 processes then system performance with 50 poll loops 
would be very bad. Also I want all zmq code in to another operating system 
thread so that I can utilize multiple processors.

My plan:
* Every client and worker sends XREP-XREP message directly to server address.
* Client and worker machines both have 1 server process loop and all the other 
(worker and client) processes are paused
* When servers gets information from zfl that worker (or client) has some 
message already delivered to inproc memory socket then it wakes up that process
* Worker or client reads message from inproc
* Reply does not go back to client zmq socket but to client machine server 
process (using XREP-XREP addresses)

I have some zmq test code ready, but performance is not very good. I have also 
implemented this system with apache apr tcp sockes. It works, but performance 
is not good. Also there is a lot work to do (heartbeat, reconnect) and zmq has 
it all.

Also what I need here is message queue and as I understand zfl handles it.


server pseudo-code:

zmq_plugin_server_start  // starts zfl server in operating system thread
repeat
  prsNum = zmq_plugin_any_messages_incoming() 
     // are there any messages ready in any inproc channel, return client 
process number to wake it up
  if( prsNum > 0 )
    resume process( prsNum ) // wake up sleeping process
  smll sleep // to give time to other processes and not consume all processor 
power
until (quit)
zmq_plugin_server_stop  

Server runs in a tight loop (now about 6% of processor power) and polls if 
there are any messages coming to any workers or clients. This way I need only 
one polling process and other (worker or client) processes are paused until 
they get some new messages.


worker pseudo-code:

zmq_plugin_client_start( myChannel )  // joins to zfl server inproc channel
repeat
  pause process(current process)  // go to sleep = do not consume any resources
  while( zmq_plugin_message_receive( myChannel ) > 0 ) // gets message into my 
language variables
    ... // execute call and prepare replyMessge blob
    zmq_plugin_message_send( myChannel, replyMessge ) 
        // this send message to client machine server address uning zfl and 
inproc channel
  end while
until ( quit )
zmq_plugin_client_stop( myChannel )  // sends "quit" message to client process 
to inform that connection is now closed


client pseudo-code:

zmq_plugin_client_start( myChannel )  // joins to zfl server inproc channel
...
zmq_plugin_message_send( myChannel, requestMessge ) 
pause process(current process)  // go to sleep = do not consume any resources
zmq_plugin_message_receive( myChannel ) 
...
zmq_plugin_client_stop( myChannel ) // sends "quit" message to worker process 
so it can die


Both client and server have one polling server looping for incoming messages 
and waking up paused processes. Client may wake every 0,5 second even if there 
are no messages waiting to inform user about waiting or break after timeout (my 
calls can easily be 30 seconds long). Worker processes are paused until client 
disconnects. 

This way I can have system where you can use client program, close machine, go 
to holiday in Rio and continue using application 3 weeks later anywhere in the 
world (after opening ssh tunnel or something).


Regards,

Pasi Mankinen
Manage Applications
Finland
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to