一个简单的合并组合(如下)有时会在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])
答案 0 :(得分:1)
Source.actorRef
的文档对此非常清楚:
可以使用0的
bufferSize
禁用缓冲区,然后在不需要时丢弃接收到的消息 从下游。当bufferSize
为0时,overflowStrategy
无关紧要。之后添加异步边界 这个来源;因此,永远不能断定下游总会产生需求。
问题是源和合并阶段之间的异步边界。合并阶段确实提供了无限的需求,但是异步边界类型使它传播到源的速度变慢。
您可以在源中使用缓冲区(增加bufferSize),也可以在适当的情况下使用其他源,例如Source.queue
,因为它不会引入异步边界