【问题标题】:Real-time chats using Redis - how not to lose messages?使用 Redis 进行实时聊天 - 如何不丢失消息?
【发布时间】:2020-01-22 07:02:38
【问题描述】:

我想实现实时聊天。我的主要数据库是 PostgreSQL,后端是用 NodeJS 编写的。客户端将是移动设备。

据我了解,要实现消息传递的实时性能,我需要使用 Redis。 因此,我的计划是使用 Redis 来处理 2 人或更多人之间的 X 个最新消息(群聊),例如 1000 条,并且所有内容都在我的主数据库(即 PostgreSQL)中同步和备份。 然而,由于 Redis 本质上只是 RAM,聊天记录可能太“脆弱”,因为在 RAM 中存储数据的易失性。 所以如果我的redis服务器出现了一些意外的临时故障,最近的对话消息就会丢失。

当今实施此类事情的最佳做法是什么? 我只需要将 Redis 数据持久化到磁盘吗?但在那种情况下,这不会影响性能,因为它会增加每条发送消息的写入时间吗?

或者我应该只准备一个恢复方法,从 PostgreSQL 中获取最近的历史记录,以防我的 redis 聊天记录列表为空?

P.S - 既然如此,您能否建议一种维护用户状态(在线/离线)的好方法?是否也使用 Redis 完成?

【问题讨论】:

    标签: database postgresql redis chat real-time


    【解决方案1】:

    现在实施类似的最佳做法是什么 这?我只需要将 Redis 数据持久化到磁盘吗?但在那 情况下,这不会损害性能,因为它会增加写入 每条消息发送的时间?

    • 是的,启用持久性会影响 redis 的性能。
    • 最好的办法是快速运行benchmark,使用应用程序的预期 IOPS 和操作类型,以确定启用持久性对 IOPS 的影响。
    • RBD 与 AOF:

      • 启用 RDB 持久性后,父进程不会执行磁盘 I/O 来将数据更改存储到 RDB。根据save points 的值,redis fork 一个子进程来执行RDB。
      • 但是,根据save points的配置,您可能会丢失上次保存点之后写入的数据 - 以防服务器重新启动或如果数据未从上次保存点保存而崩溃
      • 如果你的用例不能容忍这段时间的数据丢失,你需要看看AOF持久化方法。 AOF 将跟踪所有写入操作,可用于在服务器重启事件时构造数据。
      • 将 fsync 策略设置为每秒的 AOF 可能会更慢,但如果禁用 fsync,它可能与 RDB 一样好。
      • 阅读使用 RDB 或 AOF 的权衡:https://redis.io/topics/persistence#redis-persistence

    P.S - 虽然我们在做,请您建议一个好的方法 维护用户的状态(在线/离线) ?完成了吗 Redis 也一样?

    • 是的

    【讨论】:

    • 感谢您的帮助。我对Redis不熟悉,服务器关闭是否经常发生?需要多长时间才能恢复?我的规模不大,但我不希望我的用户在这里和那里丢失消息,流行的聊天应用程序使用 Redis 和 AOF 吗?还是其他数据库(Cassandra 等)?另外,从 Postgres 获取历史记录然后才订阅 Redis 会更好吗?不会以某种方式最终导致用户不知道他们是否错过了一些消息?再次感谢!
    • 服务器停机的频率取决于您的环境。但是,您可以配置 redis-sentinel 来维护 HA。这肯定会增加系统的可用性。如果你打算使用 redis-cluster,那么一个 slave 将被提升为 master。从 redis 中获取用户的在线/离线状态在性能上会比 Cassandra 更好。
    猜你喜欢
    • 2012-09-23
    • 2015-05-01
    • 2016-07-21
    • 2018-02-06
    • 2021-08-19
    • 1970-01-01
    • 2016-08-24
    • 2014-03-11
    • 2020-08-07
    相关资源
    最近更新 更多