微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将处理服务器与数据库分离

如何解决如何将处理服务器与数据库分离

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

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

Architecture

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

现在,我遇到的问题:

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

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

我对队列和发布/订阅架构知之甚少。我认为某种队列架构对实现上述目标很有用,但不确定如何处理重复消息。

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

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

解决方法

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

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

,

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

  • Redis 发布/订阅:https://redis.io/topics/pubsub

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

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

  • 在内存队列中:缺点是这是不稳定的,队列将 系统重启/崩溃时丢失。如果你有一些可以使用 如果需要,重新创建队列的机制。 You can use the Queue based on your requirements

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。