私は、いくつかの別個のサービスがZeroMQを通じて通信するインフラストラクチャ(C言語)を構築しています。今、このすべてを高速でスムーズに動かすために、私はZeroMQを非同期で実行したいと思っています。
私はZeroMQのIOスレッドが既に分離されていることを知っていますが、私は同時に複数のタスクを実行したいと思います。現時点でZeroMQ:非同期返信
は、私のパターンは次のようになります。
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つのイベントループを組み合わせる方法はありますか?
私はすでにディーラー(クライアント) - >ルーター - >ディーラー - >ディーラー(ワーカー)を調べましたが、ワーカー側で並行タスクがブロックされているため、どちらも機能していないようです。
私は本当にあなたの設定に問題が表示されません。 ZMQは、ソケットとのユーザー側の対話を除いて、常に非同期で実行されます。それらをブロックしたくない場合は、ノンブロッキングモードを使用して実行可能なソケットをポーリングすることができます。 – djc