一、triproxy 模块介绍

triproxy 其实是一个三端的消息转发器,它包含三个端口,pull、pub 和 dealer,分别对应 zmq 的三种工作模式。triproxy 模块最大的用途是模块的解耦。

二、triproxy 的启动方式

在 STF 中启动了两个 triproxy:tf-triproxy-app 和 stf-triproxy-dev,如果仔细看启动脚本,就会发现这两个 triproxy 除了名字和端口号不一样外其他都一样。

stf triproxy app \
  --bind-pub "tcp://*:7150" \
  --bind-dealer "tcp://*:7160" \
  --bind-pull "tcp://*:7170"

这里感觉没什么好说的,就是指定了三个端口而已。

三、triproxy 源码解读

triproxy 的源码在 lib/units/triproxy/文件夹当中,会发现源码几乎是最少的,事实上一个转发的功能确实不需要太多的代码。

log 就不说了,先看 proxy 方法:

function proxy(to) {
  return function() {
    to.send([].slice.call(arguments))
  }
}

那个 to.send 也是看得的一脸懵 B,至今不知道什么意思,反正就是把一个端口的东西转发到另一个端口,有哪位 node 大神解读一下这篇文章:对 [].slice.call(arguments,1) 的一丢丢见解?

后面两句关键代码就结束了,其他可以无视:

dealer.on('message', proxy(pub))

pull.on('message', proxy(dealer))

意思就是说 dealer 端收到消息以后转发到 pub 端,pull 端收到消息后转发到 dealer 端,感觉也没什么意思。

四、triproxy 应用实践

triproxy 这么好玩的东西当然要实践一下,验证一下前面的功能。

首先建立 push.js、subber.js、dealer.js 三个文件,代码分别是

// push.js 
var zmq = require('zeromq')
  , sock = zmq.socket('push');

sock.connect('tcp://127.0.0.1:7170');
console.log('Push connect to port 7170');

var count = 0
setInterval(function(){
  //console.log('push message ' + count++);
  sock.send('push message ' + count++);
}, 1000);
// subber.js 
var zmq = require('zeromq')
  , sock = zmq.socket('sub');

sock.connect('tcp://127.0.0.1:7150');
sock.subscribe('');
console.log('Subscriber connected to port 7150');

sock.on('message', function(topic, message) {
  console.log('received:', message.toString());
});
// dealer.js 
var zmq = require('zeromq')
  , sock = zmq.socket('dealer');

sock.connect('tcp://127.0.0.1:7160');
console.log('Dealer connected to port 7160');

sock.on('message', function(message) {
  console.log('received:', message.toString());
});

var count = 0
setInterval(function(){
  //console.log('dealer message ' + count++);
  sock.send(['1', 'dealer message ' + count++]);
}, 1000);

然后启动一个 triproxy

stf triproxy app  --bind-pub "tcp://*:7150"  --bind-dealer "tcp://*:7160"  --bind-pull "tcp://*:7170"

然后一起运行三个脚本,就会发现,dealer 能收到 push 的消息,而 subber 能收到 dealer 的消息。

再验证一下前面的 dealer 的特性,同时启动两个 dealer,你会发现同样的消息只会有一个 dealer 接收到。

而启动多个 subber,每个 subber 都会接收到到同样的消息。

如果有兴趣做 STF 的研究,可以看我的资料加我联系方式共同交流😃


↙↙↙阅读原文可查看相关链接,并与作者交流