将基于ack的Actor与akka流集成

将基于ack的Actor与akka流集成,akka,reactive-programming,akka-stream,Akka,Reactive Programming,Akka Stream,我有一个演员被设计来和akka io acking合作, 这样,它将在向上游发送消息时等待Ack(到 网络)。此参与者是中异步应用程序的接口 后端 我想有一个包装层,允许我转换这个 参与者进入akka流流[传入、传出,?]以便 它可以与期望实现这种功能的较新库集成 签名 (来自上游的传入消息很少,所以我们也不在乎 很多关于反压力的事情,但这不是一件坏事 有了它。) 我从akka用户邮件列表中得到了很好的授权 akka streams中没有将参与者与 流,并且为了将参与者插入流并保留 基于Ack的

我有一个演员被设计来和akka io acking合作, 这样,它将在向上游发送消息时等待Ack(到 网络)。此参与者是中异步应用程序的接口 后端

我想有一个包装层,允许我转换这个 参与者进入akka流
流[传入、传出,?]
以便 它可以与期望实现这种功能的较新库集成 签名

(来自上游的传入消息很少,所以我们也不在乎 很多关于反压力的事情,但这不是一件坏事 有了它。)

我从akka用户邮件列表中得到了很好的授权 akka streams中没有将参与者与 流,并且为了将参与者插入流并保留 基于Ack的背压,必须实施

看起来我们实际上需要两个
PushPullStage
s在这里。。。一 对于
上游=>SimpleActor
上游=>SimpleActor
各一个

我的问题是:

  • 有没有提供参与者和流之间的集成的库
  • 有没有比从头开始实现双向
    PushPullStage
    更简单的方法
  • 是否有任何现有的测试框架允许对这种实现进行压力测试

  • 是的,您可以将参与者与流集成。
    有专门的参与者用于此目的:参与者发布者和参与者订阅者

    都在这里:


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

    我认为akka stream的理念是提供低级砖块,并在其上构建高级工具。 如果你看看我们最近发布的开源库,你会发现我们已经做到了。我们提供了一些有用的结构,使其更容易管理速率限制器、有状态处理器、惰性和生成器等。。。
    对于参与者集成,我认为应该可以创建一些助手,以便更容易地将参与者与试图传播背压的akka流集成。Akka溪流仍然年轻,生态系统不断增长;)

    这听起来比引入一个新阶段并实现它的方法要简单得多。我本来希望避免编写中间角色,但现在看来这是唯一的出路——同时实现发布者和订阅者。这将是很多样板文件:-/您是否尝试过使用actor ask和
    mapAsync
    ?如果没有,那么编写
    PushPullStage
    仍然比编写
    ActorProcessor
    @jrudolph容易得多,但我对查询没有一个响应(如果是这样的话,我会使用REST而不是WebSockets)。出版商可以在任何时候发送消息。我猜“在任何时候”的意思是,只要背压允许就可以了?这到底是怎么回事?如果你为每一个输入元素产生一个输出流,你可以用这种方式建模,然后将流展平。是的,当背压允许的时候。这不是一个查询/响应协议,客户机和服务器可以随时互相发送消息(网络允许)。啊,所以输入和输出通道完全分开,背压也必须分开处理?
    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).
      }
    }