使用eventsByPersistenceId以相反的顺序获取事件源

时间:2016-01-14 21:18:22

标签: scala akka event-sourcing akka-stream akka-persistence

我有PersistentActorpersist个事件,我想以相反的顺序阅读它们。更具体地说,我希望得到一个Source的事件以相反的顺序发出事件。这对于回答有关PersistentActor发生的最后N个事件的查询非常有用。这个问题的正确方法是什么?这些信息应该保存在视图中,还是有一种方法可以反向顺序查询事件?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您的最终目标是"回答有关最近N个事件的查询"然后你可以用circular buffer

写一个扫描流程
import scala.collection.immutable

type CircularBuffer[T] = immutable.Vector[T]

def emptyCircularBuffer[T] : CircularBuffer[T] = immutable.Vector.empty[T]

def addToCircularBuffer[T](maxSize : Int)(buffer : CircularBuffer[T], item : T) : CircularBuffer[T]  =
  if(maxSize > 0)
    buffer.drop(buffer.size - maxSize + 1) :+ item
  else 
    buffer

import akka.stream.scaladsl.Flow

def circularBufferFlow[T](N : Int) = 
  Flow[T].scan(emptyCircleBuffer[T])(addToCircleBuffer[T](N))

此Flow将保存0到N个元素,并在每次更新时发出一个新缓冲区:

Source(1 to 10).via(circularBufferFlow[Int](3))
               .runWith(Sink.foreach(println))

//Vector()
//Vector(1)
//Vector(1, 2)
//Vector(1, 2, 3)
//Vector(2, 3, 4)
//Vector(3, 4, 5)
//...

要专门获取最后一个缓冲区,您可以使用Sink.last将整个流程实现为Future

如果,你的目标是真正反转Stream然后我会认为这是不明智的,因为Stream可能继续无限,这将导致你的缓存最终消耗所有的JVM&# 39;内存和崩溃的应用程序。