7

いくつかの個別のサービスが ZeroMQ を介して通信するインフラストラクチャ (C) を構築しています。さて、これをすべて高速かつスムーズに実行するために、ZeroMQ を非同期で実行したいと考えています。
ZeroMQ の IO スレッドが既に分離されていることはわかっていますが、同時に複数のタスクを実行したいと考えています。

現時点では、私のパターンは次のようになります。

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

ただし、これには、ブロックする同期ワーカーを設計する必要があります。これを非同期にする唯一の方法は、ワーカー (スレッド) の数を増やすことですが、これはあまりスケーラブルではないようです。

さらに、ワーカーが実行するタスクはそれ自体非同期です (独自のイベント ループを使用)。基本的に、私は次のようなことを達成しようとしています:

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その後、いくつかの操作を実行し、完了すると、コールバック関数が呼び出されます。

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);
}

さて、これを達成する方法はありますか (つまり、2 つのイベント ループを結合する)?

私はすでに DEALER (クライアント) -> ROUTER -> DEALER -> DEALER (ワーカー) を調べましたが、ワーカー側で並行タスクをまだブロックしているため、どちらも機能していないようです。

4

1 に答える 1

2

(クライアント) DEALER<->ROUTER |<->| ROUTER <-> DEALER (worker) この接続パターンでは何もブロックされないため、受信と送信を好きなようにインターリーブできます。

于 2015-09-08T14:23:28.723 に答える