Akka流actor-conflation-ratelimit-actor会丢弃前几条消息(有时)

时间:2019-03-29 15:51:59

标签: scala akka akka-stream reactive-streams backpressure

一个简单的合并组合(如下)有时会在staartup打印一条调试消息,说它是由于需求为零而丢弃消息。 我希望合并阶段可以提供无限的需求,因此上述情况绝对不可能。我想念什么?

val sourceRef = Source.actorRef[KeyedHighFreqEvent](0, OverflowStrategy.fail)
.conflateWithSeed(...into hash map...)
.throttle(8, per = 1.second, maxBurst=24, ThrottleMode.shaping)
.mapConcat(...back to individual KeyedHighFreqEvent...)
.groupedWithin(1024, 1.millisecond)
.to(Sink.actorRef(networkPublisher, Nil))
.run()

system.eventStream.subscribe(sourceRef, classOf[KeyedHighFreqEvent])

1 个答案:

答案 0 :(得分:1)

Source.actorRef的文档对此非常清楚:

  

可以使用0的bufferSize禁用缓冲区,然后在不需要时丢弃接收到的消息   从下游。当bufferSize为0时,overflowStrategy无关紧要。之后添加异步边界   这个来源;因此,永远不能断定下游总会产生需求。

问题是源和合并阶段之间的异步边界。合并阶段确实提供了无限的需求,但是异步边界类型使它传播到源的速度变慢。

您可以在源中使用缓冲区(增加bufferSize),也可以在适当的情况下使用其他源,例如Source.queue,因为它不会引入异步边界