如何在Akka中建模非常大的工作队列?

时间:2016-08-15 02:12:39

标签: scala concurrency queue akka bigdata

我正在编写一个scala脚本来从黑客新闻API下载所有项目。有大约12M个项目,每个项目都是〜200字节的JSON。

我发现了以下问题:

  • 存储数据:我试图将每个项目保存为单个JSON文件,但只是几乎没有列出它们(使用Linux,ext4文件系统)变得非常困难。所以我把它改成只是将JSON项附加到多个(100)文件(通过获取项目的id模块100)。

  • 跟踪已下载的内容,因为我希望能够停止/继续该应用程序。首先,我尝试将下载的id写入文本文件,但结果有点儿错误。所以现在我只是阅读所有项目并收集ID。 (它有效。)

所有这一切都是由1名主演员和任意数量的工人演员(数十名)完成的。大师有一个队列[Int]并弹出它,工人要求工作。

我遇到的问题相当简单,但我还没能以一种很好的方式解决它。

我可以从列表中已下载的项目中收集ID。但我真正需要的是对那一套的补充;我需要所有未下载的项目,最高项目ID。

我尝试使用范围(1到maxItemId)并减去已完成的作业集,但它确实很慢。太快了。

现在我正在使用Stream,当一个工作人员要求工作时,我会检查流(下一个工作)是否已经完成。如果是这样,我会把它交给工人。否则我会检查下一个。

这种方法的问题在于,如果失败,我就无法将作业放回流中。使用Queue会很容易;但是我再次设置数百万项的队列时遇到了麻烦。

对此更好的方法是什么?我不认为这里的问题是微不足道的,这是要执行和跟踪的大量任务,但它也不应该那么难。

谢谢!

1 个答案:

答案 0 :(得分:0)

据我了解你的问题,我认为你不需要这里非常复杂的数据结构。

假设您的ID从1到maxItemId是连续的,您可以使用大小为Boolean的{​​{1}}数组来跟踪已处理的项目。您可以通过读取已处理的ID来初始化此数组。您可以通过搜索下一个maxItemId条目找到下一个作业。

假设你的false大约是12M,那么迭代所有项目几乎是瞬间完成的。