我试图完全理解Rack中并发请求处理的选项。 我已经使用async_sinatra构build了一个长轮询应用程序,现在正在使用throw :async和/或Thin's -threaded标志尝试裸机。 我对这个主题感到满意,但有些东西我无法理解。 (不,我没有错在并行性的并行性,是的,我明白GIL的限制)。 Q1。 我的testing表明, thin –threaded (即rack.multithread=true )在单独的线程(我假设使用EM)同时运行请求,这意味着长时间运行的请求A不会阻止请求B(IO旁)。 这意味着我的应用程序不需要任何特殊的编码(例如callback)来实现并发(同样,忽略阻塞DB调用,IO等)。 这是我相信我所观察到的 – 这是正确的吗? Q2。 还有另外一个讨论实现并发的方法,涉及到EventMachine.defer和throw :async 。 严格来说,请求不是使用线程处理的。 他们被串行处理,但是将他们的繁重工作和callback传递给EventMachine,后者使用async.callback在以后发送响应。 在请求A已经将其工作卸载到EM.defer之后,请求B开始。 它是否正确? Q3。 假设上面的或多或less是正确的, 那么一种方法比另一种更有优势吗? 显然 – –threaded看起来像一个神奇的子弹。 有什么缺点吗? 如果没有,为什么每个人都在谈论async_sinatra / throw :async / async.callback ? 也许前者是“我想让我的Rails应用程序在重负载下稍微快一点”,而后者更适合具有许多长时间运行请求的应用程序? 或者也许规模是一个因素? 只是在这里猜测。 我在MRI Ruby 1.9.2上运行Thin 1.2.11。 (仅供参考,我必须使用–no-epoll标志,因为在EventMachine中使用epoll和Ruby 1.9.2有一个长久的,被认为已经解决但并非真正的问题 。洞察力是受欢迎的。)
我目前正在开发一个基于机架的应用程序,并希望将所有文件请求(例如filename.filetype)redirect到指定的文件夹。 Rack :: Static只支持特殊文件夹的文件请求(例如“/ media”)。 我是否必须编写一个自己的Rack中间件,或者有一个开箱即用的解决scheme? 最好的祝福
我一直在使用Sinatra,现在我想通过websocket推送一些数据给我的networking应用程序添加一些实时function。 我已经成功地使用了gem'em-websocket',但是还没有能够编写一个具有sinatra web服务器和web-socket服务器的ruby文件。 我已经尝试了旋转! 或开始! 方法closures在单独的线程中没有成功。 有没有人得到这个工作? 我想让他们在同一个文件中,然后在两台服务器之间共享variables。 谢谢!
pow很棒,但是我的应用程序中很多东西都假设为https,并且通过它们join“如果不是开发环境”会是一件痛苦的事情。 有可能有pow服务https?
我正在将一些内置于Rails应用程序中的逻辑重构为中间件,而我遇到的一个烦恼就是似乎缺乏将它们放在哪里的惯例。 目前我已经解决了app/middleware但我可以轻松地将其移动到vendor/middleware或vendor/plugins/middleware … 最大的问题是必须要求config/environment.rb顶部的单个文件 require "app/middleware/system_message" require "app/middleware/rack_backstage" 否则我会在config.middleware.use行中得到未初始化的常量错误。 这可能很快就会变得混乱。 我宁愿把它藏在某个地方的初始化程序中。 有没有一个传统的地方把这东西? 我正在寻找这个赏金的具体答案是: 在哪里可以把需求线,以便他们不混乱的environment.rb文件,但仍然会在config.middleware.use调用之前加载? 我所尝试的一切都会导致未初始化的常量错误。 更新 :现在我们正在使用Rails 3.0,我像其他Rack应用程序一样对待Rails应用程序; 中间件的代码文件进入lib (或Gemfile列出的Gemfile ),并且需要并在config.ru加载。
正如标题所示,您可以使用这两种方法获取客户端的IP。 我想知道是否有任何分歧。 谢谢。 在源代码中有 “/usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.3/lib/action_dispatch/http/request.rb”257L,8741C def ip @ip ||= super end # Originating IP address, usually set by the RemoteIp middleware. def remote_ip @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s end 但我真的不知道这个影响
我无法弄清楚如何使用Sinatralogging信息。 我不想logging请求,而是在我的应用程序的某些点上的自定义消息。 例如,在获取URL时,我想logging"Fetching #{url}" 。 这是我想要的: 指定日志级别的能力(例如: logger.info("Fetching #{url}") ) 在开发和testing环境中,消息将写入控制台。 在生产中,只写出符合当前日志级别的消息。 我猜这可以很容易地在config.ru完成,但我不是100%确定我想启用哪种设置,如果我必须自己手动创build一个Logger对象(此外还有,要使用哪种types的Logger : Logger , Rack::Logger或Rack::CommonLogger )。 (我知道在StackOverflow上有类似的问题,但是没有人能够直接回答我的问题。如果你能指出我现在的问题,我会把它标记为重复的)。
我有一个自制的Sinatra应用程序,我打算使用Heroku来托pipe它。 我在开发中使用工头和霰弹枪,使用以下Procfile: web: shotgun config.ru -s thin -o 0.0.0.0 -p $PORT -E $RACK_ENV 这对于开发和生产都很有效。 但事情是, 我不想在生产中使用霰弹枪,因为它太慢了。 我们可以为dev和prod使用单独的Procfileconfiguration吗?
Ruby中的Rack中间件是什么? 对于“中间件”的含义,我找不到任何好的解释。