Google Pub/Sub - 多个订阅同一主题以通过 REST API 减少负载?

Posted

技术标签:

【中文标题】Google Pub/Sub - 多个订阅同一主题以通过 REST API 减少负载?【英文标题】:Google Pub/Sub - Multiple subscriptions to same topic to reduce load via REST API? 【发布时间】:2017-07-21 05:22:42 【问题描述】:

一个主题会有一个发布者。假设每秒 1000 条消息。

我可以通过让多个端点接收消息来平衡这些负载吗?

这就是我想做的: (Google Pub/Sub 的 REST API 是否允许这样做?)

JMS 2.0 提供了一个解决方案。您可以使用新方法创建“共享”非持久订阅:createSharedConsumer。此方法在 Session(用于使用经典 API 的应用程序)和 JMSContext(用于使用简化 API 的应用程序)上都可用。由于两个 JVM 需要能够识别它们需要共享的订阅,因此它们需要提供一个名称来识别共享订阅,如清单 2 所示。

private void createSharedConsumer(ConnectionFactory connectionFactory, Topic topic) throws JMSException 
   Connection connection = connectionFactory.createConnection();
   Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
   MessageConsumer messageConsumer = session.createSharedConsumer(topic,"mySubscription");
   connection.start();
   Message message = messageConsumer.receive(10000);
   while (message != null) 
      System.out.println("Message received: " + ((TextMessage) message).getText());
      message = messageConsumer.receive(10000);
   
   connection.close();

清单 2

如果您在两个单独的 JVM 中运行清单 2 中的代码,则发送到主题的每条消息都将传递给两个消费者中的一个或另一个。这允许他们共享处理来自订阅的消息的工作。

http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html

JMS 2.0 规范描述了共享订阅的概念,其中多个订阅者/消费者共享(也称为负载平衡)在一个主题上发布的消息。所有消费者使用相同的订阅 ID。

【问题讨论】:

【参考方案1】:

我刚刚发现了这个:

负载平衡多个订阅者可以对同一个“共享”订阅进行拉取调用。每个订阅者都会收到消息的一个子集。推送端点可以是负载均衡器。

来自https://cloud.google.com/pubsub/docs/subscriber

【讨论】:

以上是关于Google Pub/Sub - 多个订阅同一主题以通过 REST API 减少负载?的主要内容,如果未能解决你的问题,请参考以下文章

Google Pub/Sub + Cloud Run 生成多个容器

无法使用服务帐户订阅 google pub 子主题

如何使用当前的 pubsub 订阅者从 google Pub/Sub 系统获取消息

如何通过转发到死信主题来限制 Google Pub/Sub 交付尝试?

GCP Pub/Sub 消息发送到创建主题之前存在的订阅

确认后一次又一次收到来自Google Pub / Sub订阅的消息[Heisenbug]