在Akka流中处理丢弃的消息

时间:2019-03-08 22:48:15

标签: akka akka-stream

我有以下源队列定义。

lazy val (processMessageSource, processMessageQueueFuture) =
   peekMatValue(
      Source
        .queue[(ProcessMessageInputData, Promise[ProcessMessageOutputData])](5, OverflowStrategy.dropNew))


def peekMatValue[T, M](src: Source[T, M]): (Source[T, M], Future[M])  {
    val p = Promise[M]
    val s = src.mapMaterializedValue { m =>
      p.trySuccess(m)
      m
    }  
    (s, p.future)
  }

本质上,过程消息输入数据类是在调用者调用Web服务器终结点时创建的构件,该Web服务器终结点已挂接到该流(即,服务终结点的业务逻辑将消息放入此队列)。进程承诺消息输出是在应用程序接收器的下游完成的事情,然后Web服务器在此将来有on完整回调,以将响应返回。

还有其他进入此流的来源。

现在,由于另一个源可能会使系统过载,因此可以备份缓冲区,从而触发流背压。现有代码只是删除新消息。但是我仍然想完成过程消息输出的承诺,要完成,并声明“ Throttled”之类的异常。

是否有一种机制可以编写自定义溢出策略,或者对允许我执行此操作的溢出元素进行后处理?

1 个答案:

答案 0 :(得分:0)

根据https://github.com/akka/akka/blob/master/akkastream/src/main/scala/akka/stream/impl/QueueSource.scala#L83

dropNew可以正常工作。在客户端,它看起来像。

processMessageQueue.offer(in, pr).foreach { res =>
  res match {
    case Enqueued => // Code to handle case when successfully enqueued. 
    case Dropped => // Code to handle messages that are dropped since the buffier was overflowing. 
  }
}
相关问题