0

我正在研究一组 RoR 应用程序,并实现了一个 API 系统来让它们交换数据。

实施细节

图书馆

  • 导轨 3.2.8
  • 红宝石 1.9.2 p320
  • jbuilder 0.8.2 (API srv)
  • httparty 0.9.0 (API cli)

授权

需要访问令牌才能访问 API

安全

开发环境中的自签名 SSL 证书。使用 SSL 进行 API 调用以防止访问令牌被盗(httparty 自动忽略 SSL 警告)。

设想

APP1 公开提供 API 的数据

APP2 公开提供 API 的数据

APP3 公开提供 API 的数据

APP4 需要 APP1、APP2、APP3 数据并使用 API 来获取数据。

问题

对 API 的第一次调用很慢(每个 APP 延迟 2 - 3 秒,后续调用很快 ~ 50 毫秒)。我认为这是延迟清单,因为APP4需要连接到APP *,然后连接是mantained,是这样吗?

有什么调试/解决问题的建议吗?

非常感谢,毛罗

更新 (2012-10-25)

在 API SRV APP 上添加了输出(ruby-prof): https ://gist.github.com/3950920

4

1 回答 1

0

我发现了问题,我想与您分享解决方案。

默认情况下,Passenger 在需要时启动应用程序(以节省内存、cpu 等)。因此,对每个应用程序(APP1、APP2 和 APP3)的 API 的第一次调用最多需要 2 - 3 秒。

为了解决这个问题,我使用http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart上的正确乘客指令预加载应用程序

遵循我的 rails 配置:

# Load passenger module and set paths
# The following three lines MUST be updated whenever the 'passenger-install-apache2-module' is executed
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p286/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p286/gems/passenger-3.0.17
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p286/ruby

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
RailsAppSpawnerIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://app1.mydomain.com/
PassengerPreStart http://app2.mydomain.com/
PassengerPreStart http://app3.mydomain.com/
PassengerPreStart http://app4.mydomain.com/
于 2012-11-15T10:16:54.180 回答