当我从第三方系统接收消息时,有一种情况可以保证消息的传递。为此,它要求客户端确认每个收到的消息。这种系统的一个示例可能是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负责管理可观察对象的背压时,例如当我multicast
,share
等观察者时,我注意到了几种情况。在这种情况下,原始可观察对象将收到Ack.Continue
,而无需等待预期订户的响应。
这一切使我想到了是否真的使用Monix背压机制确认第三方系统上的消息是一个好主意,如果是这样,我是否需要注意一些警告(例如不要multicast
这样的观察者)
感谢您的帮助,非常感谢。