数据流模板云发布/订阅主题vs订阅BigQuery

时间:2019-05-16 16:20:12

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

我正在建立一个简单的概念证明,以学习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个模板可以完成此任务:

在这种情况下,我不理解“主题”和“订阅”之间的区别。

https://medium.com/google-cloud/new-updates-to-pub-sub-to-bigquery-templates-7844444e6068散发出一点光:

  

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

但是我必须说,我仍然迷失了其理解的真正含义。

1 个答案:

答案 0 :(得分:2)

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

您可以通过创建从同一主题读取的多个连接到订阅的BigQuery管道,使用“订阅到BigQuery模板”来模拟“主题到BigQuery”模板的行为。

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