管理AKKA演员的问题

时间:2014-12-03 08:50:44

标签: akka

我是Akka的新手,我们正在为多个交易构建一个强大的系统,每分钟可以扩展到5000个请求。我们的架构如下

  1. 调度程序将列表或请求推送到Akka Main Actor

  2. Akka Main Actor,其中包含Subactors的参考文献" Ask"在subactors上等待未来,其中subactors与" webservice adapter"适配器转入呼叫的网络服务

  3. " webservice adapter"我们正在将请求和响应存储到数据库

  4. 一旦响应可用,适配器就会将结果返回给Subactor,然后返回Future,以便在Actor中进一步处理。

  5. 问题在于:

    因为我们正在使用' Ask'在调用subactors的主actor中,如果在预期时间内没有返回响应,则主actor会等待一些时间和超时。

    响应延迟正在发生,因为适配器正在向数据库写入请求和响应,这可能无法获得足够的连接,因为主进程一次并行生成更多请求,这会导致数据库连接拥塞。

    为了解决这个问题,我又创建了一个SubActor(DBActor),它具有保存请求和响应DB的逻辑以及在mainactor的子动作中创建的subactoris的引用,并将引用传递给" Webservice Adapters& #34 ;.在适配器中我调用DBActor Reference.tell(request,ActorRef.noSender())这是异步调用。现在,适配器不会等待数据库事务,并且只需要很少的时间就可以将响应返回给子实例,而且由于DBActor负责处理消息,所以现在也没有数据库拥塞。

    我想知道通过在Subactor的preStart()中创建DBActor的引用来调用subactor中的DBActor是一件好事。

    我看到很多死信,因为我正在使用主要演员调度员和默认无界邮箱。

    你能建议一个更好的方法吗?我看到上面可能有错误。

1 个答案:

答案 0 :(得分:1)

添加一层间接是很好的。我认为你最好的模式将是这样的:

1)入口点actor接收请求并为其分配唯一ID

2)入口点actor会产生一个worker并将请求与id一起传递给它(告诉)

3)工作者等待连接,做他的行为,并响应主要演员(告诉)他已完成该请求(id)+可选结果值

4)主要演员完成外部请求。

这完全删除了任何问题模式。缺点:没有保证订购(您可以通过在主入口点缓存响应并对其进行排序来实现排序)。

如果你需要超时(网络连接),你可以设置一个工人演员的计时器在一段时间后死亡。