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

Scala 我可以使用Monix';s的背压机制来确认消息的传递,scala,monix,Scala,Monix,当我从第三方系统接收消息时,我会遇到这样的情况,这保证了消息的传递。为了做到这一点,它需要客户端确认每个接收到的消息。这种系统的一个例子可能是RibbitMQ 现在,我知道在Monix的Observables中存在背压机制,这立即让我想用它来确认消息。换句话说,我想创建一个可观察的,这样当onNext返回Ack.Continue时,我向外部系统确认该消息。下面是我的想法的简单概述 Observable.create[Event](OverflowStrategy.Fail(100)) { dow

当我从第三方系统接收消息时,我会遇到这样的情况,这保证了消息的传递。为了做到这一点,它需要客户端确认每个接收到的消息。这种系统的一个例子可能是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负责管理一个可观察对象的背压时,例如,当我
多播
共享
等时,观察者。在这种情况下,原始可观察对象接收到
Ack。在不等待预期订户响应的情况下继续

这一切都让我想到了一个问题:使用Monix背压机制在第三方系统上确认消息是否是一个好主意,如果是这样,我需要注意什么(比如不要
多播
这样的观察者)


我将感谢您的帮助,并非常感谢您的帮助。

您不能真的将背压用于此目的。背压仅管理管道内容物,直至背压状态发生变化的下一阶段。要正确地向供应商确认信息,您必须理解“已交付”的含义。