我一直在阅读 ZeroMQ 文档,我想知道是否有办法使用通配符进行订阅?我需要一个系统,您可以在其中发布类似 ABC 的内容,然后订阅*
A..C 或 AB *
(即订阅*
A..C 将匹配 ABC、AXC、AYC 等上的发布)。
3 回答
直接地?不
,间接的?哦,当然,先生!
方法的ZeroMQ 语法.setsockopt( zmq.SUBSCRIBE, ... )
本身不允许设置其他但前缀匹配的主题过滤器订阅。由于 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)
许多更智能、装饰性、使用上下文的专用迭代器可能有助于将其扩展到简单的设置/丢弃扩展/订阅迭代器,这将满足您的所有需求,所以不要犹豫,继续前进,这是可行的。
ZeroMQPUB/SUB
进行前缀匹配。所以 AB* 很好(在你的例子中将匹配 ABC)。
不支持“就地匹配”,原因很明显(订阅存储在 trie 数据结构中)[ http://www.250bpm.com/blog:19]
您可以在进程中的 zmq 套接字中订阅“”,然后在那里实现更高级的过滤器作为代理执行线程,该代理线程通告接收执行过滤请求的实际 XPUB 套接字。