什么是发布到Pub-Sub和从Pub-Sub消费的最佳数据格式?我正在查看Avro消息格式,因为它是二进制格式。 用例是会有实时微服务应用程序将Avro消息发布到pub-sub。鉴于avro消息最适合在批处理消息(以及与二进制消息一起附加的架构)然后发布消息时使用,是否更适合此涉及微服务的用例格式?
答案 0 :(得分:1)
Google Cloud文档包含一些JSON示例,但是在寻求效率时,主要建议是使用available client libraries,除非您的需求不能满足客户端库所能提供的要求,或者您正在{{3 }},在这种情况下,建议使用两个API。
事实上,提高效率的最重要因素是使用gRPC API而不是REST API(默认情况下,库调用会使用REST API)。如Google App Engine standard environment所述:
有两个主要因素在起作用:更有效的数据编码 和HTTP / 2。 gRPC将数据以二进制形式保存在客户端内存和 通过在HTTP / 2和协议缓冲区上构建数据线。这消除了 字符串编码方案所需的处理和空间,例如 Base64或JSON。此外,HTTP / 2本身可以使处理速度更快 单个连接上的多路复用请求和报头压缩。
我在任何地方都没有找到明确提及的数据格式。我建议您为消息使用首选语言,例如Python。 here和Client library description here。
基于sample code here,您可以通过以下方式有效地优化PubSub系统:
- 确保您正在使用gRPC
- 尽可能进行分批处理,以减少通话次数并消除延迟。
- 仅在需要时和基准测试之后压缩(这意味着应用程序中需要额外的逻辑)
最后,如果您打算部署功能强大的PubSub系统,请查看this StackOverflow post。她现在是Google的项目经理,并建议和阐述以下三个技巧:
- 不要低估容量规划的重要性。
- 确保您的发布/订阅系统是容错的。
- NSM:永不停止监视。
答案 1 :(得分:1)
对于在所有用例中用于消息的最佳格式,将没有一个正确的答案。 Avro当然是一个受欢迎的选择。 Protocol buffers和Thrift也是另一种可能性。对于发布/订阅,数据全都是字节,并且由发布者和订阅者确定此数据的解释。人们在不同的数据格式上运行comparisons,因此您可能需要根据性能和消息大小方面的需求做出决定。
Pub / Sub本身对defining its data types使用协议缓冲区。关于批处理,Cloud Pub/Sub client libraries会自行进行批处理以进行发布,因此您不必自己担心。您可以通过使用例如Java的Publisher.Builder
中的setBatchSettings
来控制批处理设置,以根据用例优化吞吐量和延迟(其他语言也具有等效功能)。如果要将某些元数据与一组消息而不是与每条单独的消息相关联,或者在如何将消息一起批处理方面有非常特定的需求,则可以决定自己进行批处理。否则,取决于客户端库来进行批处理可能是正确的决定。