ZeroMQ:传输桥接转发代理--模式

Posted youdud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZeroMQ:传输桥接转发代理--模式相关的知识,希望对你有一定的参考价值。

一、需求情况
?MQ用户的1个通常要求是:“我怎么使用X技术连接我的?MQ网络?”。这其中X是某种其它网络或通信技术
简洁明了的答案是构建1个“桥梁”。桥指的是1个小型应用程序,它用一种协议与1个套接字交流,并将其转换成为另1个套接字的另一种协议。假如你喜欢,还可以将之称为1个协议解释器。?MQ中1个通常的桥接问题是对接两种传输协议或网络
二、演示典型案例
现在我们编写1个小型代理,它位于1个发布者和1组订阅者之间,对接两个网络:
前端接口(SUB)应对着驻留了天气服务器的内部网络,而后端(PUB)应对着外部网络上的订阅者
它在前端套接字上订阅气象服务,并在后端套接字上重新发布数据

 

这个转发代理非常类似于早期代理的例子,但关键的部分在于,前端和后端套接字在两个不同的网络上。例如,我们可以留用这个模型将多播网络(pgm传输协议)连接到一个TCP发布者


代码如下
下面是转发代理的代码,其中使用了zmq_proxy()接口来定义代理,非常简洁

// wuproxy.c
#include <stdio.h>
#include <zmq.h>
int main(){
// 1.创建新的上下文
void *context = zmq_ctx_new();

// 2.前端套接字, 用于连接内部的天气服务器
void *frontend = zmq_socket(context, ZMQ_XSUB);
zmq_connect(frontend, "tcp://localhost:5556");

// 3.后端套接字, 用来处理外部的订阅者的请求
void *backend = zmq_socket(context, ZMQ_XPUB);
zmq_bind(backend, "tcp://111.229.177.161:8100");

// 4.持续运行代理 zmq_proxy(frontend, backend, NULL);

// 5.关闭套接字、清除上下文
zmq_close(frontend);
zmq_close(backend);
zmq_ctx_destroy(context);

return 0;
}

编译运行如下
gcc -o wuproxy wuproxy.c -lzmq

 

运行如下:

上方的是发布者(wuserver.c),运行在内部,其绑定的地址是“tcp://*:5556”
中间的是代理(就是上面的wuproxy.c),也运行在内网。其连接到发布者localhost:5556上,并绑定外网地址111.229.177.161:8100上(由于我们使用的是腾讯的云服务器,云服务器编写服务器程序绑定时只能使用0.0.0.0,因此其实际绑定的地址是0.0.0.0:8100)
最下面的是订阅者(wuclient.c),运行在外网,其连接到代理111.229.177.161:8100上

 

以上是关于ZeroMQ:传输桥接转发代理--模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ZeroMQ 的 REQ-REP 模式中获取请求者的公共 IP?

zeromq怎样获取已经绑定的socket节点

使用 ZeroMQ 实现消息总线

zeromq所谓的“无锁消息队列”实现

zeroMq中pub-sub和push-pull模式的区别

是啥导致 ZeroMQ 中的“传输端点未连接”?