4

我正在 Heroku Stack 上运行 Rails 应用程序(包括 Memcached、DJ 异步工作程序、MongoDB 持久存储)。

现在,我们使用 Twitter Oauth 作为我们网站上的唯一身份验证选项。(我们计划最终扩展到 FB 连接、OpenID 和/或电子邮件/密码)。

您可能知道,Ruby/Rails 应用程序不支持开箱即用的并发。在 Heroku 上,您可以启动额外的应用程序实例 (dynos),这会增加您的并发性(并发能力 = dynos 的数量),但每个实例的成本为 36 美元/月。

一般来说,这不是问题,因为站点上的平均请求需要 <100 毫秒。

Twitter OAuth 除外。对 Twitter 的 OAuth 相关请求平均需要大约 3,500 毫秒。

所以基本上,当任何人登录整个应用程序实例时,都会延迟 3-4 秒。

有什么体面的方法可以缓解这种情况吗?将这些动作放在异步 DJ 工作者中会不会很奇怪?它可能会使登录速度变慢一些,但至少如果一群人同时登录和/或 Twitter 非常慢,这些过程不会影响应用程序的其余部分/其他 Web 请求吗?

还有其他想法吗?

4

2 回答 2

2

我会说这个建议现在已被取代。我建议您改用 OmniAuth,如果您也需要正常的身份验证,也可以使用 Devise。

正如建议的那样,OmniAuth 是一个 Rack 应用程序,您基本上可以让所有“大型”OAuth 提供商一举成名。

有 2 个 OmniAuth 特定的 RailsCast 可以准确地引导您完成所需的内容:OmniAuth 第 1 部分OmniAuth 第 2 部分

于 2010-11-08T17:00:24.300 回答
1

您可以将 oAuth 推送到机架中间件应用程序中 - 然后至少只有一个机架应用程序被假脱机,而不是整个 rails 堆栈。这应该让它更快一点(尽管它仍然会占用一个实例)。

话虽如此,您没有理由不能将身份验证放入它自己的应用程序中,特别是如果它们都在同一个域中(因此任何身份验证 cookie 仍然是域的本地)。尽管您必须非常小心安全问题-例如中间人攻击等。如果有人已经为您完成了工作/错误修复,那就更好了:)

如果您使用 ruby​​CAS,您甚至可以在独立的应用程序域上拥有一个身份验证应用程序:http: //rubyglasses.blogspot.com/2009/12/rails-single-sign-on-with-rubycas.html

于 2010-08-11T08:57:31.700 回答