【发布时间】:2012-01-08 01:45:20
【问题描述】:
服务器 A 有一个将 n 个数据库表导出为平面文件的进程。 服务器 B 包含将平面文件加载到 DW 设备数据库中的实用程序。
一个进程在服务器 A 上运行,它导出和压缩大约 50-75 个表。每次导出一个表并生成一个文件时,也会生成一个 .flag 文件。
服务器 B 有一个 bash 进程,它重复检查服务器 A 生成的每个 .flag 文件。它通过连接到 A 并检查文件是否存在来做到这一点。如果标志文件存在,服务器 B 将从服务器 A scp 文件,解压缩,并将其加载到分析数据库中。如果该文件尚不存在,它将休眠 n 秒并重试。对服务器 B 期望在服务器 A 上找到的每个表/文件重复此过程。该过程串行执行,一次处理一个文件。
另外:在服务器 A 上运行的进程无法将文件“推送”到服务器 B。由于文件大小和地理问题,服务器 A 无法将平面文件加载到 DW 设备中。
我发现这个过程很麻烦,并且恰好需要重写/改造。我提出了一个基于消息传递的解决方案。我最初认为这将是 RabbitMQ(或类似)的一个很好的候选者
服务器 A 会写入一个文件,对其进行压缩,然后为队列生成一条消息。
服务器 B 将订阅队列并处理消息正文中指定的文件。
我觉得基于消息传递的方法不仅可以节省时间,因为它可以消除每个表的检查-等待-重复循环,而且还允许我们并行运行进程(因为没有依赖关系)。
我向我的团队展示了使用 RabbitMQ 的概念验证,他们都接受使用消息传递。他们中的一些人很快发现了我们可以从基于消息的处理中受益的其他机会。我们将从实现消息传递中受益的一个领域是实时填充我们的 DW 维度,而不是通过批处理。
然后我突然想到,考虑到低容量(50-75 个任务),基于 MQ 的解决方案可能会过大。考虑到我们的运营团队必须安装 RabbitMQ(及其依赖项,包括 Erlang),这可能有点过头了,而且还会带来新的管理难题。
然后我意识到这可以通过基于 REST 的解决方案变得更简单。服务器 A 可以生成一个文件,然后对服务器 B 上的简单 (web.py) Web 服务进行 HTTP 调用。然后,服务器 B 可以根据调用的 URL 启动传输和加载过程。考虑到传输、解压缩和加载每个文件所需的时间,我可能会使用 Python 的多处理来创建一个加载每个文件的子进程。
我认为基于 REST 的解决方案是一个想法,因为它更简单。在我看来,使用 MQ 更适合处理大量任务,但我们(目前)只谈论 50-75 次操作,未来可能还会更多。
考虑到我的要求和数量,基于 REST 的解决方案会是一个好的解决方案吗?是否有其他框架或 OSS 产品已经这样做了?我希望在不造成其他管理和开发难题的情况下添加消息传递。
【问题讨论】:
-
更新感谢大家 - 我支持 Zookeeper 进行这个项目!
标签: python rest concurrency message-queue data-warehouse