我有一个使用负载均衡器的服务,以便向外部公开某个 IP。我使用 Metallb 因为我的集群是裸机。
在集群内部,运行的应用程序执行与 zmq 套接字(TCP 类型)的绑定,例如:
m_zmqSock->bind(endpoint);
哪里
endpoint = tcp://127.0.0.1:1234
和
m_zmqSock = std::make_unique<zmq::socket_t>(*m_zmqContext,zmq::socket_type::pair);
m_zmqSock->setsockopt(ZMQ_RCVTIMEO,1);
然后从本地计算机中的应用程序(可以访问集群)我尝试连接并发送如下数据:
zmqSock->connect(zmqServer);
哪里
zmqServer = tcp://192.168.49.241:1234
和
zmq::context_t ctx;
auto zmqSock = std::make_unique<zmq::socket_t>(ctx,zmq::socket_type::pair);
知道如何使 zmq 套接字从主机连接以将数据发送到应用程序并接收响应吗?
问:“知道如何使 zmq 套接字从我的主机连接以将数据发送到应用程序并接收响应吗?”
让我们制定一个工作计划:
PUSH-PULL
模式,由具有规则间隔的时间戳消息的 aPushSIDE->send(...)
从集群端馈送,还使用那里的资源节省设置,使用 aPushSIDE->setsockopt( ZMQ_COMPLETE,... )
和 aPushSIDE->setsockopt( ZMQ_CONFLATE,... )
localhost
的 PULL
-end recv()
-s 定期更新,请随时添加从本地主机到集群托管代码的上游链接,再次使用 PUSH-PULL
模式反方向。为什么这里有一对
PUSH-PULL
-s?
首先,它有助于隔离问题的根本原因。接下来,它允许您分离关注点并独立于任何其他流控制每个流(具有许多互连、不同流、不同优先级和不同错误处理过程的控制循环的详细信息对于所有人来说都是如此常见,只有非
recv()
方法的阻塞形式以及对测试新消息到达所花费(浪费)的最大允许时间进行多级poll()
方法的软控制超出了本问答文本的范围 -请随意在 this 正式事件处理框架以及使用低级套接字监视器 diagnostics )中进一步寻求。
最后但并非最不重要的一点是,在我与 ZeroMQ 相关的大部分时间里(从 v2.1 开始,是的,这么久),ZeroMQ 原生 API 文档中将
PAIR-PAIR
原型报告为 “实验性”。接受这个事实,我从未在任何其他传输类上使用过PAIR
原型,除了纯RAM、网络协议无堆栈inproc:
“连接”(实际上不是任何连接,而是一个零复制,几乎零延迟智能纯指针到内存块在一些同进程协作线程之间传递技巧)。