【问题标题】:Lamina undo siphon - ClojureLamina 撤消虹吸管 - Clojure
【发布时间】:2012-10-03 21:15:44
【问题描述】:

我正在使用Lamina 来实现一个基本的发布订阅模式。

当客户订阅一个主题时,我为它创建一个新的channel(如果它尚不存在),然后将siphon 它添加到客户的channel。但是,我不知道如何扭转这个让客户退订。我一直在搜索文档和谷歌搜索,但找不到任何东西。

如何撤消 siphon 所做的操作?

【问题讨论】:

    标签: clojure publish-subscribe lamina-clojure


    【解决方案1】:

    您可以fork 虹吸上方的上游通道,然后将下游通道接地,或者如果您的图表允许,您可以关闭不再希望从上游通道虹吸的通道。

    ps:我稍后会尝试添加一个示例...

    【讨论】:

      【解决方案2】:

      通常您会创建一个可以关闭的桥接通道,因此链接是:

      主题频道 -> 桥接频道 -> 客户频道

      在 0.5.0 中,这很容易,因为 siphon 是可变参数:

      (defn cancellable-siphon [src dst]
         (let [bridge (channel)]
           (siphon src bridge dst)
           #(close bridge)))
      

      【讨论】:

      • 最好有一个 receive-all 来执行类似 #(doseq [ch subscribers] (enqueue ch %)) 的操作,或者使用桥接器 channel 引入的开销可以忽略不计?
      • 使用现有原语的消息传播几乎总是比您自己编写的要快(每个额外的节点要遍历大约 70ns)。同样使用enqueue 也不是一个好主意,因为它通过创建隐式而不是显式的消息流来破坏自动关闭行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多