是否可以在 Google Cloud SQL 中插入或更新数据时向 Google Pub/Sub 发布消息?
Is it possible to publish a message to Google Pub/Sub whenever a data is inserted or updated in Google Cloud SQL?
我是 Google Cloud SQL 和 Pub/Sub 的新手。我在任何地方都找不到关于此的文档。但是另一个问题的接受和投票 answer 似乎说只要数据库发生插入,就可以发布 Pub/Sub 消息。该回答摘录:
2 - The ideal solution would be to create the Pub/Sub topic and publish to it when you insert new data to the database.
但由于我的问题不同,所以我在这里提出了一个新问题。
背景:我正在为我的应用使用 Google 云 SQL、Firestore 和实时数据库的组合,以发挥其独特的优势。
我想要做的是一旦在 Google 云 SQL 中成功插入,就能够写入 Firestore 和实时数据库。根据上面的回答,这是我应该做的步骤:
- 该应用程序调用云函数将数据插入 Google 云 SQL 数据库 (PostgreSQL)。 注意:Postgres 表有一些重要的约束并触发 Postgres 函数,这就是我们要从这里开始的原因。
- 插入成功后我希望Google云SQL发布消息到Pub/Sub。
- 然后还有一个云函数订阅了Pub/Sub主题。此函数将相应地写入 Firestore / 实时数据库。
我已经搞定了第 1 步和第 3 步。我正在寻找的解决方案适用于步骤 #2。
另一个问题的答案只是建议您的代码执行以下两项操作:
- 写入云端SQL。
- 如果写入成功,发送消息到 pubsub 主题。
没有任何东西可以自动化或简化这些任务。 Cloud Functions 没有触发器可以响应对 Cloud SQL 的写入。您为任务 1 编写代码,然后为任务 2 编写代码。这两件事都应该简单明了,并包含在产品文档中。我建议(分别)尝试这两种方法,然后再次发布您所拥有的代码,但它没有按您预期的方式工作。
如果您需要开始使用 pubsub,几乎每个主要服务器平台都有 SDK,发送消息的文档是 here。
虽然 Google Cloud SQL 不会自动管理触发器,但您可以在 Postgres 中创建触发器:
CREATE OR REPLACE FUNCTION notify_new_record() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('on_new_record', row_to_json(NEW)::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER on_insert
AFTER INSERT ON your_table
FOR EACH ROW EXECUTE FUNCTION notify_new_record();
然后,在您的客户端中收听该事件:
import pg from 'pg'
const client = new pg.Client()
client.connect()
client.query('LISTEN on_new_record') // same as arg to pg_notify
client.on('notification', msg => {
console.log(msg.channel) // on_new_record
console.log(msg.payload) // {"id":"...",...}
// ... do stuff
})
在侦听器中,您可以推送到 pubsub 或云任务,或者直接写入 firebase/firestore(或您需要做的任何事情)。
来源:https://edernegrete.medium.com/psql-event-triggers-in-node-js-ec27a0ba9baa
您还可以查看 Supabase,它现在支持在连续 created/updated/deleted 之后触发云函数(测试版)(本质上是上面的代码,但您会得到一个不错的 UI 进行配置)。
我是 Google Cloud SQL 和 Pub/Sub 的新手。我在任何地方都找不到关于此的文档。但是另一个问题的接受和投票 answer 似乎说只要数据库发生插入,就可以发布 Pub/Sub 消息。该回答摘录:
2 - The ideal solution would be to create the Pub/Sub topic and publish to it when you insert new data to the database.
但由于我的问题不同,所以我在这里提出了一个新问题。
背景:我正在为我的应用使用 Google 云 SQL、Firestore 和实时数据库的组合,以发挥其独特的优势。
我想要做的是一旦在 Google 云 SQL 中成功插入,就能够写入 Firestore 和实时数据库。根据上面的回答,这是我应该做的步骤:
- 该应用程序调用云函数将数据插入 Google 云 SQL 数据库 (PostgreSQL)。 注意:Postgres 表有一些重要的约束并触发 Postgres 函数,这就是我们要从这里开始的原因。
- 插入成功后我希望Google云SQL发布消息到Pub/Sub。
- 然后还有一个云函数订阅了Pub/Sub主题。此函数将相应地写入 Firestore / 实时数据库。
我已经搞定了第 1 步和第 3 步。我正在寻找的解决方案适用于步骤 #2。
另一个问题的答案只是建议您的代码执行以下两项操作:
- 写入云端SQL。
- 如果写入成功,发送消息到 pubsub 主题。
没有任何东西可以自动化或简化这些任务。 Cloud Functions 没有触发器可以响应对 Cloud SQL 的写入。您为任务 1 编写代码,然后为任务 2 编写代码。这两件事都应该简单明了,并包含在产品文档中。我建议(分别)尝试这两种方法,然后再次发布您所拥有的代码,但它没有按您预期的方式工作。
如果您需要开始使用 pubsub,几乎每个主要服务器平台都有 SDK,发送消息的文档是 here。
虽然 Google Cloud SQL 不会自动管理触发器,但您可以在 Postgres 中创建触发器:
CREATE OR REPLACE FUNCTION notify_new_record() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('on_new_record', row_to_json(NEW)::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER on_insert
AFTER INSERT ON your_table
FOR EACH ROW EXECUTE FUNCTION notify_new_record();
然后,在您的客户端中收听该事件:
import pg from 'pg'
const client = new pg.Client()
client.connect()
client.query('LISTEN on_new_record') // same as arg to pg_notify
client.on('notification', msg => {
console.log(msg.channel) // on_new_record
console.log(msg.payload) // {"id":"...",...}
// ... do stuff
})
在侦听器中,您可以推送到 pubsub 或云任务,或者直接写入 firebase/firestore(或您需要做的任何事情)。
来源:https://edernegrete.medium.com/psql-event-triggers-in-node-js-ec27a0ba9baa
您还可以查看 Supabase,它现在支持在连续 created/updated/deleted 之后触发云函数(测试版)(本质上是上面的代码,但您会得到一个不错的 UI 进行配置)。