【问题标题】:Issues with EventMachine (and looking into Sinatra Async)EventMachine 的问题(并研究 Sinatra Async)
【发布时间】:2014-01-18 22:04:16
【问题描述】:

我一直在尝试找到一种处理异步请求和组织需要重复的作业的好方法,而 eventmachine 似乎是一个不错的方法,但我发现一些帖子试图阻止用户使用 eventmachine(例如https://github.com/kyledrake/sinatra-synchrony)。我想知道他们所指的问题是什么? (如果有人足够好,还有哪些选择?)

【问题讨论】:

    标签: ruby sinatra rack eventmachine


    【解决方案1】:

    考虑到您基本上是在搜索工作队列,请查看Background Jobs at Ruby Toolbox,您会发现很多不错的选择。可管理性与速度是这样的,

    1. 延迟作业
    2. Sidekiq/Resque
    3. 豆茎

    DJ 速度最慢且最易于管理,而 beanstalkd 速度最快且最不易于管理。你最好的选择可能是 sidekiq 或 resque,它们都依赖于 redis 来管理他们的队列。

    我不鼓励您使用 EventMachine,因为:

    1. 很难推断反应器模式。
    2. Fibers 将 reactor 模式的末日回调金字塔解开为外观同步的代码,但第三方应用程序中的 Fiber 支持往往会咬你一口。
    3. 在涉及网络相关代码时,您受限于非常有限的生态系统。
    4. 很难不阻塞反应器,而且当你阻塞时通常不容易抓住它。
    5. 后台处理已有完整的解决方案,您无需自己编写代码。
    6. 它不再真正维护,只需查看github 上的最后提交和问题列表。
    7. celluloidcelluloid-iodcell

    其实Sinatra Synchrony的人总结的不错:

    不应将此 gem 用于新应用程序。这个比较好 将线程与 Ruby 一起使用,而不是 EventMachine。它也倾向于 当新版本的 ruby​​ 出现时中断,而 EM 本身不是 维护得很好,但有一些非常基本的问题。

    我不会再维护这个宝石了。如果有人有兴趣 维护它,随时询问,但我建议不要使用 不再使用 EventMachine 或 sinatra-synchrony。

    【讨论】:

      【解决方案2】:

      如果它适合您的工作流程,请使用 EM。只要您不太疯狂,回调就可以很好地使用。在我上一份工作中,我们在 EM 之上构建了很多软件。

      对第三方协议的支持相当不错,看看the protocol implementations page就行了。

      至于阻塞反应器,你只需要确保你不在主线程上工作,如果你这样做了,请确保它是你做的。您可以做一些事情来确定这是否有效。最简单的就是在代码中添加延迟检查。它就像为每 x 秒添加一个定期计时器并记录一条消息一样简单(正在开发中)。打印出调用之间的时间将告诉您反应器的滞后程度。这个时间越大,你的 x 值就越多,你在主线程上做的工作就越多。

      所以,我想说,你自己试试吧。试试赛璐珞,试试直线,试试 EM 与 EM-Synchrony 和纤维。

      这真的取决于个人喜好。

      【讨论】:

        猜你喜欢
        • 2014-04-27
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2014-04-20
        相关资源
        最近更新 更多