Akka DistributedPubSubMediator至少一次交付保证发布到主题

时间:2016-05-26 20:50:37

标签: scala akka publish-subscribe

我需要为发布到DistributedPubSubMediator主题的消息提供至少一次的传递保证。

我查看了DistributedPubSubMediator.scala,可以在TopicLike特性(Akka 2.4.6)中看到以下内容:

trait TopicLike extends Actor {
  var subscribers = Set.empty[ActorRef]

  def defaultReceive: Receive = {
    case msg ?
      subscribers foreach { _ forward msg }
  }
}

但是我找不到任何从mediator检索订阅者集的方法......如果有一个消息请求GetTopicSubscribers会将这些信息暴露给中介客户端,那就太棒了:

mediator ! GetTopicSubscribers("mytopic")

因此,在发布主题后,发布者可以等待来自所有活动订阅者的Ack消息。有没有其他方法来完成这样的事情? 如果能以某种方式将akka.contrib.pattern.ReliableProxy插入到DistributedPubSubMediator中,那将会很棒。

1 个答案:

答案 0 :(得分:0)

您可以让发布商通过akka.cluster.pubsub.DistributedPubSubMediator.CountSubscribers(“ myTopic”)向中介者询问订阅者人数

然后,它只需要统计从订阅者那里收到的Ack消息的数量即可。

无需跟踪实际订户或确认了哪些订户,当您的Ack计数达到订户计数时,您就知道他们已经全部收到(感谢Akka最多一次的交付可靠性)

但是请注意source code中的此评论:

// Only for testing purposes, to poll/await replication
case object Count
final case class CountSubscribers(topic: String)

建议CountSubscribers也许不是太依赖吗?