这将是一个棘手的问题,但无论如何我都会尝试:我们的任务是为 Microsoft FAST ESP 提供千兆字节的数据。最终的索引数据量在 50-60GB 左右。
FAST 有一个 .NET API,但核心组件是用 Python 编写的(处理管道以索引文档)。挑战在于可靠地与系统通信,同时为其提供千兆字节的数据以进行索引。
FAST 在这里出现的问题是:
当系统一次输入太多数据时,系统会变得古怪,因为它想要重新索引其数据,在此期间系统数小时内都无法访问。不可接受。
将所有数据排队并一次连续提供一个项目不是一种选择,因为这将花费太长时间(几天)。
当 FAST 无法索引某个项目时,客户端必须重新输入该项目。为此,系统应该调用一个回调方法来通知客户端失败。但是,每当系统超时时,馈送客户端都无法对超时做出反应,因为从未调用过该回调。因此,客户正在挨饿。数据在队列中,但无法传递给系统。队列崩溃。数据丢失。你明白了。
笔记:
- 喂食一件小件物品可能需要几秒钟,一件大件物品可能需要 5-8 小时。
- 被索引的项目是基于二进制和文本的。
- 目标是完整索引“仅”需要 48-72 小时,即它必须在周末进行。
- 这里的 FAST 文档处理管道(Python 代码)每个都有大约 30 个阶段。截至撰写本文时,共有 27 条管道。
总之:
主要的挑战是以适当的速度为系统提供大大小小的项目(不要太快,因为它可能会崩溃或遇到内存问题;不要太慢,因为这会花费太长时间),同时并行方式类似于异步运行的线程。在我看来,必须有一种算法来决定何时喂食什么物品以及一次喂食多少。我想到了并行编程。
也可能有多个“队列”,其中每个队列(进程)专用于特定大小的项目,这些项目被加载到队列中,然后一个接一个地馈送(在工作线程中)。
我很好奇是否有人做过这样的事情,或者你将如何解决这样的问题。
编辑:同样,我不打算“修复” FAST ESP 或改进其内部运作。挑战在于有效地使用它!