为消息传递微服务存储聊天消息

Storing chat messages for a messaging microservice

我正在制作一个基于实时的聊天微服务,这是我第一次制作这样的应用程序。 我对如何存储对话感到困惑,因为我认为将它们存储在数据库(Cassandra 或其他)中并不是长期 运行.

的最佳解决方案

我读过有关 Apache Kafka 的资料,发现这可能是解决我的问题的方法。因此,我不太确定我是否在那里。 我只需要知道 Kafka 是否足够而不需要外部数据库(只是谈论与消息相关的数据,而不是用户或我可能需要的任何其他类型的数据)。因为我读过 Kafka 在其主题中提供了使用保留时间“-1”的选项,这基本上意味着永远,但只要服务器是 运行,而我不确定我是否可以保留同一服务器 运行ning 永远,有人可以为我澄清一下吗?

I'm not sure I can keep the same server running forever

实际上,您有不止一台服务器。 Kafka 服务器进程(称为代理)被设计为 运行 作为集群。数据写入一个并复制到其他。如果一台服务器不可用,则从另一台服务器提供数据。

I think storing them in a database (Cassandra or whatever) is not an optimal solution for the long run.

我不确定这是您使用 Kafka 所依据的正确假设。 RDBMS 和 NoSQL 存储都可以——并且正在——用作包括聊天在内的众多应用程序的长期数据存储。 这取决于您的用例、您设想的数量,也许还取决于您将如何使用这些数据。

read about Apache Kafka and found that this could be a solution to my problem.... need to know If Kafka is enough

用于存储,当然。对于发送给客户的消息,没有。

在考虑使用任何消息代理时,一些极端的例子会立即出现

  • 每个“聊天对话”都有一个主题,您的聊天应用变得非常流行——您现在有数十万个主题,这是 Kafka 无法处理的。一个数据库可以filtered/sharded/partitioned很多字段,包括用户id
  • 聊天消息必须排序,因此您真的可以将一个分区用于所有主题;使用数据库,您始终可以在查询时按时间戳排序
  • 如果您对一个主题使用“firehose”方法处理来自每个人的所有消息,然后将数据重新分配到下游,那么不频繁的客户端将落后于最频繁的 user-client,因为有更多的消息要发送给过程。

最重要的是,聊天应用程序是前端应用程序; Kafka 是一种后端技术,不会“推送”到前端服务。对于 mobile/browser use-cases,您无权在其中嵌入 Kafka 消费者。必须添加 REST API 层来请求消息,就像在数据库中一样。

更好的设计是生成消息事件而不是存储消息数据 - 例如“在时间 T,用户 X 发送内容为 C'M' 消息到 location/users L”...不需要永远坚持下去,只要足够长的时间就能被消耗掉。而且,有了所有这些信息,您还需要考虑主题分区以实现可伸缩性,然后您可以将其过滤并转储到更持久的位置,因为您的 user-facing 应用程序不会消耗这些事件中的每一个。

I'm not sure I can keep the same server running forever

总得有人来。如果不能,请使用托管解决方案。