Java Akka分布式发布/发布背压
我使用Akka分布式发布/订阅,只有一个发布者和一个订阅者。我的出版商比订户快得多。有没有办法让出版商在某个时间点之后慢下来 发布者代码:Java Akka分布式发布/发布背压,java,akka,publish-subscribe,akka-stream,akka-cluster,Java,Akka,Publish Subscribe,Akka Stream,Akka Cluster,我使用Akka分布式发布/订阅,只有一个发布者和一个订阅者。我的出版商比订户快得多。有没有办法让出版商在某个时间点之后慢下来 发布者代码: public class Publisher extends AbstractActor { private ActorRef mediator; static public Props props() { return Props.create(Publisher.class, () -> new Publisher
public class Publisher extends AbstractActor {
private ActorRef mediator;
static public Props props() {
return Props.create(Publisher.class, () -> new Publisher());
}
public Publisher () {
this.mediator = DistributedPubSub.get(getContext().system()).mediator();
this.self().tell(0, ActorRef.noSender());
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Integer.class, msg -> {
// Sending message to Subscriber
mediator.tell(
new DistributedPubSubMediator.Send(
"/user/" + Subscriber.class.getName(),
msg.toString(),
false),
getSelf());
getSelf().tell(++msg, ActorRef.noSender());
})
.build();
}
}
用户代码:
public class Subscriber extends AbstractActor {
static public Props props() {
return Props.create(Subscriber.class, () -> new Subscriber());
}
public Subscriber () {
ActorRef mediator = DistributedPubSub.get(getContext().system()).mediator();
mediator.tell(new DistributedPubSubMediator.Put(getSelf()), getSelf());
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, msg -> {
System.out.println("Subscriber message received: " + msg);
Thread.sleep(10000);
})
.build();
}
}
不幸的是,按照目前的设计,我认为没有办法向原始发件人提供“背压”。由于您使用将消息发送到
中介
,因此无法获得下游接收器正在备份的信号。这是因为您使用的方法tell
,返回一个void
切换到询问
如果将tell
切换为,则可以设置适当的Timeout
值,该值至少会让您知道在特定持续时间内没有收到响应
切换到流
。因此,通过切换到流实现,您将能够实现期望的目标
如果可以从原始数据创建流,则可以使用从中介创建接收器
,并使用控制流向中介的流量