我是Google Cloud SQL和Pub/Sub的新手。我在任何地方都找不到关于这件事的文档。但另一个问题的公认和投票结果似乎表明,只要数据库发生插入,就可以发布Pub/Sub消息。答案摘录:
2-理想的解决方案是创建Pub/Sub主题,并在将新数据插入数据库时发布到该主题。
但由于我的问题不同,因此我在这里提出了一个新问题。
背景:我的应用程序结合了谷歌云SQL、Firestore和实时数据库,具有其独特的优势。
我想做的是,一旦在Google Cloud SQL中成功插入,就能够写入Firestore和Realtime数据库。根据上面的答案,这是我应该做的步骤:
- 该应用程序调用云函数将数据插入谷歌云SQL数据库(PostgreSQL(注意:Postgres表有一些重要的约束和触发Postgres函数,这就是我们想要从这里开始的原因
- 当插入成功时,我希望Google Cloud SQL向Pub/Sub发布一条消息
- 然后还有另一个订阅Pub/Sub主题的Cloud Function。此函数将相应地写入Firestore/Retime数据库
我得到了步骤#1&3个都明白了。我正在寻找的解决方案是步骤#2。
如注释中所述,您现在可以使用https://cloud.google.com/datastream
原始答案:
虽然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
您还可以查看Supadase,它现在支持在创建/更新/删除行后触发云功能(测试版((基本上完成了上面的代码,但您可以获得一个很好的UI来配置它(。
另一个问题的答案只是建议您的代码同时执行以下两项:
- 写入云SQL
- 如果写入成功,请向pubsub主题发送消息
没有任何东西可以自动化或简化这两项任务。云函数没有触发器可以响应对云SQL的写入。您为任务1编写代码,然后为任务2编写代码。这两件事都应该简单明了,并在产品文档中进行介绍。我建议(分别(尝试一下这两种方法,并用你所拥有的代码再次发布,但这些代码并没有按你预期的方式工作。
如果你需要开始使用pubsub,几乎每个主要的服务器平台都有SDK,发送消息的文档就在这里。