Asynchronous 如何最好地实现阻塞/等待参与者?
我对Akka和编写并发应用程序相当陌生,我想知道实现一个参与者的好方法是什么,该参与者会等待redis列表,一旦一个项目可用,它就会处理它,或者将它发送给另一个参与者来处理 使用阻塞函数BRPOPLPUSH会更好,还是让参与者每秒轮询redis的调度器会更好Asynchronous 如何最好地实现阻塞/等待参与者?,asynchronous,redis,akka,actor,nonblocking,Asynchronous,Redis,Akka,Actor,Nonblocking,我对Akka和编写并发应用程序相当陌生,我想知道实现一个参与者的好方法是什么,该参与者会等待redis列表,一旦一个项目可用,它就会处理它,或者将它发送给另一个参与者来处理 使用阻塞函数BRPOPLPUSH会更好,还是让参与者每秒轮询redis的调度器会更好 另外,在一个正常的系统上,我能同时产生多少个这样的参与者而不消耗系统提供的所有资源?如何确定一个参与者系统在其运行的系统上应能处理多少种参与者类型?根据经验法则,您不应在接收中阻塞。每个参与者应该只依赖于CPU,并且永远不会等待、睡眠或阻塞
另外,在一个正常的系统上,我能同时产生多少个这样的参与者而不消耗系统提供的所有资源?如何确定一个参与者系统在其运行的系统上应能处理多少种参与者类型?根据经验法则,您不应在
接收
中阻塞。每个参与者应该只依赖于CPU,并且永远不会等待、睡眠或阻塞I/O。当这些条件得到满足时,您甚至可以创建数百万个并发工作的参与者。假设每个参与者都有600-650字节的内存占用(请参阅)
回到你的主要问题。不幸的是,没有与Akka哲学“兼容”的东西,也就是说,完全异步。您需要的是一个客户端,它不是阻塞,而是返回某种类型的Future
对象,并允许您在结果可用时注册回调。有这样的客户端,例如Perl和node.js
然而,我发现独立的项目,你们可能会觉得有用。如果您已绑定到同步客户端,则最好执行以下操作之一:
- 定期轮询Redis而不阻塞,并通过向发送带有Redis回复或
- 在一个演员和一个演员的身体里
BRPOPLPUSH
长时间阻塞(直到您指定的超时),因此我倾向于使用调度程序,它仍然阻塞,但每秒的时间更短
无论您走哪条路,因为您正在阻塞,您都应该阅读Akka文档,其中描述了使用阻塞库的方法
您是否可以控制将项目插入redis的代码?如果是这样,您可以让该代码向akka代码发送一条消息(可能通过ActiveMQ使用akka camel支持),以便在项目插入redis时通知它。这将是一种更受事件驱动的工作方式,并防止您必须进行投票,或阻止超长时间