如何将处理服务器与数据库解耦
How to decouple processing servers from database
我正在构建一个应用程序,该应用程序通过 Web 界面接收来自用户的请求,然后执行一些处理并 returns 结果可用时。
以下是当前架构的简单概述:
Web 应用程序将请求添加到 MongoDB 中的多个集合,其中 processed
字段设置为 False。然后每个集合都有处理服务器,轮询它们的集合以检查是否有任何未处理的条目。如果是,服务器然后执行处理,这需要一些时间和一些成本(外部 API 调用),然后将结果保存回数据库(output_data
)并设置 processed
为没错。
现在,我遇到的问题:
我无法为每个模块扩展处理服务器,因为如果我 运行 两台服务器,那么同一个条目有可能被处理两次并且会产生更多成本对我来说。
我还想将处理服务器与数据库分离,因为我也想对不同的数据库使用相同的处理服务器(例如:针对不同的客户)
我不太了解队列和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。如果你有一些可以使用
如果需要,重新创建队列的机制。
我正在构建一个应用程序,该应用程序通过 Web 界面接收来自用户的请求,然后执行一些处理并 returns 结果可用时。
以下是当前架构的简单概述:
Web 应用程序将请求添加到 MongoDB 中的多个集合,其中 processed
字段设置为 False。然后每个集合都有处理服务器,轮询它们的集合以检查是否有任何未处理的条目。如果是,服务器然后执行处理,这需要一些时间和一些成本(外部 API 调用),然后将结果保存回数据库(output_data
)并设置 processed
为没错。
现在,我遇到的问题:
我无法为每个模块扩展处理服务器,因为如果我 运行 两台服务器,那么同一个条目有可能被处理两次并且会产生更多成本对我来说。
我还想将处理服务器与数据库分离,因为我也想对不同的数据库使用相同的处理服务器(例如:针对不同的客户)
我不太了解队列和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。如果你有一些可以使用 如果需要,重新创建队列的机制。