いくつかの個別のサービスが 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 (ワーカー) を調べましたが、ワーカー側で並行タスクをまだブロックしているため、どちらも機能していないようです。