0

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

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

10 个不同的用户几乎同时调用 Foo()。

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

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

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

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

来自建筑师的任何想法将不胜感激!

4

3 回答 3

3

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

场中的所有 Web 服务都将与该中央服务通信以查询资源可用性并“签出”和“签入”资源。

于 2010-05-20T03:40:49.177 回答
0

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

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

等等

唉,你没有说明你的请求是否必须在停电中幸存下来,如果他们需要事务感知,调用者是否也是 WCF,这些调用将多快被接收,Rn 需要多长时间才能返回结果,等等

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

如果您不这样做,您可能会发现您的整个系统会在第二次流量超出您的资源满足工作负载的能力时停止运行。

于 2010-05-20T21:34:16.593 回答
0

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

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

出于故障排除的目的,您还可以记录谁在使用该资源。

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

于 2010-05-20T17:59:39.327 回答