【发布时间】:2011-01-17 16:08:04
【问题描述】:
我发现自己负责开发一个我最初没有设计的系统,并且不能问最初的设计师为什么做出某些设计决定,因为他们不再在这里。我是一名设计问题的初级开发人员,所以当我开始这个项目时,我真的不知道该问什么,这是我的第一个 SOA/WCF 项目。
系统有 7 个 WCF 服务,将增长到 9 个,每个都自托管在单独的控制台应用程序/Windows 服务中。它们都是单实例和单线程的。所有服务都具有相同的 OperationContract:它们公开了 Register() 和 Send() 方法。当客户端服务想要连接到另一个服务时,它们首先调用 Register(),然后如果成功,它们会全部使用 Send() 进行其余的通信。我们有一个 DataContract,它有一个枚举 MessageType 和一个 Content 属性,它可以包含其他 DataContract “有效负载”。服务对消息的处理由枚举 MessageType 确定...一切都通过 Send() 方法,然后被路由到 switch 语句...我怀疑这是不寻常的
Register() 和 Send() 实际上是 OneWay 和 Async...所有来自服务的结果都由 WCF CallbackContract 返回给客户端服务。我相信使用 CallbackContracts 的原因是为了方便我们使用的 Publish-Subscribe 模型。问题不在于我们的所有通信都适合发布-订阅,并且使用 CallbackContracts 意味着我们必须在返回的结果消息中包含源详细信息,以便客户端可以计算出返回的结果最初是为了什么......再次客户端有一个 switch 语句可以解决如何根据 MessageType(和其他嵌入的详细信息)处理来自服务的消息。
就拓扑而言:服务在图中形成“节点”。每个服务都硬编码了它在启动时必须连接的其他服务的列表,并且不会允许客户端服务向它“注册”,直到它建立了它需要的所有连接。例如,我们有一个 LoggingService 和一个 DataAccessService。 DataAccessService 是 LoggingService 的客户端,因此 DataAccess 服务将在启动时尝试向 LoggingService 注册。在它成功注册之前,DataAccess 服务将不允许任何客户端向它注册。结果是,当系统作为一个整体启动时,服务以级联方式启动。我不认为这是一个问题,但这是否不寻常?
为了让事情变得更复杂,系统要求之一是服务或“节点”不需要相互直接注册才能相互发送消息,而是可以通过间接链接进行通信。例如,假设我们有 3 个服务 A、B 和 C 连接在一条链中,A 可以通过 B...向 C 发送消息通过 2 个跃点。
我实际上负责这个任务并编写了路由系统,这很有趣,但是在我问为什么真的需要它之前,领导就离开了。据我所知,服务没有理由不能直接连接到他们需要的其他服务。更重要的是,我必须在一切之上编写一个可靠性系统,因为要求是在系统中跨节点有可靠的消息传递,而使用简单的点对点链接 WCF 可以可靠地完成这项工作。
在这个项目之前,我只在 winforms 桌面应用程序上工作了 3 年,不知道有什么更好的。我的怀疑是这个项目过于复杂:我想总结一下,我的问题是:
1) 这种消息在间接链接上跳跃的图拓扑的想法是否不寻常?为什么不直接将服务连接到他们需要访问的服务(这实际上是我们所做的……我认为我们没有任何消息跳跃)?
2) 在 OperationContract 中仅公开 2 个方法并使用 MessageType 枚举来确定消息的用途/如何处理它是否异常? WCF 服务不应该公开许多具有特定目的的方法,而客户端选择它想要调用的方法吗?
3) 通过 CallbackContracts 与客户端进行的所有通信都异常。当然同步或异步请求响应更简单。
4) 一个服务在连接到它的所有服务(它是一个客户端)之前不允许客户端服务连接到它(注册)的想法是一个合理的设计吗?我认为这是我唯一同意的设计方面,我的意思是 DataAccessService 在与日志服务建立连接之前不应接受客户端。
我有很多关于 WCF 的问题,更多内容将在后面的主题中提出。提前致谢。
【问题讨论】: