我对Akka很新,并编写并发应用程序,我想知道实现一个等待redis列表的actor的好方法,一旦项目可用,它就会处理它,还是发送给不同的演员来处理?
使用阻塞函数BRPOPLPUSH会更好,还是会让演员每秒轮询redis的调度程序会更好?
此外,在普通系统中,如果不消耗系统提供的所有资源,我可以同时产生多少个演员?如何确定演员系统应该在其运行的系统上处理每种Actor类型的数量?
答案 0 :(得分:0)
根据经验,你不应该阻挡receive
内部。每个actor都应该只依赖CPU,永远不要等待,睡眠或阻塞I / O.当满足这些条件时,您甚至可以创建数百万个并发工作的参与者。假设每个actor都有600-650字节的内存占用(参见:Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM)。
回到你的主要问题。不幸的是,与Akka哲学没有official Redis client“兼容”,即完全异步。你需要的是一个客户端,而不是阻塞将返回一个Future
某种对象,并允许您在结果可用时注册回调。有这样的客户,例如for Perl和node.js.
但是我找到了fyrie-redis个独立项目,你可能觉得它很有用。如果您被绑定到同步客户端,您可以做的最好的是:
定期轮询Redis而不会阻止,并通过向Redis回复发送消息或
答案 1 :(得分:0)
BRPOPLPUSH
长时间阻塞(直到你指定的超时),所以我倾向于使用Scheduler
而不是阻止,但是每隔一秒左右会有更短的时间。< / p>
无论你走哪条路,因为你是阻塞的,你应该阅读Akka文档的this section,其中描述了使用阻塞库的方法。
您是否可以控制将项目插入redis的代码?如果是这样,您可以获取该代码,以便在将项目插入redis时向您的akka代码发送消息(可能使用akka camel支持通过ActiveMQ)。这将是一种更加事件驱动的工作方式,可以防止您不得不轮询或阻止超长时间。