扩展性:如何处理Ruby on Rails应用程序之间的通信?

4
我正在运行Ruby on Rails 3,并且我的应用程序利用命名空间来处理更多的“内部概念”。所谓“内部概念”,是指每个命名空间都用于处理应用程序中的特定资源。例如,一个命名空间是“users”,它用于处理用户会话和授权,另一个命名空间是“blogs”,它用于处理所有有关帖子和评论的内容。
我认为这是一个“方便”的解决方案,可以避免很多问题,但并不是最好的解决方案。
目前,我的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

简而言之,我认为我正在尝试扩展我的应用程序或者为每个RoR应用程序创建一个Web服务,但我的问题是:
1. 我可能会遇到哪些问题? 我注意到了一些关于维护会话的问题(在我的情况下,我使用cookie处理这些问题),但我认为这不是唯一的问题。
2. 如何处理我的情况下三个RoR应用程序之间的通信? 我注意到我可以使用ActiveResource来共享信息,但我必须注意诸如用户身份验证之类的信息。
- 我是否需要实现OpenID/Oauth协议以维护用户身份验证? - 我认为我必须确保HTTPS连接中的用户身份验证信息,即使通信是在子域之间。这是真的吗?
3. 我如何组织我的工作和资源? 总之,我想要有三个RoR“易于”且独立的应用程序,而无需在每个应用程序中使用名称空间,并且它们之间可以相互通信。我不想使用(绝对不)插件或gems,但如果需要,我想要实现自己的handler。
# "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.: 如果您需要其他信息,请告诉我,我会更新问题。


*来自O2软件流程:“扩展”是指向现有群集添加更多服务器的概念,而“升级”则意味着用更新(更快)的服务器替换现有(较慢)的服务器。


你知道吗,那本书好吗? - user502052
我读了介绍,但它使用了插件和宝石库(请参见问题)。 - user502052
3个回答

2
你的问题比你想象的要简单得多。这完全取决于你如何处理你的路由。
Ruby On Rails 3 对子域名有更好的支持,因此,你不需要将它们分成三个或更多的 RoR 应用程序。你可以把所有的代码放在一个 RoR 应用程序中,并将 user.abc.com 重定向到任何控制器,例如“users/sessions”,将 blog.abc.com 重定向到“blogs/blogs”控制器。在像你这样的应用程序中,命名空间非常方便,因为它们能够快速地将你应用程序中上下文不同的部分分别放置在不同的文件夹和路由格式中。
尽情尝试这些命名空间,我相信你不会遇到你现在所想象的任何错误。我建议你编写相关代码,如果在其中遇到问题,请再来这里寻求帮助。

出于性能原因,我想要将应用程序分离。 - user502052

1

你的应用程序真的很大吗,需要使用多个应用程序来处理不同的问题吗?也许你的帖子只是缺乏足够的细节来传达你正在做的事情的真正规模,但看起来你正在尝试将一个足够小的应用程序模块化,即使没有像你所说的那样进行“扩展”,也可以正常运行。或者我可能只是漏掉了什么?

  1. 我认为这可能是一个棘手的问题,但也许有一些方法可以将会话数据存储在数据库中,并按照您处理第2个问题的方式共享它,或者您必须自己定义一个解决方案。我认为最大的问题将是跨应用程序共享资源,而且如果您将用户管理拆分到其自己的应用程序中,您将需要实现自己的OpenID/OAuth。 此帖子 使用Devise/OAuth进行了描述。

  2. 您可以使用ActiveResource连接到每个应用程序的相应REST API。 此帖子 描述了一个人解决在Rails应用程序之间共享数据的方案。

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

现在针对您整个问题的更一般性回应,最近我阅读了关于Rails上的数据、上下文和交互(Wikipedia文章)博客文章,我认为如果您觉得您的应用程序已经失控,这可能是更好的解决方案。


0

很抱歉回复晚了。 实际上,如果您想扩展Rails应用程序,您不需要为每个单元创建不同的应用程序(我是说,因为您正在尝试将用户和博客分开),您正在跳过扩展应用程序的过程中的一步,您应该首先将所有单独的单元作为可安装引擎,并将它们作为gem要求在您的核心应用程序中,并在您的核心应用程序路由中挂载它们。就像在您的情况下,博客可以移动到一个单独的可安装引擎中。如果将来需要扩展更多,则可以进一步使用引擎作为单独的应用程序。这里有一个视频链接,可能会给您一个想法,我在这里试图解释https://www.youtube.com/watch?v=pm94BsoMGik


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接