Design patterns 如何将处理服务器与数据库解耦
我正在构建一个应用程序,它通过web界面接收来自用户的请求,然后执行一些处理,并在可用时返回结果 以下是当前体系结构的简单概述: web应用程序将请求添加到MongoDB中的多个集合中,Design patterns 如何将处理服务器与数据库解耦,design-patterns,architecture,microservices,message-queue,amazon-sqs,Design Patterns,Architecture,Microservices,Message Queue,Amazon Sqs,我正在构建一个应用程序,它通过web界面接收来自用户的请求,然后执行一些处理,并在可用时返回结果 以下是当前体系结构的简单概述: web应用程序将请求添加到MongoDB中的多个集合中,processed字段设置为False。然后是每个集合的处理服务器,它们轮询它们的集合以检查是否有任何未处理的条目。如果是,服务器将执行需要一些时间和成本的处理(外部API调用),然后将结果保存回数据库(output\u data),并将processed设置为True 现在,我的问题是: 我无法为每个模块扩展
processed
字段设置为False。然后是每个集合的处理服务器,它们轮询它们的集合以检查是否有任何未处理的条目。如果是,服务器将执行需要一些时间和成本的处理(外部API调用),然后将结果保存回数据库(output\u data
),并将processed
设置为True
现在,我的问题是:
我目前的开发堆栈是Python、Flask、MongoDB和Docker。我建议您使用消息队列,这将解决您的许多问题。例如,在这里您可以找到使用python的方法
您的工作进程将只等待新消息到达,而不是轮询,从而消除重复处理的问题。它们还可以将结果发送回消息队列,保存工作人员将其保存到任何(不同)数据库。我发现引入消息队列非常适合您的体系结构模式。我建议您使用消息队列,它将解决您的许多问题。例如,在这里您可以找到使用python的方法
您的工作进程将只等待新消息到达,而不是轮询,从而消除重复处理的问题。它们还可以将结果发送回消息队列,保存工作人员将其保存到任何(不同)数据库。我发现引入消息队列非常适合您的体系结构as模式。您可以根据以下体系结构中的需求使用不同的队列
- Redis发布/订阅:
- Kafka/RabitMQ:您可以检查哪个工具适合您的需要
- AWS SQS:(如果您希望使用队列而不需要安装和维护。不同的云提供了队列机制
- 内存队列:缺点是这是易失性的,队列将 系统重新启动/崩溃时丢失。如果您有一些 根据需要重新创建队列的机制。
- Redis发布/订阅:
- Kafka/RabitMQ:您可以检查哪个工具适合您的需要
- AWS SQS:(如果您希望使用队列而不需要安装和维护。不同的云提供了队列机制
- 内存队列:缺点是这是易失性的,队列将 系统重新启动/崩溃时丢失。如果您有一些 根据需要重新创建队列的机制。