需要帮助WCF设计

时间:2010-05-20 03:29:36

标签: wcf service esb

我的任务是创建一组Web服务。我们是微软的商店,所以我将在这个项目中使用WCF。有一个有趣的设计考虑因素,我还没有找到解决方案。我将尝试用一个例子来解释它:

我的WCF服务公开了一个名为Foo()的方法。

10个不同的用户大致同时调用Foo()。

我有5个特殊资源,分别叫做R1,R2,R3,R4和R5。我们并不需要知道资源是什么,除了特定资源一次只能被一个调用者使用这一事实。

Foo()负责使用这些特殊资源之一执行操作。因此,以循环方式,Foo()需要找到一个未使用的资源。如果没有可用的资源,它必须等待一个资源被释放。

起初,这似乎是一件容易的事。我可以创建一个单例来跟踪当前正在使用的资源。最大的问题是我需要这个解决方案在Web场景中可行。

我确信这个问题有一个很好的解决方案,但我以前从未遇到过这种情况。我需要某种资源跟踪器/提供程序,可以在多个WCF主机之间共享。

非常感谢建筑师的任何想法!

3 个答案:

答案 0 :(得分:3)

创建另一个只有Web服务知道的中央服务。此服务承担资源管理器的角色。

服务器场中的所有Web服务都将与此中央服务进行通信,以查询资源可用性以及“签出”和“签入”资源。

答案 1 :(得分:0)

您可以跟踪数据库表中的资源使用情况,该服务器场中的所有服务器都可以访问该数据库表。

每个资源在数据库中都有一条记录,其中的字段指示是否(或从何时)使用它。您可以获得花哨并实现超时功能。

出于问题排查目的,您还可以记录使用该资源的人员。

如果您记录每个资源的使用时间(在另一个表中),您将能够验证您的循环功能是否按预期运行,决定是否应添加更多资源副本等。

答案 2 :(得分:0)

有许多方法可以解决这个问题,每种方法都有自己的成本和收益。例如:

  • 使用MSMQ对所有请求进行排队,工作进程从队列中提取消息,传递给Rn并将响应发送回响应队列,以便Foo调度回适当的调用者。
  • 使用内存或本地持久消息调度程序,根据您选择的某种分发算法,将下一个请求发送到机上服务(例如,通过命名管道执行)。

唉,你没有说明你的请求是否必须在断电中存活,是否需要在事务上知道,呼叫者是否也是WCF,接收这些呼叫的速度,Rn返回需要多长时间结果等。

无论您选择哪种解决方案,我强烈建议您将对Foo()的调用拆分为RequestFoo()和GetFooResponse()对,或者实现调用方托管的WCF回调以异步接收结果。

如果你不这样做,你很可能会发现你的整个系统将停止第二次流量超过你的资源,以满足工作量。