Pubsub 拉取订阅和并发
Posted
技术标签:
【中文标题】Pubsub 拉取订阅和并发【英文标题】:Pubsub pull subscriptions and concurrency 【发布时间】:2021-12-12 05:58:54 【问题描述】:我正在从推送订阅转向拉取订阅,并且我已经阅读了来自 Google 的关于 pubsub 并发的文档。他们的示例使用 Executor 订阅主题。这被配置为具有 4 个线程,默认为 1 个拉拔器(因此 2 个拉拔器将使用 8 个线程)。当我 startAsync 时,我认为客户端打开了一个流式拉取,它可能会保持打开一段时间(也许)。我的问题是,每个订阅是否有 1 个执行程序,或者是否有所有订阅的执行程序(以及线程池)。我有大约 200 个订阅,所以 4 个线程 x 200 听起来不对。那么如何进行调优呢?我是否只是从一个有 10 个线程处理所有订阅和负载测试的 Executor 开始?如果有人有这方面的经验,很高兴听到你的想法。
【问题讨论】:
您使用哪种语言? 我正在使用 Java 客户端 您可能误解了线程部分。线程正在订阅者上实现。你能更详细地说明你的架构吗?或者您的意思是您在一个订阅中拥有 200 个订阅者?如果默认情况下是这种情况,每个订阅者有 4 个线程,它应该能够处理消息。如果您发现订阅有很多未确认的消息,您可以调整每个订阅者的线程数(可以在 Cloud Monitoring 中查看)。 所以 100 个主题,每个主题有 2 个订阅者。我想知道订阅者是共享一个 ExecutorProvider 还是每个订阅者都拥有自己的执行者?他们的示例非常简单,只有 1 个主题和 1 个订阅者。我只是对我的线程数感到好奇。 所以也许我不应该担心。那里的例子说......“提供用于处理消息的执行程序服务。订阅者使用的默认executorProvider
的默认线程数为5。”因此,默认情况下,每个订阅者必须拥有 5 个线程。所以 200 个拉订阅者......这似乎是很多线程。
【参考方案1】:
默认情况下,Subscriber
的每个实例都有自己的executorProvider
和systemExecutorProvider
,它们会创建多个线程。前者默认创建5 threads,后者默认创建max(6, parallelPullCount)
threads。
可以通过Subscriber.Builder.setExecutorProvider
和Subscriber.Builder.setSystemExecutorProvider
方法设置这些提供程序来覆盖此行为。您可以向他们提供相同的ExecutorProvider
,例如FixedExecutorProvider
。
但是,如果您打算在同一个作业中从 200 个订阅中提取消息,那么如果可以的话,您最好使用push subscriptions。您将在您的作业中设置一个 https 端点,并将所有 200 个订阅的推送端点设置为同一端点。所有消息都可以通过相同的代码路径进行处理,并且您不会为每个消息都添加一个 Subscriber
实例。
【讨论】:
以上是关于Pubsub 拉取订阅和并发的主要内容,如果未能解决你的问题,请参考以下文章
是否可以直接在javascript中调用Pubsub的订阅拉取而不是调用java方法来获取数据?