我一直在阅读ZeroMQ文档,我想知道是否有办法使用外卡订阅?我需要一个系统,您可以在ABC上发布,然后订阅A。*
。C或AB *
(即A。*
上的订阅.C将匹配出版物ABC,AXC,AYC等。
答案 0 :(得分:0)
ZeroMQ PUB/SUB
执行前缀匹配。所以A.B. *很好(在你的例子中将匹配A.B.C)
由于显而易见的原因(订阅存储在特里数据结构中),不支持“就地匹配”[http://www.250bpm.com/blog:19]
答案 1 :(得分:0)
.setsockopt( zmq.SUBSCRIBE, ... )
方法的ZeroMQ语法本身不允许设置其他但前缀匹配的主题过滤器订阅。由于Martin SUSTRIK和Pieter HINTJENS多次提到的性能原因,过滤内部使用的技术不允许更复杂的字符串/解析。
一个有趣的事情来自于这样的副作用 - 人们无法避免扩展的字符串,超出主题过滤器长度,从积极匹配,从而被传递。
这并不意味着,我们将放弃。众所周知,ZeroMQ可以运行数千种物品,所以让我们利用魔法的这一面。
"A.*.C"
?一种方法可能是使用一种相当幼稚(温和)的力量并“机械地”设置正式过滤器“A。*。C”的所有可能的“扩展” - 即:
for aWildcardToEXPAND_item in ( "A", "B", "C", "D", ... ): # all legal expansions
aSUB.setsockopt( zmq.SUBSCRIBE, "A.{0:%s}.C".format( aWildcardToEXPAND_item ) )
pass; # just-SEQ life is great & so forgiving :o)
许多方式更智能,装饰,使用上下文的专用迭代器可能有助于将其扩展到简单的设置/丢弃扩展/订阅迭代器,这将满足您的所有需求,所以不要犹豫,前进,它是可行的。
答案 2 :(得分:0)
您可以在进程中的 zmq 套接字中订阅 "",然后在那里实现更高级的过滤器,作为代理执行线程,广告接收执行过滤请求的实际 XPUB 套接字。