【问题标题】:Connecting to Redis databases via Node in Heroku在 Heroku 中通过 Node 连接到 Redis 数据库
【发布时间】:2014-02-16 20:06:24
【问题描述】:

关于 Heroku:App 是 Nodejs、Express、WebSockets ... 我正在一个小的免费 Heroku 实例上测试一个应用程序。 我通过 OpenRedis 和 RedisToGo 拥有自己的 Redis 数据库实例。 这些不是通过 Heroku 插件提供的,而是直接从提供者那里提供的。 在本地运行时,我可以很好地连接到它们。我需要做些什么才能通过 Heroku 连接到他们? 我有点希望避免特殊的 Heroku 特定环境变量,但如果有必要,我很乐意使用它们。 但我绝对需要避免通过 Heroku 配置 Redis 插件的必要性。
同样,我已经通过相关提供商直接配置了我的数据库实例。

NODE_ENV=production npm start 在本地一切正常,这向我的应用表明它应该连接到远程 Redis 实例(RedisToGo 和/或 OpenRedis)而不是本地 Redis 服务器。

我将 Redis 用于至少三件事:

  • Session store :: Connect-Redis :: 这在本地运行良好(应用服务器在本地运行但连接到远程 Redis 实例)并且似乎也可以在 Heroku 上运行——我通过刷新数据库进行了检查,然后向 Heroku 推送一个稍微新的版本,会话变量键被刷新。

  • Database :: Node-Redis :: 这在本地也可以正常工作(应用服务器也在本地运行,但连接到远程 Redis 实例以获取数据库),但似乎不适用于 Heroku。

  • WebSockets Transport Pub/Sub :: 我还没有彻底测试过。我猜它正在工作,但对于这个问题并不重要。

我最感兴趣的是什么,

是Heroku实例可以通过Connect-Redis客户端连接到Redis实例,但是不能通过数据库客户端连接到同一个Redis实例。而我的本地运行版本能够通过这两个客户端连接到同一个(远程)实例。 (我已经通过终端客户端验证了这些发现,使用flushall 命令并等待刷新密钥。)

任何见解将不胜感激。

我将通过下面的 cmets 发布我的编辑和更新,因为它们带有时间戳。

【问题讨论】:

  • 是的,我的 env 开关是个坏消息,因为 Heroku 没有自动将 NODE_ENV 设置为生产环境。无论如何,我现在通过 Heroku 初始化了数据库;尽管仍然没有通过 WebSockets 获得对查询的响应。更多调试...
  • 现在似乎正在得到响应,但延迟相当可怕。
  • 有点跑题了:为什么要为实例使用不同的 Redis 提供程序?是为了 HA 吗?
  • 我想尽可能多地进行测试,以比较性能并隔离问题和错误。说明:一周前,我只将我的应用程序部署到 Nodejitsu,它以惊人的方式失败,而它在本地运行良好。他们的支持部分敦促我深入研究我的代码以找到错误。我首先部署到 Heroku 的唯一原因是(首先向我自己)证明错误不在我的代码中。 Heroku 不是这个应用程序的长期解决方案,因为它构思会话和状态的方式与我使用的协议不兼容。 Linode。
  • 可能存在混杂因素,但我注意到 Rtg 与 OpenRedis 相比具有更好的延迟(更少),并且 IrisRedis 在这方面功能失调。 (Nodejitsu 也得分不高。)在 Linode 上,我可以在同一个虚拟盒子上运行 Redis 实例,这样应该非常快。我们保留 Rtg (mini) 用于备份、诊断等。

标签: node.js heroku redis


【解决方案1】:

事实证明,我们无法通过 Heroku 以“正常”方式连接到数据库(不知道为什么,因为我不知道 AWS 上 Heroku 配置的内部结构);我们需要使用heroku config:set 命令设置环境变量。 OpenRedis 提供了一个终端就绪字符串,可能可以将类似的东西放在一起用于自配置的 RedisToGo 实例,虽然我还没有这样做。

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2014-05-26
    • 1970-01-01
    • 2016-11-12
    • 2012-05-16
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多