WCF是我的正确选择吗?

时间:2010-07-27 16:37:59

标签: c# .net mysql wcf

从我对WCF知之甚少看来,它似乎是我遇到的特定问题的正确解决方案,但我想得到一些意见。

问题描述:

客户端大约每隔1-10分钟(平均2分钟)从列表中顺序访问域对象,但是没有2个客户端应该访问同一个对象。某些订单应保留在列表中。

示例用法:

Client X -> WCFService::GetNextObject() -> Fetch from DB, sort
         <- return nextObject

Where X is [1,~200)

对象列表基本上是一个DB表,其中每个对象都以优先级注释。优先级为1的所有对象应该是下一个被传递出去的对象。从那里开始的排序取决于优先级。例如。优先级1对象应该根据对象上的日期时间按时间顺序分发,而优先级4对象需要根据对象上的字符串值按字母顺序分发。

[编辑]一些澄清点:对于不同的优先级,还有其他排序方案,需要引用无数其他表中的相关记录 - 它似乎过于复杂,但有一个有效的商业案例。同样,可能会经常非常在此列表中添加和删除对象(但平均很少)。[/ Edit]

我正在考虑使用WCF,以便来自任何地理位置的人都可以通过LAN / WAN使用它,它将确保维护订单并且没有两个客户端获得相同的nextObject。我认为WCF是一个很好的选择吗?

我想知道的一件事是WCF服务的状态?或者,更好的说:它是无国籍的吗?每个客户端对服务的访问权限是否会创建新的逻辑WCF实例?如果是这样,那么同步/锁定通常如何接近?

应该注意的是,公司的其他所有内容都是在.NET堆栈上开发的,因此显然存在对.NET技术的亲和力。但是,它不是强制性的。

4 个答案:

答案 0 :(得分:3)

WCF非常适合从客户端隐藏服务器的详细信息 - 它提供了一个抽象层,可以非常方便地处理大量客户端。如果有几个人从数据库中请求数据,那么我会说WCF会过度,但听起来这是这项技术的正确应用。

关于WCF服务的状态,这是可配置的。您可以将服务作为单例运行,或让它为每个会话甚至每次调用生成一个新实例。

这是WCF实例的(详细!)解释:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

答案 1 :(得分:1)

似乎涉及WCF和MSMQ的解决方案可能符合您的要求。您可以使用MSMQ存储需要提供给客户端的下一个项目,而您的WCF服务可以是MSMQ的前端,以便您的客户端不必直接与其进行交互。由于您的状态是在MSMQ中维护的,因此您的WCF服务可以保持无状态。

答案 2 :(得分:0)

听起来我只是从具有多个客户端的队列中的服务中获取数据。

如果是这种情况,您应该只使用SQL Server,这实际上是数据库中的队列表。每次客户端从表中出列项时,它都会更新其他工件的优先级。

或者更好的是,只需使用身份主键并始终获取最低ID,并在抓取时删除它,或者如果您出于某种原因需要将其移至另一个表。

如果您想要免费使用SQL Server或SQL Server Express,您可以免费获得所有锁定等。

答案 3 :(得分:0)

我同意杰克的观点,但确实想添加一些内容:

  1. 客户可能会失败或离开,所以重要的是不要只是将对象交给他们并失去对它的所有控制权。通常的方法是在一段时间内向他们租赁,这样如果他们没有完成处理,那么对象就会重新进入队列。在你的情况下,我怀疑它会回到队列的前面,但更常见的是结束。如果某些对象有毒且无法处理,您还需要跟踪重试。

  2. 除非您的所有客户都是.NET,否则您将希望坚持WCF的更通用部分。