【问题标题】:Is it possible to know which topic a message was received on in Akka's "Distributed Publish Subscribe in Cluster"?是否可以知道在 Akka 的“集群中的分布式发布订阅”中收到了哪个主题的消息?
【发布时间】:2017-01-31 14:16:42
【问题描述】:

我有一个 Akka 系统,其中的 Actors 代表传感器。每次传感器进行观察时,其对应的 Actor 都会在内部发布/订阅主题上发布该观察。这使得扩展观察的使用变得容易(由一个 Actor 保存在 DB 中,由另一个 Actor 发布到 MQTT 代理等)

让接收者知道它在哪个主题上收到消息的一种可能的解决方案是在消息中包含该主题。然而,这对我来说似乎是糟糕的设计。是否可以在 Akka 的 Actor 中查看当前消息是在哪个主题上接收的?

据我所知,Akka 关于集群中分布式发布订阅 (http://doc.akka.io/docs/akka/current/java/distributed-pub-sub.html) 的文档没有提到这一点。

【问题讨论】:

  • 我不了解 Akka 框架,但在广义的发布者/订阅者消息传递中,可以在消息本身中包含元信息。在这种情况下,元信息的属性可以是逻辑主题名称。现在从设计的角度来看,它可能不是您所说的糟糕的设计,但是,如果逻辑主题名称是动态的,那么 Actor 需要可配置以获取名称,或者如果可发现,则发现它。
  • 我认为将消息发送到的主题包含在消息本身中可能是糟糕的设计的原因是因为它是重复的信息。如果该主题在某处可用,那就是。
  • 复制信息本身并不是一件坏事,如果您采用 DB 更高范式的经典案例,复制信息可以降低系统的复杂性并因此提高可维护性当然可以考虑,这可以在许多系统中都可以实现,但没有发挥作用,因为它使数据检索和查询变得复杂,有时还存在性能瓶颈

标签: java akka distributed publish-subscribe


【解决方案1】:

据我所知,这不是分布式 Pub/Sub 的内置功能。我通常会通过制作某种信封来解决这个问题:

case class PubSubEnvelope[MessageType](topic: String, payload: MessageType)

为了更加安全,也许您想为 MessageType 创建某种超类型以便您可以对其进行约束,并为 topic 创建一些类似枚举的结构,而不是 String

【讨论】:

  • 我设法通过使用 sender() 参考解决了我的问题,因为这适合我的主题结构。但总的来说,这可能是这样做的方法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2020-06-23
相关资源
最近更新 更多