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