如何使用Akka BoundedMailBox限制生产商

如何使用Akka BoundedMailBox限制生产商,akka,backpressure,Akka,Backpressure,我有两个参与者,一个是制作消息,另一个是以固定速率消费消息 是否可以让consumers BoundedMailBox限制生产者?(背压) “我的制作人”当前是定期计划的(向其发送勾号消息),是否有办法通过消费者邮箱中的可用性进行计划 我正在使用fire-and-forget样式(consumer.tell()),因为我不需要响应。我应该使用不同的邮件发送方法吗?只需指定一个邮箱限制,如果邮箱已满,它就会被阻止。 我自己也没有试过,但是这个帖子里的人都在观察这个行为,他们都发现当邮箱达到极限时,

我有两个参与者,一个是制作消息,另一个是以固定速率消费消息

是否可以让consumers BoundedMailBox限制生产者?(背压)

“我的制作人”当前是定期计划的(向其发送勾号消息),是否有办法通过消费者邮箱中的可用性进行计划


我正在使用fire-and-forget样式(consumer.tell()),因为我不需要响应。我应该使用不同的邮件发送方法吗?

只需指定一个邮箱限制,如果邮箱已满,它就会被阻止。 我自己也没有试过,但是这个帖子里的人都在观察这个行为,他们都发现当邮箱达到极限时,这个演员就会拦截

有关此性质的讨论和更多测试,请参见此处。

从这个线索:

object ProducerConsumer extends App {

  implicit val system = ActorSystem("ProducerConsumer")

  def waitFor(actor: ActorRef) {
    Await.ready(gracefulStop(actor, 5.seconds), 5.seconds)
  }

  val consumers = system.actorOf(Props[Consumer].
    withRouter(RoundRobinRouter(4)).
    withDispatcher("consumer-dispatcher"), "consumer")

  for (work <- generateWork)
    consumers ! work

  consumers ! PoisonPill
  waitFor(consumers)
  system.shutdown
}

把技术放在一边,如果消费者和生产者都是人,他们将如何解决同样的问题?@ViktorKlang,我可以通过启动/停止消息实现消费者的流量控制通道。但是,有时内置流量控制,如ZMQ推/拉通道。我正在寻找一种高吞吐量/低延迟的管道体系结构,在这种体系结构中,消息将是每秒~4k和~20k条消息。所以,如果可能的话,我想避免流量控制反馈通道。没有控制反馈,就不会有任何背压。好的,所以流量控制需要是显式通道。我试图了解这种类型的管道通常是如何在akka中实现的。另外,当BoundedMailBox处于其绑定(已满)状态时写入时会发生什么情况?(消息是否已丢弃?)它最多会在“邮箱推送超时时间”内阻止调用线程,然后进入死信状态。我不建议使用有边界的邮箱,因为延迟和吞吐量都会受到影响,您可能会面临死锁等风险。请使用基于拉动或确认的方法进行流量控制。
consumer-dispatcher {
  type = BalancingDispatcher
  mailbox-capacity = 100
}