我是Akka的新手,我们正在为多个交易构建一个强大的系统,每分钟可以扩展到5000个请求。我们的架构如下
调度程序将列表或请求推送到Akka Main Actor
Akka Main Actor,其中包含Subactors的参考文献" Ask"在subactors上等待未来,其中subactors与" webservice adapter"适配器转入呼叫的网络服务
" webservice adapter"我们正在将请求和响应存储到数据库
一旦响应可用,适配器就会将结果返回给Subactor,然后返回Future,以便在Actor中进一步处理。
问题在于:
因为我们正在使用' Ask'在调用subactors的主actor中,如果在预期时间内没有返回响应,则主actor会等待一些时间和超时。
响应延迟正在发生,因为适配器正在向数据库写入请求和响应,这可能无法获得足够的连接,因为主进程一次并行生成更多请求,这会导致数据库连接拥塞。
为了解决这个问题,我又创建了一个SubActor(DBActor),它具有保存请求和响应DB的逻辑以及在mainactor的子动作中创建的subactoris的引用,并将引用传递给" Webservice Adapters& #34 ;.在适配器中我调用DBActor Reference.tell(request,ActorRef.noSender())
这是异步调用。现在,适配器不会等待数据库事务,并且只需要很少的时间就可以将响应返回给子实例,而且由于DBActor负责处理消息,所以现在也没有数据库拥塞。
我想知道通过在Subactor的preStart()中创建DBActor的引用来调用subactor中的DBActor是一件好事。
我看到很多死信,因为我正在使用主要演员调度员和默认无界邮箱。
你能建议一个更好的方法吗?我看到上面可能有错误。
答案 0 :(得分:1)
添加一层间接是很好的。我认为你最好的模式将是这样的:
1)入口点actor接收请求并为其分配唯一ID
2)入口点actor会产生一个worker并将请求与id一起传递给它(告诉)
3)工作者等待连接,做他的行为,并响应主要演员(告诉)他已完成该请求(id)+可选结果值
4)主要演员完成外部请求。
这完全删除了任何问题模式。缺点:没有保证订购(您可以通过在主入口点缓存响应并对其进行排序来实现排序)。
如果你需要超时(网络连接),你可以设置一个工人演员的计时器在一段时间后死亡。