1

我正在使用 Rails 构建一个网站,可以让用户检查是否已注册某些域。逻辑设计如下:

  1. 页面上有一个文本字段让用户输入一些域名
  2. 当用户单击check按钮时,输入将被发布到服务器
  3. 服务器获取输入,创建一个后台任务(将在另一个进程中执行),并立即向用户返回一些文本,例如“正在检查...”
  4. 后台任务会将域名发布到另一个站点,获取响应,解析它以获取有用的信息,然后将数据放入一个全局内存哈希(该任务需要 3 秒)
  5. 包含“checking now...”的页面有一个javascript函数,将请求服务器获取检查结果。它每 2 秒运行一次,直到得到结果。
  6. 服务器端有一个动作来处理“检查状态请求”。它检查Globle 内存哈希,找到结果,返回它,否则返回“[]”

(我使用的是 Rails 2.3.8,delayed_job)

我是一名 Java 开发人员,这就是我将在 Java 中做的事情。但是我发现很难为“延迟的工作人员”和“rails”保存一个“全局内存哈希”,因为它们处于不同的进程中。

我的设计在rails中是不可能的吗?我必须将检查结果存储到数据库或类似“memcached”的东西吗?

而且,这些后台任务可以并行运行吗?

4

1 回答 1

3

不仅在 DelayedJob 的工作人员和 Rails 的工作人员之间您不会看到全局变量,在生产中您还将处理多个 Rails 工作进程。因此,即使您要在 Rails 中设置一个全局变量,其他 Rails 工作人员也不会看到它。

这是设计使然。它的优点是您可以将 Rails 和 DelayedJob 的负载分散到多台机器上,因为它们只处理无状态请求,并查看数据库系统或其他持久存储以添加 Web 应用程序所需的状态。

根据我收集到的信息,Java Web 应用程序可能使用线程模型,该模型允许您执行后台任务并根据需要设置全局变量。但这也将您限制在一台机器上;如果你必须扩大规模,你会怎么做?

在这种情况下,Memcached 实际上听起来是一个非常好的解决方案。它安装起来很简单,只需要很少的设置,而且在 Rails 中也很容易使用。

于 2010-07-11T09:41:43.143 回答