2013-03-09 9 views
7

Ich baue eine Infrastruktur (in C), wo mehrere separate Dienste über ZeroMQ kommunizieren. Um dies alles schnell und reibungslos laufen zu lassen, möchte ich, dass ZeroMQ asynchron läuft.
Ich weiß, dass ZeroMQ IO-Thread bereits getrennt ist, aber ich möchte mehrere Aufgaben gleichzeitig ausführen.ZeroMQ: asynchrone Antworten

Im Moment sieht mein Muster wie folgt aus:

Client -> REQ  | /\ 
Router -> ROUTER | | 
--- proxy --- | | 
Dealer -> DEALER | | 
Workers-> REP  \/--| 

Doch diese mir erfordert eine Blockierung zu entwerfen, Synchron Arbeiter. Die einzige Möglichkeit, dieses asynchrone Verfahren durchzuführen, besteht darin, die Anzahl der Worker (Threads) zu erhöhen, aber das scheint mir nicht sehr skalierbar zu sein.

Darüber hinaus sind die Aufgaben, die die Arbeiter ausführen, asynchron (mit ihrer eigenen Ereignisschleife). Also im Grunde, ich suche so etwas zu erreichen:

void *socket = zmq_socket(context, ZMQ_REP); 
zsocket_connect(socket, "inproc://backend"); 

while (1) { 
    zmq_msg_t request; 
    zmq_msg_init(&request); 
    zmq_msg_recv(&request, socket, 0); 
    zmq_msg_close(&request); 

    do_something(callback, socket); 
} 

do_something würde dann einige Operationen durchführen, und wenn es fertig ist, wird die Callback-Funktion aufgerufen.

void callback(void *data, void *socket) { 
    zmq_msg_t reply; 
    zmq_msg_init_size(&reply, 5); 
    memcpy(zmq_msg_data(&reply), "World", 5); 
    zmq_msg_send(&reply, socket, 0); 
    zmq_msg_close(&reply); 
} 

Nun, gibt es eine Möglichkeit, dies zu erreichen (d. H. Zwei Ereignisschleifen zu kombinieren)?

Ich habe schon in DEALER (Client) -> ROUTER -> HÄNDLER -> HÄNDLER (Arbeiter) nachgeschaut, aber das scheint auch nicht zu funktionieren, weil es immer noch gleichzeitige Aufgaben am Arbeiterende blockiert.

+2

Ich sehe das Problem mit Ihrer Einrichtung wirklich nicht. ZMQ läuft immer asynchron, abgesehen von der Interaktion mit den Sockets auf der Benutzerseite. Wenn Sie nicht möchten, dass diese blockiert werden, können Sie einen nicht blockierenden Modus verwenden und nach umsetzbaren Sockets suchen. – djc

Antwort

2

(Kunde) HÄNDLER < -> ROUTER | < -> | ROUTER < -> HÄNDLER (Arbeiter) In diesem Verbindungsmuster wird nichts blockiert, daher können Sie empfangen und senden, wie Sie wollen.