【问题标题】:How to best implement a blocking/waiting actor?如何最好地实现阻塞/等待actor?
【发布时间】:2012-11-19 22:25:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: asynchronous redis akka actor nonblocking


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      • 在一个actor和understand the consequences内屏蔽

      另见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-13
        • 2020-12-14
        • 1970-01-01
        • 2022-01-04
        • 2011-09-13
        • 2011-01-07
        • 2012-01-03
        • 2020-04-16
        相关资源
        最近更新 更多