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

Jon*_*anW 6 google-cloud-platform google-cloud-pubsub google-cloud-dataflow

我正在设置一个简单的概念证明来学习 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}`);
};
Run Code Online (Sandbox Code Playgroud)

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

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);
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

小智 12

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

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

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