【问题标题】:Protocol Buffer vs Json - when to choose one over anotherProtocol Buffer vs Json - 何时选择一个而不是另一个
【发布时间】:2019-02-23 20:21:01
【问题描述】:

谁能解释一下何时在微服务架构中使用协议缓冲区而不是 JSON?反之亦然?同步和异步通信。

【问题讨论】:

  • 为什么不使用 flatbuffer , capNProto ?
  • @so-random-dude 感谢您的回答。您还可以在回答中讨论 flatbuffer、capNProto 的用例、优缺点

标签: json rest protocol-buffers microservices


【解决方案1】:

当消费者是或可能用内置原生支持 JSON 的语言(例如 JavaScript)、网络浏览器或需要人类可读性的语言编写时,我会使用 JSON。说起来,至少对于异步调用来说,很多开发者都喜欢直接查看队列内容进行调试,甚至在正常的开发过程中也能享受到这种便利。根据所使用的技术堆栈,使用 protobuf 来减少网络负载可能值得也可能不值得,因为任何性能提升都不会在异步世界中为您带来太多收益。而且我们不再需要像过去在大多数语言中使用 JSON 编组和解组时那样编写一堆样板代码。

我会使用 protobuf 来处理其他所有事情……如果考虑到上述考虑还有其他用例可供使用的话。您可能会看到一些优势,例如性能、网络负载、其版本控制方案提供的向后兼容性、神奇地附带 proto 文件的可爱文档以及一些验证!如果由于某种原因,您在微服务之间有大量 REST 或其他同步调用,则可以通过线路而不是 JSON 发送 protobuf,而无需进行很多权衡(如果有的话),同时提供大量优势。

【讨论】:

    【解决方案2】:

    何时使用 JSON

    • 您需要或希望数据是人类可读的
    • 来自服务的数据直接由网络浏览器使用
    • 您的服务器端应用程序是用 JavaScript 编写的
    • 您还没有准备好将数据模型绑定到架构
    • 您没有足够的带宽将其他工具添加到您的武器库中
    • 运行不同类型的网络服务的操作负担 太棒了

    ProtoBuf 的优点

    • 相对较小的尺寸
    • 保证类型安全
    • 防止架构违规
    • 为您提供简单的访问器
    • 快速序列化/反序列化
    • 向后兼容性

    在我们讨论的时候,你看过flatbuffers吗?

    这里涵盖了一些方面google protocol buffers vs json vs XML

    参考:

    https://codeclimate.com/blog/choose-protocol-buffers/

    https://codeburst.io/json-vs-protocol-buffers-vs-flatbuffers-a4247f8bda6f

    【讨论】:

    • 您也可以使用 jsoniter-scala 获得 ProtoBuf for JSON 的所有这些优点。当没有太多的浮点数可以序列化时,它可以与用于 ProtoBuf 的最佳 Java/Scala 序列化程序竞争:github.com/dkomanov/scala-serialization/pull/8
    • 请注意,JSON 的一些缺点可以通过使用 JsonSchema 验证 JSON 来解决。即:类型安全、架构违规和部分向后兼容性问题。
    猜你喜欢
    • 2020-05-26
    • 2015-03-03
    • 1970-01-01
    • 2011-11-27
    • 2015-04-23
    • 2011-04-30
    • 2013-01-06
    • 2015-07-02
    • 2010-10-30
    相关资源
    最近更新 更多