【发布时间】:2022-02-06 22:52:15
【问题描述】:
技术栈 - Python、Rabbitmq、Elasticsearch、Heroku
我有一个应用程序,它根据某个时间表在应用程序中添加内容,当添加内容时,需要根据某些条件向某些用户触发电子邮件(可能是大约 100 万用户)
我决定的设计是第一个应用程序(生产者)将发布内容,然后在 Rabbitmq(消息代理)中放置一条消息,其中包含每个应该收到电子邮件的用户的用户 ID 和电子邮件地址,所以基本上添加大约 100 万条消息到 Rabbitmq,然后电子邮件将通过电子邮件应用程序(消费者)发送
我的问题是关于生产者应用程序的。它将从 elasticsearch 获取用户 ID 列表并开始使用 for 循环将它们添加到队列中,但如果由于某种原因此应用程序出现故障(例如在新的情况下)部署),那么只有少数用户将被添加到队列中,当应用程序返回时,它将再次开始排队,我们最终可能会收到重复的电子邮件给相同的用户。 有没有一种标准方法可以避免这种情况。似乎是一个非常常见的问题。
我正在考虑在我的生产者应用程序数据库中维护来自消费者应用程序的消息确认(针对给定内容的每个用户)。但感觉这可能会在发送几封电子邮件后导致我的 PostgreSQL 数据库中的记录爆炸。每个内容可以通过电子邮件触发约 100 万用户。
【问题讨论】:
标签: architecture rabbitmq microservices message-queue