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