并发控制是 Pub/Sub 高级别客户端库中的一项可用功能。使用低级库时,您还可以实现自己的并发控制。
是否支持并发控制取决于客户端库的编程语言。对于支持并行线程的语言实现(如 C++、Go 和 Java),客户端库会默认选择线程数。
此选择可能不是您的应用的最佳选择。例如,如果您的订阅者应用无法应对传入消息量,但并非受限于 CPU,则必须增加线程数。对于 CPU 密集型消息处理操作,减少线程数可能是适宜的办法。
本页介绍了并发控制的概念,以及如何为订阅者客户端设置此功能。如需为发布者客户端配置并发控制,请参阅并发控制。
并发控制配置
并发控制变量的默认值和变量名称可能因客户端库而异。如需了解详情,请参阅 API 参考文档。例如,在 Java 客户端库中,用于配置并发控制的方法为 setParallelPullCount()
、setExecutorProvider()
、setSystemExecutorProvider()
和 setChannelProvider()
。
setParallelPullCount() 可让您决定要打开多少个流。如果订阅者客户端可以处理比单个流(10 MBps)上发送的数据更多的数据,您可以打开更多流。
借助 setExecutorProvider(),您可以自定义用于处理消息的执行程序提供程序。例如,您可以将执行程序提供程序更改为返回单个共享执行程序的提供程序,该执行程序在多个订阅者客户端中具有有限数量的线程。此配置有助于限制创建的线程数。用于并发控制的线程总数取决于客户端库中传入的执行器提供程序和并行拉取计数。
借助 setSystemExecutorProvider(),您可以自定义用于租用管理的执行器提供程序。 通常,除非您想在
setExecutorProvider
和setSystemExecutorProvider
中使用相同的执行器提供程序,否则无需配置此值。例如,如果您有多个低吞吐量订阅,则可以使用相同的执行器提供程序。使用相同的值会限制客户端中的线程数。借助 setChannelProvider(),您可以自定义用于打开与 Pub/Sub 的连接的渠道提供程序。通常,除非您想在多个订阅者客户端中使用同一渠道,否则不会配置此值。在过多的客户端之间重复使用某个渠道可能会导致
GOAWAY
或ENHANCE_YOUR_CALM
错误。如果您在应用的日志或 Cloud Logs 中看到这些错误,请创建更多渠道。
并发控制的代码示例
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
Go
以下示例使用 Go Pub/Sub 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Ruby
以下示例使用 Ruby Pub/Sub 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
后续步骤
了解您可以为订阅配置的其他传送选项: