2014-11-02 130 views
0

这是一个初学者Akka的问题(也许我看到的是各处的演员)演员的细节如何?

我有一个sql表“书”。 (500万行)我想运行的查询需要尽可能快。 Where子句非常复杂。我希望查询在一秒钟内运行。这就是为什么我需要一个纯粹的内存解决方案

是否有意义的每个书行有一个演员?

有了这个设计,我将有一个“bookManagerActor”,这将管理其500万的孩子“bookActors”

的“bookMangerActor”应该回复到像“日期过滤书籍”或信息“按日期排序的书籍和名称“(排序和过滤可能需要一些时间,过滤器可以组成)

或者我应该只在我的bookManagerActor中使用java.util.Set? 作为参与者建模单本书可以获得什么好处吗?

+2

定义“管理”。 – rightfold 2014-11-02 15:14:54

+1

你希望通过创造500万演员获得什么好处?这听起来像是你想利用Akka来对你的列表进行排序,但是你应该真的让数据库处理它 - 这就是它的设计目的。不清楚你使用'Set'的意思,但如果这也意味着保留500万件内存,那可能不会很好。 – 2014-11-02 15:17:08

+0

实际上这些书被分类在项目中。因此,当请求进入bookManagerActor时,将正确的书籍加载到内存中。 bookManagerActor也可以缓存应用于书籍的过滤器。 – jack 2014-11-02 15:19:21

回答

2

我没有看到在这种情况下使用演员的好处,是的5百万演员是一些要求。

我会使用不可变的HashMap来存储缓存角色中的书籍。

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.HashMap

+0

这就是我也感受到的......但是如果一个演员是400 kb,500万就意味着1.9 GB) – jack 2014-11-02 15:24:53

+1

@jack **加上**你在那个演员中存储的任何内容,这将会很快加起来。 – 2014-11-02 15:33:10

2

还有就是可以处理数据库的并发连接的数量有限,所以它是没有意义的创造比这更多的演员 - 他们将不得不等待对方来进行查询。我建议在整个表中有一个演员,最终可以将查询委托给“工作人员”,即。它的小孩演员。 actor-manager将计算剩余的连接数量,并为新查询创建一个worker或将查询发送给一个已经存在的worker。

+0

对不起,我应该在问题中提到它。 sql查询和排序只需要很长时间。我需要一个纯内存解决方案。我将编辑问题 – jack 2014-11-02 15:27:00

+0

在这种情况下,我建议宁愿优化查询或更改数据库引擎,而不是将所有500万本书籍复制到内存中。 – makingthematrix 2014-11-03 12:36:10

1

看来你正试图重新创建标准的数据库功能(排序和过滤)。这些是相当复杂的话题,很多人花了很多时间解决这些问题。正常的数据库将有一个索引来加速排序。

可能有SQL DB可以在内存中运行。你甚至可以使用标准的SQL DB并在内存文件系统上运行它。还有很多严格在内存中运行的NoSQL缓存数据库(Redis,memcached,...)。

如果你试图手工实现这一点,我不认为阿卡会是要走的路。一个普通的集合会更有效率。我甚至无法想象你的五百万演员如何互相交谈来解决问题。他们会将自己的约会和参考返回给主人,主人会进行分类?这将直接与收藏更有效率。