AKKA演员和数据库操作

Maa*_*mon 21 database-connection scala connection-pooling actor akka

我正在试图找出如何在使用actor系统时最好地处理数据库操作.事实上,当我们尝试不阻止AKKA时,数据库操作正在阻塞.

我在主文档中指出,处理这种情况的一种方法是在路由器后面创建一个actor池,可能在一个单独的executionContext上,它将处理数据库访问.

因此,我有以下问题:

1 - databaseActors是否始终保持连接打开状态?

2 - 它如何与许多数据库提供的连接池一起工作?

3 - 我们应该将两者结合起来,并让DatabaseActors在每次请求时从池请求一个新的连接.如果没有,是不是一直保持连接打开是一件坏事?

4 - 有人可以向我解释微妙的事情,使其成为一种避免线程饥饿的方法.例如,使用Play或spray,请求的处理是异步任务,但是如果该任务需要数据库访问并且我们向DatabaseActor发送请求,那么数据库Actor上的块(如果它发生)不会导致,异步任务中的一个块,导致可能的线程不足?

5 - 100%确定DB ACID属性确保多次读写的安全性,因此在关系之前发生.

6 - 我正在使用也称为三重存储的语义数据库,并在我的请求中大量使用语义推理功能.我还执行了很多写访问,任何建议,关于池和actor编号或专用执行上下文的调整参数?

最好,

中号

Sou*_*nta 21

1 - databaseActors是否始终保持连接打开状态?

Akka演员是有状态的,即你可以安全地在演员里面存储状态(在这种情况下是DB连接).您可以编写自己的连接管理逻辑,也可以使用数据库驱动程序提供的逻辑.

2 - 它如何与许多数据库提供的连接池一起工作?

3 - 我们应该将两者结合起来,并让DatabaseActors在每次请求时从池请求一个新的连接.如果没有,是不是一直保持连接打开是一件坏事?

你可以两者结合起来.为池中的每个连接都有一个actor.为什么你认为拥有一个连接是一件坏事?连接池的重点不是重用资源(连接)而不是每次都要付出创建/销毁它们的代价.

4 - 有人可以向我解释微妙的事情,使其成为一种避免线程饥饿的方法.例如,使用Play或spray,请求的处理是异步任务,但是如果该任务需要数据库访问并且我们向DatabaseActor发送请求,那么数据库Actor上的块(如果它发生)不会导致,异步任务中的一个块,导致可能的线程不足?

如果您的数据库驱动程序阻塞,那么您最终也必须阻止.建议的做法是在单独的执行上下文/线程池中执行此阻塞代码段.或者,如果您有选项,请选择具有反应式数据库驱动程序的数据存储(例如,针对MongoDB的ReactiveMongo),该数据存储完全异步且无阻塞.

5 - 100%确定DB ACID属性确保多次读写的安全性,因此在关系之前发生.

我不明白你的意思.

6 - 我正在使用也称为三重存储的语义数据库,并在我的请求中大量使用语义推理功能.我还执行了很多写访问,任何建议,关于池和actor编号或专用执行上下文的调整参数?

你绝对应该使用不同的执行上下文.参数的转换实际上取决于您的硬件配置和软件的其他细节(数据库类型,远程数据库与嵌入式数据库,请求/秒等).

对于Akka调度员来说,我认为没有一种尺寸适合所有人.这更像是一门艺术.我唯一的建议是,确保你不会阻止在任何地方你的代码.