【问题标题】:Scaling Out: how to handle communication between Ruby on Rails applications?横向扩展:如何处理 Ruby on Rails 应用程序之间的通信?
【发布时间】:2011-02-12 16:56:29
【问题描述】:

我正在运行 Ruby on Rails 3,并且我有一个使用命名空间来处理更多“内部概念”的应用程序。对于“内部概念”,我的意思是每个命名空间都用于处理我的应用程序的特定资源。例如,命名空间是“users”,用于处理用户的会话和授权,另一个命名空间是“blogs”,用于处理所有关于帖子和 cmets 的信息。

我认为这是避免很多问题的“方便”解决方案,但不是最好的。

此时我的 RoR 应用程序由以下文件系统结构组成:

# "users" and "blogs" are namespaces

RAILS_ROOT/app/controllers/users
RAILS_ROOT/app/controllers/blogs
RAILS_ROOT/app/models/users
RAILS_ROOT/app/models/blogs
RAILS_ROOT/app/views/users
RAILS_ROOT/app/views/blogs
...

我想在两个使用子域的 RoR 应用程序中切换“用户”和“博客”命名空间,使其具有如下内容:

http://main.com        # This is the main RoR application
http://users.main.com  # This is another RoR application used to handle users
http://blogs.main.com  # This is another RoR application used to handle blogs

简而言之,我想我正在尝试 Scale Out* 我的应用程序,或者可能为每个 RoR 应用程序创建一个 Webservice,但我的问题是:

1. 我可能会遇到什么问题?

我注意到有关在应用程序之间维护会话(在我的情况下我使用 cookie 处理会话)的问题,但我认为这不是唯一的问题。

2. 在我的案例中如何处理三个 RoR 应用程序之间的通信?

我注意到我可以使用ActiveResource来共享信息,但我必须注意用户身份验证等信息。

  1. 我必须实现 OpenID/Oauth 协议才能维护用户身份验证?

  2. 如果通信是在子域之间,我想我也必须通过 HTTPS 连接确保用户身份验证信息是真的吗?

3. 如何组织我的工作和资源?

话虽如此,我不想使用绝对插件或宝石,但是,如果我需要,我想实现我自己的处理程序

最后,我希望有 3 个 RoR “简单”和分离的应用程序,每个应用程序不使用命名空间,并且可以相互通信:

# "Main" application for http://main.com
ROOT_MAIN/app/controllers/
ROOT_MAIN/app/models/
ROOT_MAIN/app/views/users
...

# "Users" application for http://users.main.com
ROOT_USERS/app/controllers/
ROOT_USERS/app/models/
ROOT_USERS/app/views/users
...

# "Blogs" application for http://blogs.main.com
ROOT_BLOGS/app/controllers/
ROOT_BLOGS/app/models/
ROOT_BLOGS/app/views/users
...

顺便说一句:我正在做的命名空间的使用是一种好方法吗?

P.S.:如果您需要其他信息,请告诉我,我会更新问题。


*来自The O2 Software Process:“Scale Out”是指向现有公园添加更多服务器的概念,而不是“Scale Up”,后者意味着用更新(和更快)的服务器替换现有(慢)服务器。

【问题讨论】:

  • 使用 Ruby 和 Rails 的面向服务的设计可能对您有用amazon.com/…
  • 如你所知,那本书好吗?
  • 我阅读了介绍,但它使用了插件和宝石(见问题)。

标签: ruby-on-rails ruby ruby-on-rails-3 communication subdomain


【解决方案1】:

你的问题比你想象的要简单得多。这完全取决于您如何处理路线。

Ruby On Rails 3 对子域有更好的支持。因此,您无需将它们分成三个或更多的 RoR 应用程序。您可以将所有代码放在一个单一的 RoR 应用程序中。并将 user.abc.com 重定向到任何控制器,例如“users/sessions”,将 blog.abc.com 重定向到“blogs/blogs”控制器。命名空间在像您这样的应用程序中很方便,它们可以让您的工作非常快速地在不同的文件夹和路由格式中分离出应用程序的上下文不同部分。

根据你的内心尝试命名空间,我相信你不会得到任何你现在想象的错误。我建议你为它编写代码,如果你遇到问题来这里。

【讨论】:

  • 出于性能原因,我想分离应用程序。
【解决方案2】:

您的应用程序真的那么大,以至于您需要使用多个应用程序来处理不同的问题吗?可能是您的帖子缺少足够的细节来传达您正在做的事情的真正规模,但似乎您正在尝试模块化一个足够小的应用程序,这样就可以不用像您所说的那样“向外扩展”。或者也许我只是错过了什么?

  1. 我认为这将是一个棘手的问题,但可能有一些方法可以将会话数据存储在数据库中,并以您处理 #2 的方式共享它,或者您必须为那。我认为最大的问题将是在您的应用程序之间共享资源,而且如果您将用户管理分解为自己的应用程序,您将需要实现自己的 OpenID/Oauth。 This post 用 Devise/OAuth 描述了这一点。

  2. 您可以使用 activeresource 连接到每个应用程序各自的 rest api。 This post 描述了一个人在 Rails 应用程序之间共享数据的解决方案。

  3. 这个问题有点含糊。您描述了使用多个应用程序来分离您的关注点(博客与用户管理),所以我想您将在每个应用程序的根目录中拥有您的资源,而无需任何命名空间,就像您已经在现有应用程序中所做的那样。

现在,为了对您的整个问题进行更一般的回答,最近我读了一篇关于 Rails 上的数据、上下文和交互 (wikipedia article)blog post,我认为这可能是您想要完成的更好的解决方案,如果你觉得你的应用正在失控。

【讨论】:

    【解决方案3】:

    很抱歉这么晚才回复。 实际上,如果你想扩展你的 Rails 应用程序,你不需要为每个单元创建不同的应用程序(我的意思是你试图在这里分离用户和博客),你在扩展你的应用程序的过程中向前迈进了一步,你应该首先将所有单独的单元作为可安装引擎,并要求它们作为核心应用程序中的 gem,并将它们安装在核心应用程序路由中。在您的情况下,博客可以移动到单独的可安装引擎。如果将来您需要扩展更多,那么您可以进一步将引擎用作单独的应用程序。这是一个视频链接,可以让您了解我在此尝试解释的内容https://www.youtube.com/watch?v=pm94BsoMGik

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多