【问题标题】:Fastest method of communication with a Windows service与 Windows 服务通信的最快方法
【发布时间】:2010-10-08 01:48:17
【问题描述】:

我们正在运行一项需要与另一个进程快速通信的服务。目前,我们在缓冲模式下使用 WCF NetNamedPipeBinding 来调用服务中的方法,这似乎提供了可用 WCF 绑定的最少开销。有没有更快的方法使用托管代码来做到这一点?

编辑:如下建议的捆绑请求是一个已经考虑过的选项。真的,我们想知道是否有替代的 API 用于进程间通信,其性能优于使用命名管道的 WCF。

【问题讨论】:

    标签: c# .net wcf service


    【解决方案1】:

    如果您使用的是 WCF,那么命名管道是在本地系统上进行通信的最快方式。

    如果您要抛出大量数据,那么您可以考虑流式传输您的 API(只需添加一个 System.IO.Stream 作为参数,而不是传递数组或字符串等)

    同样对于性能而言,您的托管模型对于您的服务实例模式也非常重要。 Juval Lowy 关于 WCF 的书实际上非常好,如果您将代码示例深入到书中的内容中。

    编辑:针对您的评论,请查看您可以应用于服务定义的“ServiceBehaviour”属性。 (不是你的 IServiceInterface 描述,而是你的类的具体实现)。

    您可以通过 PerCall、PerSession 或 Singleton 将代码定义为实例。默认是 singleton PerSession(thanks @RichardOD) 并发模式设置为 single 并且 instanceContextMode 设置为 true,这允许您在 Windows 窗体上托管 WCF 并防止您在使用不明白实例化。

    基本上,如果您将其保留为默认值,您最终会得到一个单线程、按顺序处理的 WCF 主机。

    MSDN 有一些关于每种类型的作用的合理信息。

    【讨论】:

    • Spence,您能否具体说明“服务的实例模式”的含义。目前它作为自托管的 ServiceHost 运行,而后者又托管在标准的 Windows 服务中
    • @Spence。默认不是 Singleton,它是 PerCall 或 PerSession,具体取决于通道是否支持会话。
    • 1 指向@RichardOD。我很抱歉,与默认的 ConcurrencyMode single 混淆,这是我试图达到的目的,默认设置是零并发,这会影响可伸缩性。
    【解决方案2】:

    那么,您是受容量限制(即大消息)还是往返限制(大量小消息)?

    对于大消息,请考虑压缩(如果网络 IO 是开销)或更高效的序列化,例如 protobuf-net。

    对于聊天 API,请考虑将消息分组以减少往返次数。

    【讨论】:

    • 它将更像是一个健谈的 API。它的目的之一是为来自网页的自动完成请求提供服务,因此在这种情况下不会选择捆绑,但在其他情况下,这应该会减少 2 到 10 倍的流量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多