gpt4 book ai didi

c# - WCF 服务依赖项

转载 作者:行者123 更新时间:2023-11-30 15:35:26 25 4
gpt4 key购买 nike

我分别有三个 wcf 服务 A、B 和 C,因为我希望它是 SOA(面向服务的体系结构),我的设置工作方式是当我从客户端向服务器发送请求时。

  1. 所有服务都是自托管 Windows 服务。
  2. 客户端向服务A发送请求(客户端不知道其他服务B和C);
  3. 服务 A 最终将该请求发送给服务 B 和服务 C。
  4. 服务 B 和 C 将响应发送回服务 A,服务 A 将响应发送回客户端。

我面临的问题:如果我对服务 B 的代码进行任何更改并重建并重新启动该服务,我在获取响应时遇到问题但是当我重新启动所有剩余的服务时它工作正常。

换句话说,除非我重新启动所有服务(A、B 和 C),否则我的客户端不会收到响应,即使我只是更改了一个服务中的代码并重建了它。我知道如果我重新启动所有这三个服务,但我想知道这是我设计方式中的问题还是我必须处理自托管 Windows 服务的问题。所有服务(A、B、C)都是独立的,因为没有一个依赖于彼此。

有人见过这样的事情发生在 SOA 中吗?如果有人能指导我找到合适的解决方案,我会很高兴?

最佳答案

  1. 用任何类型的队列替换服务之间的 WCF(一个服务发布某些内容,其他服务可以在准备就绪时读取)。可以是任何东西。可以是一个简单的表格,如果有新内容,您可以从中阅读。可以是 RabbitMQ、NServiceBus 等,只要适合您。

  2. 定义放入队列的消息:命令和事件。两者都是具有属性的简单类,那里没有逻辑。命令表示要求系统执行的操作(RegisterUser、PlaceOrder 等),事件表示系统执行的操作(UserRegistered、OrderApproved、PaymentReceived 等)。明确操作,不要做类似“我已经在客户端更改了用户的所有属性,现在我调用 SaveUser(user)”之类的事情。 您的服务应该知道如何更改对象,客户端应该只命令做什么

  3. 永远不要违约。这很简单,比听起来容易:您可以添加 内容到您的消息契约(Contract)中,但不能删除。换句话说,你只是让你的合约向后兼容。

现在您有了一个更好的设计:服务仅通过队列中的消息进行通信,消息是向后兼容的。这意味着您可以随时停止任何服务而不影响其他服务:它们将继续将消息发送到队列中,当停止的服务再次返回时,它将 catch 处理队列中的所有内容。

然后,如果需要,您可以对客户端交互使用相同的方法:如果不是调用 WCF,客户端只会将它们的命令放在某种队列中,那么服务升级或其他停机时间将不影响用户体验。

示例:如果我使用 WCF 下订单或将商品放入购物卡,那么如果出现问题或服务因维护而停机,我将无法执行此操作。我会单击一个按钮并出现严重错误。更重要的是我的订单不会进入系统。相反,如果中间有一个队列,我只把我的命令放到队列中。现在,即使我的服务此时已关闭,或遇到高负载(因此速度很慢),我的用户体验仍然相同并且不会降低。只是我的命令会稍后处理,但作为客户我并不关心。在这种情况下,我的订单不会丢失。该系统变得容错和 self 平衡。

如果您只是在中间放置一个队列而不是遇到 WCF 附带的空间和时间耦合问题,那么您可以使用各种绝妙的技巧 :)而我所描述的仅仅是个开始……:)

关于c# - WCF 服务依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14967644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com