我在一个项目上工作,其中大部分并发读写DB都会降低性能。想象一下,我需要不时地对整个数据库进行重新索引,因此,最简单的方法是设置一个"脏"标志为true,让多台机器抓住"脏"项目,进行一些处理,然后将其状态设置为" clean"再次。你可以想象,这是死锁的天堂。
我想优化它,并将DB IO操作留给一台协调机器,剩下的可能并发计算到其他机器。我认为Akka及其分布式演员模型对于此非常理想。我的想法是让协调演员阅读批次"脏"来自数据库的项目,激活众多处理参与者,将项目传递给每个人。这个想法是处理参与者将驻留在不同的机器上,但协调器和处理器都不应该知道这一点。这似乎可以通过使用Akka和使用Akka的巨大优势来实现。我想将此作为部署配置问题,以便尽可能进行扩展。
在处理actor完成处理后,他们可以将结果作为消息发送给协调actor,协调actor将使用相同的连接来保存其状态。
我是否会通过此设置找到正确的方向?
答案 0 :(得分:1)
您可以使用Cluster Singleton作为协调员。请注意,协调actor将按顺序接受所有请求,因此它应该非常轻量级。至少你可能想要分批批量阅读和回写。也许(如果你没有触发器)也会读取带有分页的脏块,以免长时间阻挡actor。我使用在ResultSet上定义的iterator(Oracle JDBC驱动程序自动进行分页) - 和像case ScheduledBulk if previousBulkFinished => future {getIterator(...).foreach(coordinator ! _)}}
一样的smthng。
如果您想快速写入数据库 - 您可以使用Fixed Size Router在多个参与者之间分配写入(计数<连接池的大小到数据库)