1

我希望能够优先考虑来自 WCF 服务的传出数据/消息。

这是基本场景:

  1. 客户端从服务器请求数据流。数据流是实时的、庞大的并且可能是无止境的(设备监控数据)。我们称之为 HighPriorityDataStream。
  2. 客户请求额外的数据。我们称之为 LowPriorityData。

带宽是有限的(想想拨号调制解调器或卫星)。当请求 LowPriorityData 时,当前的 HigPriorityDataStream 不被中断或延迟是非常重要的。

我已经有一个基于套接字的遗留系统,这是通过手动控制将数据放入套接字缓冲区的顺序来完成的。高优先级数据被放置在缓冲区中,如果有剩余空间,则添加低优先级数据以填充缓冲区的其余部分。

我正在尝试使用 WCF 重新设计此流程...我不知道任何开箱即用的解决方案,并且我认为我可能需要编写自定义通道行为,但我想挑选在我走那条路之前的社区:)

4

2 回答 2

0

我认为没有通用的开箱即用解决方案。解决方案取决于您的其他要求。你想控制每个客户端或整个服务器(所有客户端)的带宽吗?您想从同一个代理调用低优先级操作还是为新操作启动新代理?您想同时运行更多的高优先级操作吗?你想优先处理传入的请求吗?

最简单的解决方案期望您控制每个客户端的带宽,您为所有调用重用相同的代理,只能同时完成一个高优先级操作,并且以 FIFO 顺序处理请求。比您只需使用 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 标记您的服务实现(这应该是通过 NET.TCP 公开的服务的默认设置)。此设置将为来自同一客户端代理的所有调用重用相同的服务实例,但一次只会处理一个调用(其他调用将在队列中等待,直到它们被处理或超时)。

最好的问候, 拉迪斯拉夫

于 2010-08-10T08:12:55.350 回答
0

经过大量探索(感谢 Ladislav 的深思熟虑的想法),我得出的结论是,我要求通信层解决业务层问题。为了更好地说明问题,有多个连接和一个数据源。数据源必须优先考虑从自己的数据源(实时数据流和持久化数据库)收集的数据,并根据优先级将数据发送回各个客户端。需要明确的是,客户端基于其基于角色的身份具有相对优先级,数据源具有优先级(更喜欢实时数据而不是持久数据),数据源中的各个字段具有优先级顺序(所有其他条件相同,字段X 必须始终在字段 Y) 之前发送。

这完全是业务逻辑,我们采用的解决方案是一组优先级队列,它们根据这些优先级要​​求自动对输入数据项进行排序,然后按该顺序处理每个请求。

于 2010-08-25T20:06:18.900 回答