1

我使用 WCF 创建了一个 RESTful 服务,它计算一些值,然后向客户端返回响应。

我预计会有很多流量,所以我不确定是否需要手动实现队列,或者为了处理所有客户端请求不需要它。

实际上,我从客户端接收测量值,这些测量值必须存储到数据库中——每个客户端每 200 毫秒发送一次测量值,因此如果有多个客户端,可能会有很多请求。

以及对接收到的数据执行的其他操作。例如,客户端可以发送指令“给我最近 200 次测量的平均值”,因此计算该值可能需要一些时间,同时同一请求可能来自另一个客户端。

如果有人能就如何使用 WCF 创建可靠的服务提供任何建议,我将不胜感激。

谢谢!

4

4 回答 4

1

如果您使用 Web 服务,传输控制协议 (TCP/IP)将在一定程度上充当队列。

TCP 提供从一台计算机上的一个程序到另一台计算机上的另一个程序的可靠、有序的字节流传递。

这保证了如果客户端发送数据包 A,B,然后 C,服务器将按以下顺序接收它:A,B,然后 C。如果您必须以与请求相同的顺序回复客户端,那么您可能需要一个队列。

默认情况下,最大 ASP.NET 工作线程设置为每个 CPU 核心 12 个线程。所以在双核机器上,一次可以运行 24 个连接。根据计算需要多长时间以及“大量流量”的含义,您可以尝试不同的策略。

最简单的一种是使用 serviceTimeouts 和 serviceThrottling,只处理你能处理的,拒绝你不能处理的。

如果这不是一个选项,请增加硬件。这是第二个选项。

最后,您可以使服务完全异步。实现两种方法
string PostCalc(...)double GetCalc(string id). PostCalc接受参数,将它们填充到队列(或数据库)中并立即返回 GUID(我喜欢使用string而不是Guid)。客户端可以将返回的 GUID 用作索赔票,GetCalc(string id)每隔几秒调用一次,如果计算尚未完成,您可以返回 404 进行 REST。现在必须由监控队列的单独进程来完成计算。

第三个选项是最复杂的,但结果与第一个选项相似,即对传入请求设置上限。

于 2009-03-28T08:11:19.920 回答
1

您可以使用 MsmqBinding 并利用 eedsi9n 实现的方法。但是,根据我从这篇文章中收集到的信息,您正在寻找类似于 pub/sub 类型架构的东西。

这可以通过允许订阅者订阅事件的 WSDualHttpBinding 来实现。然后,发布者将在操作完成时通知用户。

因此,您可以让 Msmq 在幕后运行。客户端订阅某些事件,然后它可能会发布一条需要处理的消息。客户端坐在那里并确实工作(因为它完全异步),当发布者完成对消息的处理时,它可以发布一个事件(您的客户端订阅的事件)让您知道它已经完成。这样您就不必实施轮询策略。

对此也有预先罐装的解决方案。例如 NService Bus、Mass Transit 和 Rhino Bus。

于 2009-05-04T22:18:14.973 回答
0

这取决于您所说的“计算一些价值”和“大量流量”的含义。你可以做一些负载测试,看看#requests/second 是如何随着流量变化的。

于 2009-03-27T14:58:58.387 回答
0

如果您是 RESTful,则此处没有具体的 WCF (即,当您收到平均请求时 - 您需要结果有多新鲜)此外,您没有指定查询与新测量的相对频率在任何情况下您都可以(并且恕我直言应该)使用队列(假设衡量你的表现证明了这一点)在端点后面。如果您更改 WCF 绑定,您可能仍然是 RESTful,但不会从基于标准的 REST over HTTP 方法中受益

于 2009-05-12T19:35:47.583 回答