6

我有 N dynos 用于 Rails 应用程序,我想在所有这些上运行命令。有没有办法做到这一点?是否会在所有测功机上执行运行rails r "SomeRubyCode"

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

4

2 回答 2

9

不会。一次性命令(类似heroku run bash)在另一个一次性测功机上运行。您需要设置某种 pubsub/message 队列,所有 dynos 都听以完成此操作。https://devcenter.heroku.com/articles/one-off-dynos

于 2013-02-11T14:25:55.343 回答
4

(被要求将我的评论变成答案......将借此机会阐述。)

我不知道您的插件需要做什么才能“同步”到第 3 方服务的详细信息,但我将继续假设该插件基本上会获取您的 Web 应用程序然后使用的一些瞬态数据不知何故。

因为同步或获取过程偶尔会失败,并且您的 Web 应用程序依赖于最新数据,您希望选择手动运行“同步”过程。目前,从插件本身执行此操作的唯一方法意味着您需要在所有测功机上运行一些代码,正如其他人指出的那样,目前不可能。

我在之前的类似场景(从外部服务获取分析)中所做的很简单:

  1. 使用 Redis 配置和配置您的 Heroku 应用程序
  2. 编写一个简单地执行代码(否则将由插件运行)以获取数据的 rake 任务,然后将该数据写入缓存
  3. 您通常会在应用程序中获取数据的地方,首先尝试从缓存中获取(并且在缓存未命中时,只需再次运行相同的代码 - 只是意味着数据在刷新之前从缓存中过期)

然后我更进一步,使用 Heroku 简单调度程序每n分钟执行一次上述 rake 任务,以尝试保持数据最新更新并始终在缓存中(缓存到期设置为略小于n分钟)并减少可感知滞后的实例数据获取发生。我可以将缓存过期设置为从不或大于n,但这不是关键任务。

这样,如果我确实想确保显示最新的分析,我所要做的就是 a) 连接到 Redis 并从缓存中删除该项目,或者(更简单)b) 只是heroku run rake task.

再一次——这主要适用于你只是提取需要在所有测功机之间共享的数据。

这显然行不通。例如,如果您有一个集中式服务,您想定期发送指标(例如,每个请求花费的时间)到每个测功机的基础上。想不出一种使用 Heroku 的简单、优雅的方式来做到这一点(除了实时之外,还有所有需要的开销)。

于 2013-02-20T03:38:30.603 回答