【问题标题】:ZeroMQ pub-sub categories: are wild cards possible for multiple subscriptions?ZeroMQ pub-sub 类别:多个订阅是否可以使用通配符?
【发布时间】:2013-03-21 07:18:58
【问题描述】:

我一直在阅读 ZeroMQ 文档,我想知道是否有办法使用通配符进行订阅?我需要一个系统,您可以在其中发布类似 A.B.C 的内容,然后订阅 A.*.C 或 A.B.*(即订阅 A.*.C 将匹配 A.B.C、A.X.C、A.Y.C 上的出版物,等)。

【问题讨论】:

    标签: zeromq publish-subscribe


    【解决方案1】:

    直接?不。
    间接?哦,当然,先生!

    .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】:

      ZeroMQ PUB/SUB 进行前缀匹配。所以 A.B.* 很好(在您的示例中将匹配 A.B.C)。
      不支持“就地匹配”,原因很明显(订阅存储在 trie 数据结构中)[http://www.250bpm.com/blog:19]

      【讨论】:

      • ZeroMQ 似乎不支持基于类别或类型的订阅,仅支持基于内容的订阅。提供给http://www.250bpm.com 的链接对我没有用。
      【解决方案3】:

      您可以在进程中的 zmq 套接字中订阅“”,然后在那里实现更高级的过滤器作为代理执行线程,该代理线程通告接收执行过滤请求的实际 XPUB 套接字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        相关资源
        最近更新 更多