【问题标题】:Using protobuf in WCF services在 WCF 服务中使用 protobuf
【发布时间】:2010-10-21 20:20:54
【问题描述】:

我的 asp.net 网页位于 IIS Web 服务器上,它使用基本的 HTTP 绑定与 WCF 服务(位于 windows 2008 应用服务器上)进行通信。 我的 wcf 服务的性能似乎不是那么好,我想改进它。另外,我需要平衡可伸缩性,因为我的网站将有非常高的流量。

HTTP 压缩、节流是一些我知道但还没有尝试过的方法.. 我可以使用protobuf API...请建议...

【问题讨论】:

    标签: wcf web-services wcf-binding


    【解决方案1】:

    简短的回答是“是”...

    protocol buffers 规范本身不提供 RPC 堆栈,但在规范之外添加了一些。

    首先,protobuf-net 具有 WCF 挂钩,允许您将服务合同上的操作标记为 ProtoBehavior。然后交换常规的 DataContractSerializer 以使用 protobuf-net 序列化。但是,有一些警告:

    • 您的数据成员必须有明确的顺序(例如[ProtoMember(Order = 1)]),因为它使用这些数字作为字段标识符(协议缓冲区使用数字字段)
    • 它最适用于程序集/类共享(服务合同等),因为这种自定义行为不会在“mex”上公开

    与基本 http 传输一起使用时,它还与 MTOM(如果启用)兼容,以实现最大吞吐量。重要消息的性能在很大程度上与它们的大小成正比;您可以了解 protobuf-net 的大小here

    另外,我也在开发一个定制的 RPC 堆栈。 current build 有一个基于 http 的工作堆栈,但我也计划在有机会时在原始 TCP/IP 上启用它。我还没有机会写出来,但我可以根据要求提供示例。请注意,要最方便地使用它,您还需要 3.5“扩展”dll。

    如有任何问题,请添加评论或给我发电子邮件(查看我的个人资料)。

    【讨论】:

    • 如果消息是原始数据类型怎么办?它仍然取代行为吗?例如,如果您要返回一个双精度数组,它是作为序列化字节发送的吗?在这种情况下你需要程序集共享吗?此外,您说它最适合装配共享。那么如果客户不知道 PortoMember 订单,它会如何表现呢?
    【解决方案2】:

    如果 WCF 服务不需要暴露在内部网络之外,您也可以考虑使用基于 TCP 的绑定。

    【讨论】:

      【解决方案3】:

      protobuf-net

      protobuf-net 是一个 .NET 实现,允许你 高效、轻松地序列化您的 .NET 对象。它是兼容的 与大多数 .NET 系列,包括 .NET 2.0/3.0/3.5、.NET CF 2.0/3.5、Mono 2.x、Silverlight 2 等

      【讨论】:

      • 感谢您的回答...请问您是否已经使用过 protobuf 以及看到了多少性能提升?
      • 实际上 Marc,该库的作者在 StackOverflow 上的某个地方。我会给他发电子邮件并指出他的问题:)
      • 澄清一下,我只是“protobuf-net”的作者; “协议缓冲区”是 Google 一些非常聪明的人的功劳。
      猜你喜欢
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多