如何使用WCF确定传出消息的优先级

时间:2010-08-09 14:56:43

标签: wcf real-time nettcpbinding

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

以下是基本情景:

  1. 客户端从服务器请求数据流。数据流是实时的,大的,并且可能无穷无尽(设备监控数据)。我们称之为HighPriorityDataStream。
  2. 客户请求其他数据。我们称之为LowPriorityData。
  3. 带宽有限(想想拨号调制解调器或卫星)。当发出对LowPriorityData的请求时,当前的HigPriorityDataStream不会被中断或延迟是非常重要的。

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

    我正在尝试使用WCF重新设计这个过程...我不知道任何开箱即用的解决方案,我想我可能需要编写自定义频道行为,但我想选择在我走这条路之前,社区的大脑:)

2 个答案:

答案 0 :(得分:0)

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

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

祝你好运, 拉吉斯拉夫

答案 1 :(得分:0)

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

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