Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何将处理服务器与数据库解耦_Design Patterns_Architecture_Microservices_Message Queue_Amazon Sqs - Fatal编程技术网

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

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 现在,我的问题是: 我无法为每个模块扩展

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

以下是当前体系结构的简单概述:

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

现在,我的问题是:

  • 我无法为每个模块扩展处理服务器,因为如果我运行两台服务器,则同一条目有可能被处理两次,并且会给我带来更多成本

  • 我还希望将处理服务器与数据库分离,因为我还希望将相同的处理服务器与不同的数据库一起使用(例如:针对不同的客户)

  • 我不太了解队列和发布/订阅架构。我认为某种队列体系结构在实现上述功能时会很有用,但不确定如何处理重复消息

    请让我知道什么体系结构将有助于避免上述问题。我更喜欢云提供商不可知的解决方案,但如果真的需要,我会选择AWS

    更新:
    我目前的开发堆栈是Python、Flask、MongoDB和Docker。

    我建议您使用消息队列,这将解决您的许多问题。例如,在这里您可以找到使用python的方法


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

    我建议您使用消息队列,它将解决您的许多问题。例如,在这里您可以找到使用python的方法


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

    您可以根据以下体系结构中的需求使用不同的队列

    • Redis发布/订阅:

    • Kafka/RabitMQ:您可以检查哪个工具适合您的需要

    • AWS SQS:(如果您希望使用队列而不需要安装和维护。不同的云提供了队列机制

    • 内存队列:缺点是这是易失性的,队列将 系统重新启动/崩溃时丢失。如果您有一些 根据需要重新创建队列的机制。


    您可以根据以下体系结构中的需求使用不同的队列

    • Redis发布/订阅:

    • Kafka/RabitMQ:您可以检查哪个工具适合您的需要

    • AWS SQS:(如果您希望使用队列而不需要安装和维护。不同的云提供了队列机制

    • 内存队列:缺点是这是易失性的,队列将 系统重新启动/崩溃时丢失。如果您有一些 根据需要重新创建队列的机制。


    web应用程序实际上是在等待结果吗?还是它启动并忘记,然后提供一种单独的方法来检查结果?换句话说,这部分过程是否设计为支持异步方法?是的,web应用程序是异步的,用户可以稍后通过从列表中选择请求来查看结果。我发现alex的下面的nswer完美适用于我的用例是web应用程序实际上在等待结果吗?还是它启动并忘记,然后提供一种单独的方法来检查结果?换句话说,这部分过程是否设计为支持异步方法?是的,web应用程序是异步的,用户可以稍后通过选择requ来查看结果我发现下面alex的答案非常适合我的用例