代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

WCF是我的正确选择吗?

  •  3
  • Steven Evers  · 技术社区  · 14 年前

    从我对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 回复  |  直到 14 年前
        1
  •  3
  •   Jake    14 年前

    WCF非常适合将服务器的细节隐藏在客户机之外——它提供了一个抽象层,对于处理大量客户机来说非常方便。如果这是两个人从数据库请求数据,那么我会说,wcf将被过度杀戮,但听起来这是该技术的正确应用。

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

    这里是(详细!)WCF实例说明: http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

        2
  •  1
  •   Dr. Wily's Apprentice    14 年前

    似乎涉及WCF和msmq的解决方案可以满足您的需求。您可以使用msmq存储下一个需要向客户端提供服务的项目,而wcf服务可以是msmq的前端,这样您的客户端就不必直接与之交互。由于您的状态在msmq中维护,因此您的WCF服务可以保持无状态。

        3
  •  0
  •   Jimmy Hoffa    14 年前

    在我看来,您只是从一个包含多个客户机的队列中的服务获取数据。

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

    或者更好的是,只需使用标识主键并始终获取最低的ID,并在获取时将其删除,或者如果出于某种原因需要将其移动到另一个表中。

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

        4
  •  0
  •   Steven Sudit    14 年前

    我同意杰克的观点,但我想补充几点:

    1. 客户可能会失败或离开,所以重要的是不要仅仅把物品交给他们,失去对它的所有控制。通常的方法是对它们进行一段时间的租用,这样,如果它们没有完成处理,那么对象就会立即返回到队列中。在你的情况下,我怀疑它会回到队列的前面,但这通常是结束。您还希望跟踪重试,以防某些对象有毒且无法处理。

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