在主题之间移动Google发布/订阅消息

时间:2020-07-29 15:26:54

标签: google-cloud-platform google-cloud-pubsub

如何在GCP发布/订阅中将邮件从一个主题批量转移到另一个主题?

我知道提供此功能的Dataflow模板,但是很遗憾,限制使我无法使用Dataflow API。

关于主题之间消息临时传输的任何建议(除了一对一复制和粘贴?)

具体地说,用例是将死信主题中的消息移回原始主题以进行重新处理。

2 个答案:

答案 0 :(得分:0)

您不能使用快照,因为快照只能应用于相同主题的订阅(以避免消息ID重叠)。

最简单的方法是编写一个函数来拉您的订阅。在这里,我将如何做:

全球流程:

  • 在转移主题中发布消息
  • 该消息触发通过推送HTTP运行的功能/云
  • 该过程提取消息并将其重新发布到初始主题中
  • 如果达到超时,函数崩溃和PubSub将重试HTTP请求(根据指数补偿)。
  • 如果处理了所有消息,则返回HTTP 200响应代码,并且过程停止(并且将消息确认到转移主题订阅中)

此过程使您可以处理大量消息,而不必担心超时。

答案 1 :(得分:0)

我建议您为此使用Python脚本。 您可以使用 PubSub CLI 阅读消息并发布到另一个主题,如下所示:

from google.cloud import pubsub
from google.cloud.pubsub import types

# Defining parameters
PROJECT = "<your_project_id>" 
SUBSCRIPTION = "<your_current_subscription_name>"
NEW_TOPIC = "projects/<your_project_id>/topics/<your_new_topic_name>"


# Creating clients for publishing and subscribing. Adjust the max_messages for your purpose
subscriber = pubsub.SubscriberClient()
publisher = pubsub.PublisherClient(
    batch_settings=types.BatchSettings(max_messages=500),
)

# Get your messages. Adjust the max_messages for your purpose
subscription_path = subscriber.subscription_path(PROJECT, SUBSCRIPTION)
response = subscriber.pull(subscription_path, max_messages=500)

# Publish your messages to the new topic
for msg in response.received_messages:
    publisher.publish(NEW_TOPIC, msg.message.data)


# Ack the old subscription if necessary
ack_ids = [msg.ack_id for msg in response.received_messages]
subscriber.acknowledge(subscription_path, ack_ids)

在运行此代码之前,您需要在 Python 环境中安装 PubSub CLI 。您可以运行pip install google-cloud-pubsub

一种执行代码的方法是使用 Cloud Functions 。如果决定使用它,请注意两点:

  1. 您的功能最多可以运行9分钟。如果超过此超时时间,您的功能将终止,而不会完成工作。

  2. 在Cloud Functions中,您可以仅将google-cloud-pubsub放入需求文件的新行中,而无需运行pip命令。