如何将处理服务器与数据库解耦

How to decouple processing servers from database

我正在构建一个应用程序,该应用程序通过 Web 界面接收来自用户的请求,然后执行一些处理并 returns 结果可用时。

以下是当前架构的简单概述:

Web 应用程序将请求添加到 MongoDB 中的多个集合,其中 processed 字段设置为 False。然后每个集合都有处理服务器,轮询它们的集合以检查是否有任何未处理的条目。如果是,服务器然后执行处理,这需要一些时间和一些成本(外部 API 调用),然后将结果保存回数据库(output_data)并设置 processed 为没错。

现在,我遇到的问题:

  1. 我无法为每个模块扩展处理服务器,因为如果我 运行 两台服务器,那么同一个条目有可能被处理两次并且会产生更多成本对我来说。

  2. 我还想将处理服务器与数据库分离,因为我也想对不同的数据库使用相同的处理服务器(例如:针对不同的客户)

我不太了解队列和pub/sub 体系结构。我认为某种队列架构对实现上述目标很有用,但不确定如何处理重复消息。

请让我知道哪种架构有助于避免上述问题。我更希望该解决方案与云提供商无关,但如果真的需要,我想使用 AWS。

更新: 我目前的开发栈是 Python, Flask, MongoDB, Docker.

我建议您使用消息队列,它将解决您的许多问题。例如,RabbitMQ, here you can find python libraries 使用它。

您的工作进程将简单地等待新消息到达,而不是轮询,从而消除了重复处理的问题。他们还可以将结果发送回消息队列,保存工作人员会将它们保存到任何(不同的)数据库中。我发现引入消息队列非常适合您的架构 publish/subscribe 模式。

您可以根据需要在以下架构中使用不同的队列。

  • Redis Pub/Sub: https://redis.io/topics/pubsub

  • Kafka/RabitMQ:您可以查看哪个工具适合您的需求。

  • AWS SQS:https://aws.amazon.com/sqs/(如果想使用队列免去安装维护的麻烦,不同的云提供了队列机制。

  • 在内存队列中:缺点是这是易变的,队列将是 系统丢失时restarts/crashes。如果你有一些可以使用 如果需要,重新创建队列的机制。