Redis 将实时聊天中的消息保存到MySQL或Dynmodb的策略

Redis 将实时聊天中的消息保存到MySQL或Dynmodb的策略,redis,livechat,real-time-data,Redis,Livechat,Real Time Data,我正在编写一个实时聊天应用程序,它将被许多用户使用。我正在考虑使用亚马逊的ElasticCache Redis来管理我们的发布/订阅和最新消息缓存 我看到的唯一问题是如何将这些实时消息保存到数据库以备将来使用。关于我可以使用什么策略将这些消息从弹性缓存保存到数据库中的任何建议 是首选RDS还是应该使用NoSQL(例如Dynmodb)来存储这些消息? 我是否应该创建一个队列来存储缓存中的这些消息或实时保存它们也可以工作 谢谢这里的适当策略在很大程度上取决于数量、预期的查询模式和邮件保留。让我们假设

我正在编写一个实时聊天应用程序,它将被许多用户使用。我正在考虑使用亚马逊的ElasticCache Redis来管理我们的发布/订阅和最新消息缓存

我看到的唯一问题是如何将这些实时消息保存到数据库以备将来使用。关于我可以使用什么策略将这些消息从弹性缓存保存到数据库中的任何建议

是首选RDS还是应该使用NoSQL(例如Dynmodb)来存储这些消息? 我是否应该创建一个队列来存储缓存中的这些消息或实时保存它们也可以工作


谢谢

这里的适当策略在很大程度上取决于数量、预期的查询模式和邮件保留。让我们假设您希望支持永久保留,并从那里开始:

大型RDS实例可以轻松处理每秒数千次的写操作,而读从机将有助于高效平衡读负载。特别是在这方面非常好,我建议您研究一下,并将其与传统RDS进行比较。此外,底层机制的Postgres将比MySQL支持的实例具有更高的写入吞吐量,这是因为不同的锁定策略对总体吞吐量更有利。如果您的实时消息是通过pubsub系统中继的,那么实际上可能不需要redis中的额外最新消息缓存,如果卷足够小,可以由读从机或简单地由主机处理。这也取决于聊天系统的类型。一对一聊天与基于聊天室或全局聊天的阅读特性有显著不同

SQL解决方案的最大问题是随着时间的推移出现消息,并且如果您的消息数量达到10亿条以上,则能够高效地显示来自所有时间的任何消息。根据不同的聊天类型,这可能是可共享的,但是像NoSQL这样的解决方案可能更有意义。当然,他们并非没有警告。它们将更具水平扩展性,能够在高端处理每秒写入或消息数量的更高增长,并具有基于数据模型的更自然的分片能力,但数据模型将更具限制性,在某些方式下更难查询

也就是说,为了简单起见,如果您不打算每秒传递10亿条消息或1000条消息,那么从SQL开始可能会提供一些简单性和灵活性。从专业知识较少的NoSQL数据库开始,可能会遇到意外的警告或开发问题,从而更快地让您陷入麻烦

就您实际使用的写入模式而言,我认为首先写入数据库,其次是缓存,在成功写入后发布到pubsub主题有助于确保历史一致性。这也取决于你想要做出的保证。如果现场交付比历史准确性更重要,则相反的顺序可能适用。但是,如果您选择一个SQL数据库,这意味着您的吞吐量直接与单个SQL主机的写入吞吐量挂钩。Postgres最近引入了双向复制的可能性,它为您提供了多主机支持,但它有很多警告,我认为RDS无论如何都不支持双向复制

对于pub sub来说,redis可能就足够了,但这又取决于规模。在高端,更分布式和容错的东西可能更合适。例如,AWS有一个专用的。这将有利于减轻管理负担,并且在消息吞吐量方面可能有更大的增长空间。Redis很棒,速度也快得令人难以置信,但它也将是一个单点故障,内存受限,而且,在一天结束时,它将绑定到一个线程。但是,如果你从低端开始,不打算达到非常高的吞吐量,Redis就完全足够了

重要提示:不过,将redis用于pubsub的一点是。这是一个潜在的巨大安全问题,因此,如果您的网络之外有客户端直接连接,就像我假设您希望使用聊天系统一样,Redis将是一个糟糕的选择。应始终阻止外部连接。总是

TL;博士: -对于低端,RDS可能会在相当长的一段时间内通过传统的主从设置满足您的需求,但像Dynamo或Cassandra这样的NoSQL解决方案将更好地满足长期增长、难以置信的高吞吐量或显著的数据量。
-出于安全考虑,Redis可能不是PUBSUB的理想选择,缓存层可能需要,也可能不需要,但其他PUBSUB技术可能足以实现实时消息传递。

此处的适当策略在很大程度上取决于容量、预期查询模式和消息保留。假设您希望支持永久保留 然后从那里出发:

大型RDS实例可以轻松处理每秒数千次的写操作,而读从机将有助于高效平衡读负载。特别是在这方面非常好,我建议您研究一下,并将其与传统RDS进行比较。此外,底层机制的Postgres将比MySQL支持的实例具有更高的写入吞吐量,这是因为不同的锁定策略对总体吞吐量更有利。如果您的实时消息是通过pubsub系统中继的,那么实际上可能不需要redis中的额外最新消息缓存,如果卷足够小,可以由读从机或简单地由主机处理。这也取决于聊天系统的类型。一对一聊天与基于聊天室或全局聊天的阅读特性有显著不同

SQL解决方案的最大问题是随着时间的推移出现消息,并且如果您的消息数量达到10亿条以上,则能够高效地显示来自所有时间的任何消息。根据不同的聊天类型,这可能是可共享的,但是像NoSQL这样的解决方案可能更有意义。当然,他们并非没有警告。它们将更具水平扩展性,能够在高端处理每秒写入或消息数量的更高增长,并具有基于数据模型的更自然的分片能力,但数据模型将更具限制性,在某些方式下更难查询

也就是说,为了简单起见,如果您不打算每秒传递10亿条消息或1000条消息,那么从SQL开始可能会提供一些简单性和灵活性。从专业知识较少的NoSQL数据库开始,可能会遇到意外的警告或开发问题,从而更快地让您陷入麻烦

就您实际使用的写入模式而言,我认为首先写入数据库,其次是缓存,在成功写入后发布到pubsub主题有助于确保历史一致性。这也取决于你想要做出的保证。如果现场交付比历史准确性更重要,则相反的顺序可能适用。但是,如果您选择一个SQL数据库,这意味着您的吞吐量直接与单个SQL主机的写入吞吐量挂钩。Postgres最近引入了双向复制的可能性,它为您提供了多主机支持,但它有很多警告,我认为RDS无论如何都不支持双向复制

对于pub sub来说,redis可能就足够了,但这又取决于规模。在高端,更分布式和容错的东西可能更合适。例如,AWS有一个专用的。这将有利于减轻管理负担,并且在消息吞吐量方面可能有更大的增长空间。Redis很棒,速度也快得令人难以置信,但它也将是一个单点故障,内存受限,而且,在一天结束时,它将绑定到一个线程。但是,如果你从低端开始,不打算达到非常高的吞吐量,Redis就完全足够了

重要提示:不过,将redis用于pubsub的一点是。这是一个潜在的巨大安全问题,因此,如果您的网络之外有客户端直接连接,就像我假设您希望使用聊天系统一样,Redis将是一个糟糕的选择。应始终阻止外部连接。总是

TL;博士: -对于低端,RDS可能会在相当长的一段时间内通过传统的主从设置满足您的需求,但像Dynamo或Cassandra这样的NoSQL解决方案将更好地满足长期增长、难以置信的高吞吐量或显著的数据量。 -出于安全考虑,Redis可能不是PUBSUB的理想选择,缓存层可能需要也可能不需要Redis,但其他PUBSUB技术可能足以实现实时消息传递