我猜,这是一个常见问题,但我会尝试描述我当前的问题。
我有一个基本服务,我们将其命名为“CoreService”,它提供我会说的“主要”功能:处理数据库中的数据(我们的应用程序中有一个集中式数据库)。还有许多其他应用程序,其中一些具有用于本地目的的自己的数据库。还有一个简单的“NotificationService”。它的目的是向不同的订阅者广播消息。
通常,此 NotificationService 从“ExternalWorld”调用并将通知发送到不同的服务(其中包括“CoreService”)。
今天我看到有必要从“CoreService”中调用“NotificationService”。
我在这里担心的是我引入了循环依赖:NotificationService 需要知道如何向每个服务发送消息(包括“CoreService”,因此它需要了解“CoreService”接口(interface),因此它需要引用“CoreService” ) 和“CoreService”需要向“NotificationService”发送消息(所以它也需要引用它)......循环依赖......
问题:我们应该如何构建我们的架构来处理这样的问题?
非常感谢!
最佳答案
您必须从点对点切换到调解器。 Mediator 现在将负责将源绑定(bind)到目标并适本地路由/发布消息(ESB 在我脑海中响起)。
说明
您不会直接从 NotificationService 引用 CoreService,反之亦然。两者都将 订阅 到他们感兴趣的 主题 。例如,CoreService 将事件发布到 NotificationService 将订阅的主题(并且 CoreService 还将订阅 NotificationService 将 事件发布到的主题)。然后,主题处理程序(消息系统或 ESB 等)负责将事件转发给给定主题的所有订阅者。通过这种方式,服务彼此松散耦合,甚至不需要知道它们的存在。
目前,您将 NotificationService 用作中介器/ESB,因此如果您愿意,可以将其作为基础设施服务,因此会出现循环依赖等问题。它不再是一项业务服务。
关于architecture - SOA 中的循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4787897/