c# - WCF-C#服务应连续发送结果

标签 c# wcf streaming

由于这是一个很长的问题,因此悬崖音节优先。

悬崖笔记:
一个客户端将输入发送到多个服务,它们继续工作并发送结果,直到客户端告诉它们停止或达到预设的最大结果数为止。

您是否知道应该如何实现这一目标,或者您有Cth示例作为示例?像这样? WCF和流式传输是否适合此工具集? (考虑到结果是自定义对象,因此与流式传输文件并不完全相同)

更详细的问题定义:

情况:


我可以完全控制客户端和服务的代码(现在不依赖于封闭的第三方)
一切都在C#中
我们有一个客户想要完成一项任务,并为此提供了若干平等的独立服务。
(等于=等于服务软件,运行每个服务的硬件可能会有所不同->服务速度可能会有所不同)
一项任务由“ 1000项工作”组成,它们彼此独立。
在一项任务中,所有1000项工作都基于相同的输入数据。


我提到解决方案A + B,因为我认为它们有助于解释问题:

解决方案(A)-慢速非并行方式:
1.客户端将输入发送到一项服务。
2.服务根据输入进行初始化。
3.服务处理所有1000项工作
  (结果相加(超级快),所以1000件作品的结果与一个结果的大小相同)
4.服务将结果发送给客户端。
5.客户收到结果并感到高兴

解决方案(B)-并行更快的方法:
假设有十个服务,因此我们将其平均分配,每个应处理100个。

问题在于某些服务可能比其他服务快得多,因此给每个服务相同的数量(100)比
必要。
此外,由于一项服务的速度会发生变化,因此我们无法根据先验速度测试进行细分
有些甚至在处理过程中可能会失败,这就是为什么我认为以下对我而言是最佳的原因。

解决方案(C)-我想要实现的方式:
客户端向所有服务发出相同的请求。 (相同的请求仍然意味着要并行处理任务,对于我的问题,并行化非常容易,因为1000项工作是如此独立,以至于完成“第一”项工作的1000倍就意味着我们完成了工作)

服务会一直工作并发送结果,直到被告知停止或已处理1000件工作为止。
完成10项工作后,将发送一份结果。
这意味着所有服务并行执行任务,并且当客户端从所有服务答复中获得1000个结果的总和时,它将发送停止信号。
这意味着通常没有任何一项服务应该达到1000,但是有了1000,我们就可以解决只有一项服务的情况,并且我们具有故障保护功能,可以避免在停止信号丢失时发生无限循环。 (客户无需等待也不必绝对确定停止信号已到达服务)

放弃超出我们的1000个目标的其他结果就可以了。

(替代方法是对响应速度比其他响应速度更快的服务提出后续请求
 由于来回的消息和额外的初始化而浪费时间。
 (可以避免添加init,但这会很复杂,您还有其他开销))

我基本上有解决方案/会知道如何实现A + B,但是我不知道如何实现(C)。
您如何在C#中实现客户端/服务体系结构,使服务不断发送结果,而不仅仅是返回一个对象/值? (结果是自定义对象,顺便说一句)
有人知道某处的C#示例代码。像这样实现?流媒体是正确的方法吗?

我已经找到了"writing a custom stream"-示例,但从那里到我想要的似乎似乎还有很长的路要走。 (作为WCF菜鸟,我在这方面很容易出错。)

最佳答案

WCF中的流无法以打开流,将流返回给客户端的方式工作,并且服务仍将为流生成结果。如果要以这种方式工作,则必须更深入并直接使用套接字。在WCF中,必须先将流写入,然后再从操作中将其返回(我试图从其他线程写入返回的流,但它不起作用)。 WCF中的流仅用于数据传输。

我不喜欢您的任何解决方案。我会尝试:


B的变体。但是任务不会在前期平均分配。如果您有10个服务和1000个任务,则仅在该服务返回结果后才发送另一个任务,才发送前10个任务(每个任务到一个服务)。如果任务可以在合理的时间内完成,则只需要对服务进行多个异步调用即可等待响应。如果任何服务将无法在定义的超时时间内完成任务,则您会将任务发送给另一服务。如果任务可以快速完成,则可以发送小批量而不是单个任务。如果任务完成需要很长时间,则需要双工通信。
使用事务性消息队列-MSMQ。您的客户端将生成1000条消息到“生产者队列”,服务将一一处理这些消息并进行处理。它们将结果作为消息发送到另一个“消费者队列”,客户端将在其中获取结果并对其进行处理(每个结果必须与任务相关)。事务性队列将确保每个任务只能由单个服务处理,但是如果服务失败或事务超时,则该任务将可用于其他服务。 MSMQ还提供了一些其他功能,例如用于错误任务的队列等。这是高级场景。这种情况下的主要问题可能是邮件大小的限制(每条邮件最大4MB)。


编辑:

好的,因为您的澄清,看来您需要将同一任务发送到多个服务,并且该任务只会触发对同一数据的一系列相同计算。您可以通过以下方式实现:


使用Net.tcp绑定构建双工服务
服务将实现服务合同,该合同将具有开始计算和停止计算的操作(可以使用IsInitiatingIsTerminatingOperationContract属性)
服务将在启动操作中启动的单独线程中进行计算
停止操作将中止计算线程
客户将实施回调合同以接收来自服务的结果
当处理线程有结果(或多个结果)发回时,服务将调用客户端回调


Here是将双工服务与WsDualHttpBinding一起使用的示例-请勿在您的方案中使用此绑定,因为如果要让单个客户端通过双工HTTP与多个相同的服务进行通信会更加复杂。

关于c# - WCF-C#服务应连续发送结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6318179/

相关文章:

c# - 跨午夜的 Quartz.NET 每日时间间隔

jquery - WCF 4、JSONP 和 jQuery 导致解析器错误

c# - WCF 数据服务使用基于 EF 的存储库中的数据

c# - WCF REST、流式上传文件和 httpRuntime maxRequestLength 属性

http - HTTP 服务器实现应该如何处理内部错误?

c# - 在 Visual Studio 2017 中构建和管理 Azure 函数

c# - 提示 C# 和 SQL 难题

c# - html敏捷得不到结果

c# - 我应该使用哪个 Fluent WCF 框架(如果有)?

java - write (byte[] b) 大字节数组的优化用法