1

我对 Akka 和编写并发应用程序还很陌生,我想知道什么是实现一个等待 redis 列表的参与者的好方法,一旦一个项目可用,它就会处理它,或者将它发送给不同的参与者过程?

使用阻塞函数 BRPOPLPUSH 会更好,还是要求参与者每秒轮询 redis 的调度程序是更好的方法?

另外,在一个正常的系统上,我可以同时生成多少个这些actor而不消耗系统必须提供的所有资源?如何决定一个 Actor 系统应该能够在其运行的系统上处理多少个 Actor 类型?

4

2 回答 2

0

BRPOPLPUSH长时间阻塞(直到您指定的超时),所以我更喜欢Scheduler仍然阻塞,但每秒左右的时间较短。

无论你走哪条路,因为你是阻塞的,你应该阅读Akka 文档的这一部分,它描述了使用阻塞库的方法。

您是否可以控制将项目插入 redis 的代码?如果是这样,您可以让该代码向您的 akka 代码发送一条消息(可能通过使用 akka camel 支持的 ActiveMQ),以便在将项目插入 redis 时通知它。这将是一种更受事件驱动的工作方式,并防止您不得不轮询或长时间阻塞。

于 2012-12-09T14:09:23.347 回答
0

作为一个经验法则,你不应该在里面阻塞receive。每个参与者都应该只依赖 CPU 并且从不等待、休眠或阻塞 I/O。当满足这些条件时,您甚至可以创建数百万个同时工作的演员。假设每个 actor 有 600-650 字节的内存占用(参见:Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM)。

回到你的主要问题。不幸的是,没有与 Akka 哲学“兼容”的官方 Redis 客户端,即完全异步。您需要的是一个客户端,而不是阻塞将返回某种Future对象并允许您在结果可用时注册回调。有这样的客户端,例如 Perl 和 node.js。

但是我发现你可能会觉得有用的 fyrie-redis独立项目。如果您绑定到同步客户端,您可以做的最好的事情是:

  • 定期轮询 Redis 而不会阻塞,并通过向 Redis 回复发送消息来通知某些参与者或

  • 阻止演员并了解后果

也可以看看

于 2012-12-02T10:02:48.463 回答