将 PostgreSQL 通知放入 AWS SQS 队列
Getting PostgreSQL notifications into an AWS SQS Queue
我正在开发的一个应用程序使用 AFTER CREATE/UPDATE/DELETE
触发器在系统内发生某些操作时创建 pg_notify
通知。目前,我们有一个小型 Node.JS 应用程序,它 LISTEN
用于事件,然后立即转身并将它们发布到 AWS SNS 主题,该主题被转发到我们的 SQS 事件队列。从该队列中,我们根据事件触发各种事情(电子邮件、SMS、lambda、长 运行ning 作业等)。
此体系结构运行良好,但位于 PostgreSQL 实例和 SNS 主题之间的 Node.JS 应用程序似乎有点脆弱。我真的不能 运行 在两个可用区中复制两份,因为消息会重复。
我正在寻找将这些 Postgres 通知导入 SQS 的更好方法。有什么选择吗?如果 Postgres Aurora 有什么东西,我们可能会考虑。
我找到的一些选项:
继续当前方法
我可以保留当前从我的 PostgreSQL RDS 重定向事件并将它们转储到 SNS->SQS 的小型应用程序。我可以将其部署在 1 region/max 1/min 1 自动缩放组中,以确保一次不超过副本 运行ning。
放弃我的 RDS 并使用自托管数据库
我可以在 EC2 实例上放弃 RDS 和 运行 PostgreSQL,然后使用 PL/Python 和 AWS-SDK 来调用 SNS,而不是使用 pg_notify
。我不喜欢这个主意,因为我失去了 RDS 的易用性。
目前,我将坚持使用当前方法,除非有人有其他想法可供我探索。我相信将来会有更多选择(比如 Aurora PostgreSQL 添加对调用 Lambda 的支持,就像 Aurora MySQL 那样)。
使用您当前的 LISTEN
小型应用程序策略来处理事件。只需在该应用程序和您的事件订阅者之间引入重复数据删除步骤。这将允许您 运行 您的应用程序的多个实例。
例如,您可以使用 FIFO SQS 队列。这些会自动删除重复的消息。由于 FIFO 队列无法订阅 SNS,因此您需要将消息直接放入队列而不是通过 SNS。
或者,您可以使用 DynamoDB 存储最近消息的校验和,如果您的应用遇到重复消息,请手动删除它(确保使用条件写入来防止竞争条件)。
我正在开发的一个应用程序使用 AFTER CREATE/UPDATE/DELETE
触发器在系统内发生某些操作时创建 pg_notify
通知。目前,我们有一个小型 Node.JS 应用程序,它 LISTEN
用于事件,然后立即转身并将它们发布到 AWS SNS 主题,该主题被转发到我们的 SQS 事件队列。从该队列中,我们根据事件触发各种事情(电子邮件、SMS、lambda、长 运行ning 作业等)。
此体系结构运行良好,但位于 PostgreSQL 实例和 SNS 主题之间的 Node.JS 应用程序似乎有点脆弱。我真的不能 运行 在两个可用区中复制两份,因为消息会重复。
我正在寻找将这些 Postgres 通知导入 SQS 的更好方法。有什么选择吗?如果 Postgres Aurora 有什么东西,我们可能会考虑。
我找到的一些选项:
继续当前方法
我可以保留当前从我的 PostgreSQL RDS 重定向事件并将它们转储到 SNS->SQS 的小型应用程序。我可以将其部署在 1 region/max 1/min 1 自动缩放组中,以确保一次不超过副本 运行ning。
放弃我的 RDS 并使用自托管数据库
我可以在 EC2 实例上放弃 RDS 和 运行 PostgreSQL,然后使用 PL/Python 和 AWS-SDK 来调用 SNS,而不是使用 pg_notify
。我不喜欢这个主意,因为我失去了 RDS 的易用性。
目前,我将坚持使用当前方法,除非有人有其他想法可供我探索。我相信将来会有更多选择(比如 Aurora PostgreSQL 添加对调用 Lambda 的支持,就像 Aurora MySQL 那样)。
使用您当前的 LISTEN
小型应用程序策略来处理事件。只需在该应用程序和您的事件订阅者之间引入重复数据删除步骤。这将允许您 运行 您的应用程序的多个实例。
例如,您可以使用 FIFO SQS 队列。这些会自动删除重复的消息。由于 FIFO 队列无法订阅 SNS,因此您需要将消息直接放入队列而不是通过 SNS。
或者,您可以使用 DynamoDB 存储最近消息的校验和,如果您的应用遇到重复消息,请手动删除它(确保使用条件写入来防止竞争条件)。