- Клиенты (REQ) — Маршрутизатор — Прокси — Дилер - Рабочие (REP)
- Маршрутизатор привязан к inproc-адресу
- Дилер привязан к TCP-адресу (0.0.0.0:5555)
- Работники расположены удаленно.
Предполагая, что я не могу изменить существующую программу, есть ли способ реализовать эту функциональность?
Текущую структуру можно проиллюстрировать следующей схемой:

Текущая структура кода (C++) следующая:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
void Proxy(zmq::context_t& context)
{
zmq::socket_t clients { context, zmq::socket_type::router };
zmq::socket_t workers { context, zmq::socket_type::dealer };
clients.bind("inproc://router");
workers.bind("tcp://0.0.0.0:5555");
zmq::proxy(clients, workers);
}
void Client(zmq::context_t& context)
{
using namespace std::chrono_literals;
zmq::socket_t socket { context, zmq::socket_type::req };
socket.connect("inproc://router");
for (;;)
{
socket.send(zmq::str_buffer("some request"));
zmq::message_t reply;
socket.recv(reply);
spdlog::trace("reply: {}", reply.to_string());
std::this_thread::sleep_for(1s);
}
}
void Worker(zmq::context_t& context) // actually located remotely
{
zmq::socket_t socket { context, zmq::socket_type::rep };
socket.connect("tcp://localhost:5555");
for (;;)
{
zmq::message_t request;
socket.recv(request);
spdlog::trace("request: {}", request.to_string());
socket.send(zmq::str_buffer("some reply"));
}
}
int main()
{
zmq::context_t context { 1 };
std::jthread proxy { Proxy, std::ref(context) };
std::vector workers;
for (int i = 0; i < 4; ++i)
{
workers.emplace_back(Worker, std::ref(context));
}
std::vector clients;
for (int i = 0; i < 4; ++i)
{
clients.emplace_back(Client, std::ref(context));
}
return 0;
}
Например, я создал структуру Маршрутизатор — Прокси — Дилер в моя программа подключила дилера к существующему адресу дилера (0.0.0.0:5555) и попыталась отправить запросы на маршрутизатор.
Хотя запрос был отправлен, похоже, что рабочие не получают запрос. (Используя Wireshark, я подтвердил, что запросы отправляются дилеру, но дилер не пересылает запросы работникам.)
Есть ли способ добиться этого без реализации связи через сокеты с нуля?
Спасибо за помощь!
Подробнее здесь: https://stackoverflow.com/questions/785 ... oc-address