如何在 Cassandra 中实现自定义分区逻辑?

问题描述 投票:0回答:0

我是 Cassandra 的新手,我正在构建一个聊天应用程序。假设我必须将聊天消息存储在数据库中,我希望使用 Cassandra,因为它允许快速写入。我的“消息”表数据模型如下:-

message_id
from_user_id
to_user_id
频道编号
消息文本

现在,我想以某种方式对其进行分片,以便可以从单个分片访问特定频道(1:1 或群聊)的聊天历史记录。因此,理想情况下,我想根据 channel_id 对数据库进行分片。这是我面临的挑战:-

  1. 我不能将“channel_id”作为分区键,因为它可以有重复项(一个通道可以有多个消息)并且如果分区键仅由一列组成,Cassandra 不允许重复项。
  2. 我可以使用“channel_id+message_id”作为分区键,这将是唯一的,但随后 Cassandra 将对 channel_id+message_id 的组合进行哈希处理,并可以将来自同一频道的消息放在不同的分片上。所以我必须再次分散收集。

这是我的问题:-

  1. 有没有办法覆盖 Cassandra(或任何非关系数据库)的分区/分片逻辑?我可以编写自己的分区逻辑来确定我要在我的应用程序逻辑中写入的分片吗?我知道 Redis 允许客户端分区(见this)。 Cassandra 也允许这样的事情吗?
  2. 一般问题-通常,在设计系统时,我们会尝试对数据进行分片,以最大程度地减少最频繁查询的分散聚集的机会。如果 Cassandra(和其他非关系数据库)不允许分区键中有重复项,我们还能如何实现这样的设计? (请注意,使用多个列作为分区键没有帮助,因为 Cassandra 将散列这些列值的组合并将它们放在不同的分片上,如上例所示)。

有人能帮我理解如何最好地建模吗?如果我的理解有误,请纠正我。 (如前所述,我是 Cassandra 和一般非关系数据库的新手

database-design cassandra nosql partitioning sharding
© www.soinside.com 2019 - 2024. All rights reserved.