可以在ZeroMQ中使用主题吗?

可以在ZeroMQ中使用主题吗?,zeromq,nats.io,Zeromq,Nats.io,我有一个小项目要实施 代码如下: import * as NATS from '../node_modules/nats' // for typescript var nats = require('nats'); var config = require('./config'); var opt: NATS.ClientOpts = {'noRandomize': false, 'reconnect': true, 'maxReconnectAttempts':

我有一个小项目要实施
代码如下:

import * as NATS from '../node_modules/nats'              // for typescript
var nats = require('nats');

var config = require('./config');
var opt: NATS.ClientOpts = {'noRandomize': false, 'reconnect': true, 
'maxReconnectAttempts': -1, 'servers':config.nat.servers, 'user': 
config.nat.user , 'pass': config.nat.pass };
var nc: NATS.Client = nats.connect(opt);

nc.on('error', function(e) {
    console.error('Error nats: ' + e);
});

nc.on('close', function() {
    console.error('CLOSED nats');
});

nc.subscribe('serviceA', { 'queue': 'A' }, function (request, replyTo) {
    console.debug('I exec serviceA via nats:');
    j = JSON.parse(request);
    console.debug(j);
    let ok = {"res": "i am response for service A"}
    nc.publish(replyTo, JSON.stringify(ok));
}

let cmd = '{"a": 5, "b": "i am sample"}';
nc.requestOne('serviceA', cmd, {}, 15000, function (response) {
    if (response.code && response.code === nats.REQ_TIMEOUT) {
        console.error('server timeout');
        console.error(response.code);
    } else {
        console.log('A see this response: ' + response);
    }
});

nc.subscribe('serviceB', { 'queue': 'B' }, function (request, replyTo) {
    console.debug('I exec serviceB via nats:');
    j = JSON.parse(request);
    console.debug(j);
    let ok = {"res": "i am response for service B"}
    nc.publish(replyTo, JSON.stringify(ok));
}

let cmd = '{"c": 5, "d": "i am sample"}';
nc.requestOne('serviceB', cmd, {}, 15000, function (response) {
    if (response.code && response.code === nats.REQ_TIMEOUT) {
        console.error('server timeout');
        console.error(response.code);
    } else {
        console.log('B see this response: ' + response);
    }
});
如您所见,队列
上有两个服务-
服务A
和队列
服务B
上有两个客户端:第一个调用服务A,第二个调用服务B

NATS实现主题(
'serviceA'
'serviceB'

现在,我想尝试使用ØMQ转换示例。我发现使用ZeroMQ的示例类似

但我找不到这方面的样品

也许ØMQ使用
路由器
来实现一个主题

您能帮我在ZeroMQ示例中实现主题吗?

Q:可以在ZeroMQ中使用主题吗?
a:是的,它是: 长话短说-不需要任何
zmq.ROUTER
来完成这项工作,只需使用
PUB/SUB
正式模式即可

注意:ZeroMQ套接字()-实例不是您所知道的tcp套接字

最佳
阅读[]部分中的主要概念差异

出版商方面:
导入zmq
aCtx=zmq.Context()
aPub=aCtx.Socket(zmq.PUB)
aPub.bind(“tcp://123.456.789.012:3456" )
aPub.setsockopt(zmq.LINGER,0)
aPub.setsockopt(zmq.,)
i=0
尽管如此:
尝试:
发送(“ServiceA:[{0:}>12d}]一条问候世界的信息。”.format(i))
aPub.send(“维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护)
如果(i==(2*(i/2)),则发送(“ServiceB::[{0:{12d}]另一条消息…”。格式(i/2)))否则通过
睡眠(1);i+=1
除键盘中断外:
打印(“--<将退出>--”)
打破
打印(“--<将终止ZeroMQ资源>--”)
aPub.close()
aCtx.术语()
用户端:
导入zmq
aCtx=zmq.Context()
aSub=活动插座(zmq.SUB)
aSub.connect(“tcp://123.456.789.012:3456" )
aSub.setsockopt(zmq.LINGER,0)
aSub.setsockopt(zmq.SUBSCRIBE,“ServiceA”)#主题('ServiceA'和'serviceB')
aSub.setsockopt(zmq.SUBSCRIBE,“ServiceB”)#请参见下面的评论
##请参阅API订阅管理详细信息
#
##另一个“维度”
##加入ingress
##来自多个来源
#Sub.connect(“:/:”)
#问:可以在ZeroMQ中使用主题吗?
a:是的,它是: 长话短说-不需要任何
zmq.ROUTER
来完成这项工作,只需使用
PUB/SUB
正式模式即可

注意:ZeroMQ套接字()-实例不是您所知道的tcp套接字

最佳
阅读[]部分中的主要概念差异

出版商方面:
导入zmq
aCtx=zmq.Context()
aPub=aCtx.Socket(zmq.PUB)
aPub.bind(“tcp://123.456.789.012:3456" )
aPub.setsockopt(zmq.LINGER,0)
aPub.setsockopt(zmq.,)
i=0
尽管如此:
尝试:
发送(“ServiceA:[{0:}>12d}]一条问候世界的信息。”.format(i))
aPub.send(“维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护性维护)
如果(i==(2*(i/2)),则发送(“ServiceB::[{0:{12d}]另一条消息…”。格式(i/2)))否则通过
睡眠(1);i+=1
除键盘中断外:
打印(“--<将退出>--”)
打破
打印(“--<将终止ZeroMQ资源>--”)
aPub.close()
aCtx.术语()
用户端:
导入zmq
aCtx=zmq.Context()
aSub=活动插座(zmq.SUB)
aSub.connect(“tcp://123.456.789.012:3456" )
aSub.setsockopt(zmq.LINGER,0)
aSub.setsockopt(zmq.SUBSCRIBE,“ServiceA”)#主题('ServiceA'和'serviceB')
aSub.setsockopt(zmq.SUBSCRIBE,“ServiceB”)#请参见下面的评论
##请参阅API订阅管理详细信息
#
##另一个“维度”
##加入ingress
##来自多个来源
#Sub.connect(“:/:”)

#我不明白我不能在您的示例中看到主题('serviceA'和'serviceB')Janka,ZeroMQ订阅机制是硬连线的,从API v.2.1+到最近的v.4.?。+作为从左到右的消息负载字符串匹配。知道这一点,可以实现任何布尔逻辑,但必须遵守硬连线规则。主题过滤有点复杂,最初的API使用子端主题过滤器(是的,这意味着将所有消息传递给所有子端,它们将自行决定)。最近的一个API将管道更改为发布端主题过滤,增加了发布端上下文()-实例的工作负载,该实例必须处理所有进程+缓冲区负载。注意:ZeroMQ套接字()-实例不是您所知道的tcp套接字。最佳阅读>>>@Janka中[ZeroMQ hierarchy in in in in in in in the five seconds]一节中的主要概念差异您是否介意回顾针对您发布的问题提供的所有帮助和咨询,并根据StackOverflow社区实践的定义,选择+奖励提供的最佳答案?这很公平,不是吗?我不明白我不能在你的例子中看到主题(“serviceA”和“serviceB”)。Janka,ZeroMQ订阅机制是硬连线的,从API v.2.1+到最近的v.4.?。+作为从左到右的消息负载字符串匹配。知道这一点,可以实现任何布尔逻辑,但必须遵守硬连线规则。主题过滤有点复杂,最初的API使用子端主题过滤器(是的,这意味着将所有消息传递给所有子端,它们将自行决定)。最近的一个API改变了铅垂
import zmq
aCtx = zmq.Context()
aPub = aCtx.Socket( zmq.PUB )
aPub.bind( "tcp://123.456.789.012:3456" )
aPub.setsockopt(    zmq.LINGER,   0 )
aPub.setsockopt(    zmq.<whatever needed to fine-tune the instance>, <val> )
i = 0
while true:
      try:
         aPub.send( "ServiceA::[#{0:_>12d}] a Hello World Message.".format( i ) )
         aPub.send( "ServiceABCDEFGHIJKLMNOPQRSTUVWXYZ........" )
         aPub.send( "ServiceB::[#{0:_>12d}] another message...".format( i  / 2 ) ) if ( i == ( 2 * ( i / 2 ) ) ) else pass
         sleep( 1 ); i += 1

      except KeyboardInterrupt:
          print( "---< will exit >---" )
          break
print( "---< will terminate ZeroMQ resources >---" )
aPub.close()
aCtx.term()
import zmq
aCtx = zmq.Context()
aSub = aCtx.Socket( zmq.SUB )
aSub.connect( "tcp://123.456.789.012:3456" )
aSub.setsockopt( zmq.LINGER, 0 )
aSub.setsockopt( zmq.SUBSCRIBE, "ServiceA" ) # Subject ( 'serviceA' and 'serviceB' ) 
aSub.setsockopt( zmq.SUBSCRIBE, "ServiceB" ) # Kindly see the comments below
#                                            # Kindly see API on subscription management details
#
#                                            # Yet another "dimension"
#                                            #     to join ingress
#                                            #     from multiple sources
#Sub.connect( "<transport-class>://<addr>:<port>" )
#              <transport-class :: { inproc | ipc | tcp | pgm | epgm | vmci }
#   .connect()-s the same local SUB-AccessPoint to another PUB-side-AccessPoint
#                to allow the PUB/SUB Scalable Formal Communication Archetype Pattern
#                join a message flow from different source PUB-sides
#Sub.setsockopt( zmq.SUBSCRIBE, "ServiceZ" )

while true:
      try:
          print( "<<< (((_{0:s}_)))".format( aSub.recv() ) )
      except KeyboardInterrupt:
          print( "---< will exit >---" )
          break

print( "---< will terminate ZeroMQ resources >---" )
aSub.close()
aCtx.term()