EventMachine的问题(并研究Sinatra Async)

时间:2014-01-18 22:04:17

标签: ruby sinatra rack eventmachine

我一直在努力寻找处理异步请求和组织需要重复的工作的好方法,而eventmachine似乎是一个很好的方法,但我发现一些帖子试图阻止用户使用eventmachine(例如https://github.com/kyledrake/sinatra-synchrony)。我想知道他们指的是什么问题? (如果某人足够好,那么替代品是什么?)

2 个答案:

答案 0 :(得分:1)

考虑到您基本上是在寻找工作队列,请查看Background Jobs at Ruby Toolbox,您会发现许多不错的选择。可管理性与速度相似,

  1. 延迟工作
  2. Sidekiq / Resque
  3. Beanstalkd
  4. DJ是最慢和最易管理的,并且beanstalkd是最快且最不易管理的。你最好的选择可能是sidekiq或resque,他们都依赖redis来管理他们的队列。

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

    1. 很难推断反应堆模式。
    2. Fibers将反应堆模式的厄运回调金字塔分解为同步代码但第三方应用程序中的光纤支持往往会咬你。
    3. 在网络相关代码方面,您仅限于非常有限的生态系统。
    4. 很难不阻挡反应堆,而且当你这样做时,它通常不容易被捕获。
    5. 有完整的后台处理解决方案,您不需要自己编码。
    6. 它不再维护,只需查看github上的最后提交和问题列表。
    7. celluloidcelluloid-io以及dcell
    8. 实际上,Sinatra Synchrony的人总结得很好:

        

      这个gem不应该被考虑用于新的应用程序。这个比较好   使用Ruby而不是EventMachine的线程。它也倾向于   当新版本的红宝石出现时,它就会中断,而EM本身则不会   保持得很好,并有一些非常基本的问题。

           

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

答案 1 :(得分:0)

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

对第三方协议有很好的支持,只需看看the protocol implementations page

至于阻止反应堆,你只需要确保你不在主线程上工作,如果你这样做,确保你的工作快速。您可以采取一些措施来确定这是否有效。最简单的方法是在代码中添加延迟检查。它就像为每x秒添加一个周期性计时器并记录消息(在开发中)一样简单。打印出呼叫之间的时间将告诉您反应堆的滞后程度。这个时间越大你的x值就越多你在主线程上做的工作。

所以,我会说,亲自尝试一下。尝试赛璐珞,尝试直线,尝试用EM-Synchrony和纤维进行EM。

这真的取决于个人偏好。