【问题标题】:How to handle Redis session when db disconnectsdb断开连接时如何处理Redis会话
【发布时间】:2013-12-21 06:00:31
【问题描述】:

我在我的 Express 应用程序中用于会话的 Redis 连接丢失时遇到问题:

var RedisStore = require('connect-redis')(express);
sessionStore = new RedisStore(config.db.redis.connection);
sessionStore.client.on('error', function(err){
  console.log("Redis error " + err);
});

app.use(express.session({
  secret: config.secret,
  maxAge: new Date(Date.now() + 3600000),
  store: sessionStore
}));

当它出现故障时,由于会话不再可用,该站点也会出现故障。我正在考虑回退到 memoryStore 或辅助数据库,但想使用该回退直到我可以再次重新连接(我并不太担心会话丢失 - 只是不希望网站繁荣) .

我该怎么做?一个现有的插件会很棒,但到目前为止还没有找到任何东西。

【问题讨论】:

    标签: javascript node.js session express redis


    【解决方案1】:

    Redis 被誉为最可靠的数据存储之一。我建议不要尝试设计故障转移解决方案,而是修复您的 Redis。或者,以每月 7 美元的价格使用 Redistogo 之类的托管服务,停机时间应该几乎为零。

    【讨论】:

    • 这是托管 Redis (IrisCouch) - 定期停机 - RedisTogo 曾经是 NodeJits 中的一个选项,但由于一些问题他们放弃了它们。因此,与其让我的手指交叉并继续处理这个问题,我宁愿修补它
    • 您将不得不编写大量代码以回退到不同的 cookie 存储,如果您使用 MemoryStore,您将在用户在不同服务器之间跳转时不断注销。为什么你不能直接连接到 Redistogo,即使 Nodejitsu 不直接支持它们?
    • 好吧,我可以连接到他们,但事实是这些服务确实会出现问题,而且用户体验只是一个 500 错误。我已经修补了一些东西以显示维护页面,我将查看另一项服务。
    • 请记住,您的后备代码也可能会失败。如果您对您的数据库可用更有信心,您可以切换到github.com/jebas/connect-pg
    【解决方案2】:

    您是否尝试过使用复制主从选项?如果master宕机切换到slave,当master上线时切换回master。

    您的应用程序应该检查主连接,如果它关闭,它应该从从站获取数据并恢复服务。

    您可以在同一台服务器或其他任何地方运行从属服务器。

    【讨论】:

    • 理论上听起来不错,但我没有找到任何代码示例来说明如何在 Express 的会话失败中处理该问题。我可以发现会话已关闭或 Redis 抛出但从那里...
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多