代码之家  ›  专栏  ›  技术社区  ›  Simon Gillbee

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

  •  1
  • Simon Gillbee  · 技术社区  · 14 年前

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

    以下是基本方案:

    1. 来自服务器的客户端请求数据流。数据流是实时的、大的,并且可能是无休止的(设备监控数据)。我们称之为高优先级数据流。
    2. 客户端请求附加数据。我们称之为低优先级数据。

    带宽有限(想想拨号调制解调器或卫星)。当请求低优先级数据时,不中断或延迟当前高优先级数据流是非常重要的。

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

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

    2 回复  |  直到 14 年前
        1
  •  0
  •   Ladislav Mrnka    14 年前

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

    最简单的解决方案是控制每个客户机的带宽,对所有调用都重用相同的代理,同时只能完成一个高优先级操作,并按FIFO顺序处理请求。而不仅仅是用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Persession,ConcurrencyMode=ConcurrencyMode.Single]标记服务实现(这应该是通过net.tcp公开的服务的默认设置)。此设置将对来自同一客户端代理的所有调用重复使用同一服务实例,但一次只处理一个调用(另一个调用将在队列中等待,直到它们被处理或超时为止)。

    最好的问候, 拉迪斯拉夫

        2
  •  0
  •   Simon Gillbee    14 年前

    经过一番推敲(感谢拉迪斯拉夫的深思熟虑),我得出结论,我要求通信层解决business层问题。为了更好地说明问题,存在多个连接和一个数据源。数据源必须区分从其自己的数据源(实时数据流和持久化数据库)收集的数据的优先级,并根据数据源的优先级将数据发送回各个客户机。要清楚,客户机根据其基于角色的身份具有相对优先级,数据源具有优先级(首选实时数据而不是持久数据),数据源中的各个字段具有优先级顺序(其他所有字段都相同,字段x必须始终发送在字段y之前)。

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