需要帮助为Cassandra配置类似MQ的表吗

需要帮助为Cassandra配置类似MQ的表吗,cassandra,Cassandra,我有一张通知表: CREATE TABLE notifications ( id timeuuid, created timestamp, to_user_id timeuuid, status varchar, msg text, PRIMARY KEY ((to_user_id,status),created) ) WITH CLUSTERING ORDER BY (created DESC); 如上所示进行配置,因为我的第一个任务是通过收件人(“to_user_i

我有一张通知表:

CREATE TABLE notifications (
  id timeuuid,
  created timestamp,
  to_user_id timeuuid,
  status varchar,
  msg text,
  PRIMARY KEY ((to_user_id,status),created)
) WITH CLUSTERING ORDER BY (created DESC);
如上所示进行配置,因为我的第一个任务是通过收件人(“to_user_id”字段)和所需的通知状态进行拉取。另外,我正在处理最后N条记录,这就是为什么使用聚类顺序。这个很好用

但是,我的第二个任务有问题:更新通知状态。 若我试图更新一个“状态”列,它(显然)会抛出一个错误,即在集合中找到Pk部件状态

嗯。考虑到我的用例应该遵循这个要求,我想有两个表,第二个看起来像

CREATE TABLE notifications_by_id (
  id timeuuid,
  created timestamp,
  to_user_id timeuuid,
  status varchar,
  msg text,
  PRIMARY KEY (id)
);
但我们在这里遇到了一个不同的问题-我的主表是第一个表,要更新它,我需要“to_user_id”和“status”,它们不是唯一的,在更新请求期间不可用

请就“最佳做法”提出建议。 对于某些上下文,您可以将此代码>通知“<代码>表”作为消息队列,不带ACK/NACK,具有消息属性,并且可以由“ToiUsSeriID”和“状态”字段排序。 谢谢大家!!
D.

您需要一个具有更精确主键的表。一旦设置到位,您就可以对状态更新的主键执行更新/插入(每个都是Cassandra中的UPSERT)

下表包含分区键
user\u id
status
,其中创建了一个分组列
。在面向用户而不是通知的表中,这种特定的数据分区设置将更有利于用户。为什么?这将有助于回答以下问题:“对于给定用户,给定状态的通知是什么?”如果通知对象可以由给定用户操作之外的内容更新,则通知应该具有status属性

  CREATE TABLE notifications (
  id timeuuid,
  created timestamp,
  to_user_id timeuuid,
  status varchar,
  msg text,
  --OLD LINE PRIMARY KEY ((to_user_id,status),created)
  PRIMARY KEY ((id),created)
) WITH CLUSTERING ORDER BY (created DESC);
可以按用户id创建第二个通知状态表,并且这两个表与
BATCH
语句保持同步。最佳做法是根据查询服务器上的表命名表
notifications\u by\u user
将是第二个查询的适当表名

如评论部分所述,如果您对研究Cassandra 3.0的物化视图功能感兴趣,请查看本文。请注意,在生产中实施之前,应了解它们。从博客帖子中

物化视图处理自动的服务器端非规范化, 不再需要客户端处理此非规范化和 确保基本数据和视图数据之间的最终一致性。这 非规范化允许在每个视图中快速查找数据 使用普通卡桑德拉读取路径


希望这些信息能帮助您更好地为数据服务。

回答我自己的问题

我总是在“状态”字段上磕磕绊绊,因为我需要这两个字段——受其限制并能够更新它,所以我决定,如果我尝试从我的等式中删除一个未知字段,会怎么样

新的范例实际上是模拟一个消息查询系统:我创建了3个表,即“队列”,而不是一个“状态”列:notifications\u pending、notifications\u ignored、notifications\u accepted。事实上,我真的不需要阅读一组混合的通知。相反,每个请求只有一个状态。也许我的rdbms习惯建议将状态作为一个专栏

嗯。“状态”不在我的范围内,我们有以下模型:

  • 3个表,其中通知_挂起用作队列,其他表-更像是存档
  • 我的状态更新操作现在由两个步骤组成:从“挂起”表中删除,并根据事件类型(接受或忽略)插入到所需的特定于状态的表中
  • 所有列都使用群集顺序描述
  • 请分享你的想法

    附言。
    当然,在信息“搬迁”之后,会出现一些新的问题,如前墓碑,但这是定义。单独寻址。

    收件人用户id应该是timeuuid吗?@Nathan,可以是uuid。一段时间以前,有一个基于时间的排序的想法,但没有探究它,只是离开了timeuuid。在这里使用timeuuid会遇到什么问题?谢谢我认为数据模型的类型没有问题。以下是我的假设,每个“通知”都应该是唯一的,但你说的不是。为什么不将跟踪通知的模型设置为将每个通知分开?最佳实践是查询驱动的数据模型,那么通知表服务于哪个查询?@Nathan,1。查询:从通知中选择*到_user_id=?和状态=?限制?和更新通知集status=“a”2。关于独特性。也许我是不正确的:消息本身显然是唯一的项目,但我们可能有几个消息具有相同的“to_user_id”和“status”。。所以我的问题基本上归结为无法使用通知id.P.S更新基表中的状态。刚刚意识到,可能是v3.0中的物化视图的情况?也就是说,有一个带有“id”主键的基表,并将其用于我的状态更新,但要有一个带有where子句的“只读”视图,并按“to_user_id”和“status”进行过滤?