将基于ack的Actor与akka-stream集成

时间:2015-05-27 10:26:51

标签: akka reactive-programming akka-stream

我有一个设计用于akka-io acking的Actor, 这样它会在向上游发送消息时等待Ack(到 网络)。这个actor是异步应用程序的接口 后端。

我希望有一个包装层,允许我转换它 演员成为akka-streams Flow[Incoming, Outgoing, ???]所以 它可以与期望这样的新库集成 签名。

(来自上游的来信很少见,所以我们也不在乎 很多关于那里的背压,但它不会是一件坏事 拥有它。)

sealed trait Incoming //... with implementations
sealed trait Outgoing //... with implementations
object Ack

// `upstream` is an akka-io connection actor that will send Ack
// when it writes an Outgoing message to the socket
class SimpleActor(upstream: Actor) extends Actor {
  def receive = {
    case in: Incoming if sender() == upstream =>
       // does some work in response to upstream
    case other =>
       // does some work in response to downstream
       // including sending messages to upstream and
       // `becoming` a stashing state waiting for Ack
       // to `unbecome`, then sending Ack downstream
       // (which will respect the backpressure).
  }
}

我从akka-user邮件列表中获得了良好的权限 akka-stream中没有与actor集成的代码 流,并将Actor插入流并保存 基于Ack的背压,必须实施 PushPullStage

似乎我们在这里实际需要两个PushPullStage ...一个 upstream => SimpleActorSimpleActor => upstreamPushPullStage

我的问题是:

  1. 是否有任何库可以在演员和流之间提供诸如此类的集成?
  2. 有没有比从头开始实施双向{% block javascripts %} <script type="text/javascript" src="http://kylemitofsky.com/libraries/libraries/bootstrap-datepicker.js"> </script> <script type="text/javascript"> var nowTemp = new Date(); var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0); var checkin = $('#from').datepicker({ onRender: function(date) { return date.valueOf() < now.valueOf() ? 'disabled' : ''; } }).on('changeDate', function(ev) { if (ev.date.valueOf() > checkout.date.valueOf()) { var newDate = new Date(ev.date) newDate.setDate(newDate.getDate() + 1); checkout.setValue(newDate); } checkin.hide(); $('#to')[0].focus(); }).data('datepicker'); var checkout = $('#to').datepicker({ onRender: function(date) { return date.valueOf() <= checkin.date.valueOf() ? 'disabled' : ''; } }).on('changeDate', function(ev) { checkout.hide(); }).data('datepicker'); </script> {% endblock %} 更简单的方法呢?
  3. 是否有任何现有的测试框架可以对此类实施进行压力测试?

2 个答案:

答案 0 :(得分:5)

我认为akka-stream的理念是提供低级别的砖块并在它们之上构建更高级别的工具。 如果你看一下我们最近发布的开源库https://github.com/MfgLabs/akka-stream-extensions,你会发现我们已经完全做到了。我们提供了一些有用的结构,以便更容易管理速率限制器,有状态处理器,懒惰和放大器。发电机等...... 对于actor集成,我认为应该可以创建某种帮助程序,以便更容易将actor与akka-stream集成,以尝试传播背压。 Akka-Stream还很年轻,生态系统不断发展;)

答案 1 :(得分:1)

是的,您可以将actor与流集成 为此目的有特殊的角色:演员出版商和演员订阅者。

一切都在这里:http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-RC3/scala/stream-integrations.html

当然你必须以这样的方式写演员,它与流背压一起工作。但是你不需要推拉阶段。