我可以使用Monix的背压机制来确认消息的传递

时间:2018-06-19 13:02:55

标签: scala monix

当我从第三方系统接收消息时,有一种情况可以保证消息的传递。为此,它要求客户端确认每个收到的消息。这种系统的一个示例可能是RibbitMQ。

现在,我知道Monix的Observables中存在背压机制,这立即使我想使用它来确认消息。换句话说,我想创建一个可观察对象,以便当onNext返回Ack.Continue时,我将该消息确认给外部系统。贝娄是我的主意。

Observable.create[Event](OverflowStrategy.Fail(100)) { downstram =>
  externaSystem.subscribe { event =>
    downstram.onNext(event).onComplete {
      case Success(Ack.Continue) => externaSystem.acknowledge(event)
      case _ => externaSystem.reset(event)
    }
  }
  Cancelable { () => externaSystem.stop() }
}

当然,整个想法是避免丢失任何消息,仅当观察者实际返回Ack.Continue时才确认它们。但是,当Monix负责管理可观察对象的背压时,例如当我multicastshare等观察者时,我注意到了几种情况。在这种情况下,原始可观察对象将收到Ack.Continue,而无需等待预期订户的响应。

这一切使我想到了是否真的使用Monix背压机制确认第三方系统上的消息是一个好主意,如果是这样,我是否需要注意一些警告(例如不要multicast这样的观察者)

感谢您的帮助,非常感谢。

0 个答案:

没有答案