数据流模板 Cloud Pub/Sub 主题与订阅 BigQuery

Posted

技术标签:

【中文标题】数据流模板 Cloud Pub/Sub 主题与订阅 BigQuery【英文标题】:Dataflow Template Cloud Pub/Sub Topic vs Subscription to BigQuery 【发布时间】:2019-10-03 23:36:15 【问题描述】:

我正在设置一个简单的概念证明来学习 Google Cloud 中的一些概念,特别是 PubSub 和 Dataflow。

我有一个 PubSub 主题 greeting

我创建了一个简单的云函数,向该主题发送发布消息:

const escapehtml = require('escape-html');
const  Buffer  = require('safe-buffer');
const  PubSub  = require('@google-cloud/pubsub');

exports.publishGreetingHTTP = async (req, res) => 
    let name = 'no name provided';
    if (req.query && req.query.name) 
        name = escapeHtml(req.query.name);
     else if (req.body && req.body.name) 
        name = escapeHtml(req.body.name);
    
    const pubsub = new PubSub();
    const topicName = 'greeting';
    const data = JSON.stringify( hello: name );
    const dataBuffer = Buffer.from(data);
    const messageId = await pubsub.topic(topicName).publish(dataBuffer);
    res.send(`Message $messageId published. name=$name`);
;

我设置了一个由主题触发的不同云功能:

const  Buffer  = require('safe-buffer');

exports.subscribeGreetingPubSub = (data) => 
    const pubSubMessage = data;
    const passedData = pubSubMessage.data ? JSON.parse(Buffer.from(pubSubMessage.data, 'base64').toString()) :  error: 'no data' ;

    console.log(passedData);
;

这很好用,我看到它已注册为该主题的订阅。

现在我想发送使用 Dataflow 将数据发送到 BigQuery

似乎有 2 个模板可以完成此操作:

Cloud Pub/Sub Subscription to BigQuery Cloud Pub/Sub Topic to BigQuery

我不明白在这种情况下主题和订阅之间的区别。

https://medium.com/google-cloud/new-updates-to-pub-sub-to-bigquery-templates-7844444e6068 点灯:

请注意,在主题上使用订阅的一个警告是订阅只能读取一次,而主题可以多次读取。因此一个订阅模板不能支持多个并发管道读取同一个订阅。

但我必须说,我仍然无法理解这件事的真正含义。

【问题讨论】:

【参考方案1】:

如果您使用主题到 BigQuery 模板,Dataflow 会在后台为您创建一个订阅,该订阅会读取指定主题。如果您使用订阅 BigQuery 模板,则需要提供自己的订阅。

您可以使用 Subscription to BigQuery 模板来模拟 Topic to BigQuery 模板的行为,方法是创建多个订阅连接的 BigQuery 管道,从同一主题中读取数据。

对于新部署,首选使用订阅 BigQuery 模板。如果您使用 BigQuery 模板停止并重新启动管道,则会创建一个新订阅,这可能会导致您错过一些在管道关闭时发布的消息。订阅 BigQuery 模板没有这个缺点,因为即使在管道重新启动后它也使用相同的订阅。

【讨论】:

以上是关于数据流模板 Cloud Pub/Sub 主题与订阅 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

Dataflow 是不是应该使用来自 Pub/Sub 主题或订阅的事件? [复制]

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

Google Cloud Pub/Sub,使用 HTTP PUSH 请求发布

Google Cloud Pub/Sub 获取或创建订阅

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

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期