简介

Ably-Postgres连接器由我们长期的社区专家Apoorv Vardhan建立,它可以监听Postgres表中的变化,并在变化发生时在Ably频道上发布实时消息。
潜入Ably实验室GitHub上的项目,自己尝试一下。
该连接器可以建立数据库驱动的实时应用程序,其中长期存储和以前发布的消息的更新触发是必不可少的。一个这样的例子是一个可编辑的聊天应用程序,我们将在本文后面讨论这个问题。
该连接器是如何工作的?
Apoorv解释说,连接器接受一个配置文件,在该文件中你可以输入数据库的连接细节和你想监听的数据变化的表。它还接受一个Ably API密钥,以便在指定的表发生变化后,能够实例化并向你的Ably应用发布消息。
使用配置文件,连接器在你的数据库中创建一个特殊的表,称为ablycontroltable 。这个表用于维护Ably通道映射,以应对你数据库中的表的各种变化。
接下来,连接器使用pg_notify 函数创建一个程序来监听指定表的变化。然后,这个通知函数在相关的Ably通道上发布变化数据捕获(CDC)的有效载荷,如配置中指定的。

下面是一个你需要提供给连接器的配置例子:
{
"dbConfig": {
"host": "db",
"port": 5432,
"user": "postgres",
"password": "postgres",
"database": "mydb"
},
"connector": [
{
"tablename": "chat",
"ablychannelname": "ably-chat-added",
"operation": "INSERT"
},
{
"tablename": "chat",
"ablychannelname": "ably-chat-updated",
"operation": "UPDATE"
},
{
"tablename": "chat",
"ablychannelname": "ably-chat-deleted",
"operation": "DELETE"
}
],
"ably": {
"apiKey": "API_KEY"
}
}
你可以选择通过上面的JSON文件或环境变量来提供这个配置。
你能用这个连接器做什么?
如果你想在你的应用架构中采用数据库驱动的方法,就像使用Firebase或Supabase一样,这个连接器可以轻松实现。
正如你可能知道的,Ably默认不提供长期存储。它是一个发布/订阅消息的基础设施,可以扩展到任意的水平。Ably的消息是瞬时的。人们实现长期存储的最常见的方式是将通道中的所有数据发布到数据库中,与其他客户端同时发布(本质上,数据库本身表现得像一个客户端)。数据库查询是通过Ably的集成仪表板上设置的预配置的Webhook端点进行的。Ably-Airtable启动套件展示了这样一个架构的例子。
虽然这种方法非常有用和直接,但它确实存在这样的问题,即对以前存储的数据的任何更新都不会传播给相关方。
考虑一个聊天应用程序的例子,你可以编辑以前发布的消息。从本质上讲,Ably消息是不可改变的。你发布一个更新,它就会被传播给所有的订阅者。但是你如何在这种消息上实现可编辑的功能呢?这正是Ably-Postgres连接器所要解决的问题。
查看Ably-Postgres连接器的运行情况
让我们来看看可以编辑消息的完全无服务器和可扩展的聊天应用演示的架构。
在用Ably这样的服务构建聊天应用时,一个明显的架构模式是在一个频道上发布消息,并确保所有参与者都订阅了该频道,以便他们能收到更新。让我们稍微改变一下,把传出和传入的聊天频道分开。这让我们有机会在发布者和订阅者之间添加额外的组件。
在我们的案例中,我们将添加数据库作为发布者和订阅者之间的一个额外组件。我们将利用各种技术服务将消息从Ably进入数据库,然后再从数据库回到Ably,这样所有的前端客户端就可以实时地相互聊天。
让我们通过一张图来了解这个架构:

可编辑的聊天应用程序架构
- 当客户发送新的聊天信息或编辑现有信息时,这个更新会通过'outgoing-chat'Ably通道传递。
- 因此,Ably会触发一个预先配置好的Lambda函数,并将聊天信息的有效载荷发布给它。
- Lambda函数会检查触发是由于新消息还是编辑过的消息。根据这一点,它将在Postgres数据库中 "插入 "一条带有聊天信息数据的新行,或 "更新 "一条带有编辑过的信息的现有行,并将该行标记为已编辑。
- 当这种情况发生时,Ably-Postgres连接器已经在观察Postgres数据库的任何变化,所以当出现 "UPDATE "或 "INSERT "时,连接器将把数据发布到Ably的 "incoming-chat "Ably频道上。
- 鉴于我们的聊天客户已经订阅了'incoming-chat',他们会实时收到这个更新。
在这个架构中,PostgresDB托管在AWS RDS上,而Ably-Postgres连接器被容器化并托管在AWS Fargate上。把它们放在同一个基础设施设置中,为这些非Ably的组件提供了一个简单的方法,使它们能够相互沟通,并根据需要自动扩展。当然,任何其他的选择也应该很好地工作。
这个演示是在serverless-scalable-chat.netlify.app/。欢迎查看源代码和深入阅读README以了解更多的细节。请继续关注未来的文章,我们将更详细地了解这个演示。
在之前的一篇关于Firebase中实时通信与存储解耦的文章中,我写了一个类似的架构,只是这次是用PostgresDB,使用其固有的监听/通知功能。
总结
Ably-Postgres连接器开辟了一套全新的机会和应用架构,我们可以利用它来构建强大的实时功能。它为我们提供了一种方法,将长期存储与触发先前存储数据的实时更新的能力相结合。
该连接器目前可以通过GitHub和NPM直接使用。它是一个完全开源的项目,我们将继续更新它的新功能和改进。请查看它,并随时做出贡献。