2013-02-11 137 views
6

我有一个Rails应用程序的N个dynos,并且我想对它们运行一个命令。有没有办法做到这一点?在所有的dynos上执行rails r "SomeRubyCode"会执行吗?有没有办法在所有Heroku dynos上运行命令?

我正在使用一个插件,每M分钟与第三方同步。问题是,有时第三方服务会超时,我想再次运行它,而不必等待另外的M分钟。

+1

您的用例描述在这里最有用。 – hgmnz 2013-02-15 19:30:24

+0

我正在使用每N分钟与第三方同步的插件。问题是,有时第三方服务会超时,我想再次运行它,而不必等待另外N分钟的时间。 – Geo 2013-02-15 19:51:15

+1

如何使用Redis作为共享/分布式内存(在应用程序级而不是插件级)?有一个计划的rake任务“强制”插件同步并将结果存储在缓存中,然后让应用的其余部分从缓存中获取数据。如果同步失败,您可以手动运行rake任务,而不用担心运行哪个dyno。 – 2013-02-18 02:29:05

回答

4

(问把我的意见变成一个答案......将借此机会阐述。)

我不知道你的插件,需要做的,“同步”到一个什么样的细节第三方服务,但我将继续假设插件基本上获取Web应用程序以某种方式使用的一些临时数据。

由于同步或读取过程偶尔会失败,并且您的Web应用程序依赖最新的数据,因此您需要手动运行“同步”过程的选项。目前,只有这样才能从插件本身做到这一点,这意味着您需要在所有的dynos上运行一些代码,正如其他人所指出的那样,目前不可能。

我在以前,类似的情况做了什么(从外部服务获取分析)很简单:

  1. 提供和使用Redis的
  2. 配置你的Heroku应用程序编写简单地执行rake任务然后将该数据写入缓存中
  3. 通常在应用程序中获取数据的位置,首先尝试从缓存中获取数据(并在缓存未命中时,只需再次运行相同的代码 - 仅表示数据在刷新之前已从缓存中过期)

然后我进一步去和使用Heroku的简单的调度,以执行所述搜索任务每ň分钟试图保持数据新鲜更新,并始终处于高速缓存(缓存过期设置为略小于ñ分钟),并减少发生数据获取时可感知滞后的情况。我可以将缓存过期设置为从不或大于n但这不是关键任务。

这样,如果我没有要确保被显示的最新分析,我不得不这样做要么是一个)连接到Redis的和从缓存中,或删除的项目(容易),B)只是heroku run rake task

再说一遍 - 如果你只是拉取需要在所有dynos之间共享的数据,这主要起作用。

这显然不能反其道而行。例如,如果您有一个集中式服务,您希望定期发送指标(比如说,每个请求花费的时间)以逐个测试者为基础。想不到使用Heroku的简单而优雅的方式(除了实时,还有所有需要的开销)。

相关问题