WCF服务依赖项

时间:2013-02-19 21:19:38

标签: c# wcf soa

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

  1. 所有服务都是自托管的Windows服务。
  2. 客户向服务A发送请求(客户端对其他服务B和C没有任何线索);
  3. 服务A最终将该请求发送到服务B和服务C.
  4. 服务B和C将响应发送回服务A,服务A将由服务A发送回客户端。
  5. 问题即将面对:如果我对服务B的代码进行了任何更改并重建并重新启动服务,我遇到了回复问题的问题,但是当我重新启动所有剩余的服务时,那么它工作正常。

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

    有人曾经在SOA中看到过这样的事情。如果有人可以指导我找到合适的解决方案,我会很高兴吗?

2 个答案:

答案 0 :(得分:3)

  1. 使用任何类型的队列替换服务之间的WCF(一个服务发布一些东西,其他服务在准备就绪时可以读取)。可以是任何东西。可以是一个简单的表格,您可以从中读取是否有新的东西。可以是RabbitMQ,NServiceBus等,无论什么都适合你。

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

  3. 永远不要违反合同。它比听起来容易,容易:您可以添加内容到您的邮件合同中,但无法删除。换句话说,你只是让你的合同向后兼容。

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

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

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

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

答案 1 :(得分:1)

您可能需要考虑使用NServiceBus等服务总线来帮助您完成功能。

它将帮助您解决的第一个问题是通过发布/订阅消息传递模式将服务分离。不是在一个或另一个服务中调用Web服务,而是发布在发生某些事件时通知相应服务的事件。在你的情况下,这看起来像这样:

  1. 客户端在服务A中调用Web服务。
  2. 服务A发布消息“客户端命令已收到”服务B和C订阅。
  3. 服务B和C处理此事件,然后发布自己的事件。
  4. 服务A订阅事件并回复客户端。
  5. 使用NServiceBus的第一个好处是可靠性。最重要的是,您可以轻松地对消息进行版本设置,而不会影响您的客户或您的相应服务。 NServiceBus具有完整的WCF集成,因此您的客户端可以像以前一样继续向您的服务发送消息。

    使您的场景变得有趣的一个原因是您无法保证服务B和C何时将其回复发送给您。在服务收到回复之前,您是否保持与客户端的连接打开?在向客户发送响应之前,您是否需要两个响应?如果其中一个或一个服务崩溃会发生什么?如果服务A收到响应之前您可以等待多长时间,该怎么办?所有这些问题和更多问题都可以通过名为Sagas的NServiceBus中的一个功能来回答。看看吧。

    如果无法使用NServiceBus,那么事情会变得更加困难。 WCF不支持发布/订阅开箱即用,因此您必须自己烘焙。我建议至少使用它来解耦您的服务。如何管理服务中的状态和时间耦合是另一回事。省去麻烦。

    还有其他框架,但如果您想要以开发人员为中心,经济高效地创建基于.NET的解决方案,那么建议使用NServiceBus。