数据流模板 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 请求发布