2

我在 heroku 部署了一个 sinatra 应用程序,并且我已经将 web 工作扩展到 3 个 dyno,因此 web.1 web.2 和 web.3 分别为请求提供服务。我想在 ruby​​ 中从控制器操作中知道当前请求由哪个测功机提供服务,然后想将其保存在数据库中。我做了一些谷歌,但没有找到任何令人满意的答案。

任何帮助将不胜感激。

谢谢

4

2 回答 2

0

使用工作进程在启动时执行此操作可能有一种非常hacky的方法。

  1. 您需要能够监视来自的输出heroku logs --tail,请参阅https://github.com/dblock/heroku-commander以获取示例。工人阅读日志。
  2. 工作人员向应用程序发出 HTTP 请求,例如。获取应用程序/dyno?id=uuid1。响应是响应的测功机的 MAC 地址,例如。麦克1。
  3. 工作人员可以在日志中看到 uuid1 访问了 web.5,该 web.5 以它的 mac 响应。宾果游戏,工人现在知道了。
  4. PUT app/dyno?mac1=web.5&mac2=web.6 等。收到此消息的每个 dyno 都会将其 mac 与其中一个 mac 进行比较,并响应真/假,它现在知道自己是谁。
  5. 重复直到工人已经到达所有测功机并且所有测功机都知道。
  6. 定期注意测功机重新启动。

你必须想知道为什么你需要知道你是“web.1”。为什么不能是唯一的 UUID,比如机器的 MAC 地址?

于 2013-02-21T06:09:38.933 回答
0

这真的没有办法知道。您没有从 Heroku 获得任何 HTTP 标头来指定哪个 Dyno 正在处理请求,因此无法判断。您能做的最好的事情就是让 Heroku 在某处流式传输您的所有日志(syslog drain),以便您可以解析日志文件并将请求 URI 匹配到 Dynos。

于 2012-08-15T20:14:43.303 回答