【问题标题】:Keeping cassandra table projections in sync on update在更新时保持 cassandra 表投影同步
【发布时间】:2017-07-31 14:45:03
【问题描述】:

我正在开发一项使用 Cassandra 作为数据存储的服务。我目前正在实施 Stop 服务,其中将包含 Stops 列表(乘客可以上车的交通站点,例如公共汽车)。

我需要支持以下场景:

  1. 按 id 停止
  2. 按公司 id 和机构 id 获取所有站点,按代码 asc、名称 asc 排序

这是我实现表格以支持这一点的方式:

CREATE TABLE IF NOT EXISTS stops(
    id                        uuid,
    client_id                 uuid,
    agency_id                 uuid,
    code                      varchar,
    name                      varchar,
    latitude                  double,
    longitude                 double,
    is_wheelchair_accessible  boolean, PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS stops_by_client_id(
    client_id                 uuid,
    agency_id                 uuid,
    code                      varchar,
    name                      varchar,
    id                        uuid,
    latitude                  double,
    longitude                 double,
    is_wheelchair_accessible  boolean,
    PRIMARY KEY ((client_id, agency_id), code, name, id)
);

问题:

这在我插入数据并读取数据时效果很好。需要更新一站时出现问题:

  1. 更新停靠点并设置新代码、名称、纬度、经度等。
  2. stops 表上的更新不是问题,但我未能在stops_by_client_id 投影上应用相同的更改。

到目前为止我尝试了什么:

  1. 我尝试通过 client_id、agency_id 和 id 更新行,但它需要传递所有主键值(client_id、agency_id、代码、名称、id)但在我的 StopUpdated 事件中(我触发更新) 我没有可用于构造此类查询的代码和名称的先前值。
  2. 我尝试先删除该行,然后插入新行(以模拟更新),但失败的原因与 1 相同。
  3. 我尝试如下构造主键PRIMARY KEY ((client_id, agency_id, id), code, name),但这会将每一行放在它自己的分区中,这会使选择查询非常低效。
  4. 我不能使用实体化视图,因为我需要某些字段(例如代码、is_wheelchair_accessible)的二级索引,以便过滤它们。

关于如何解决这种情况的任何想法?

【问题讨论】:

  • 一个表可以同时具有物化视图和二级索引,所以 4) 仍然是一个选项。

标签: cassandra cassandra-3.0


【解决方案1】:

最后,我更改了架构并修改了StopUpdate 事件以包含新旧状态(更新前后)。这样我就有了组装查询所需的所有信息。

【讨论】:

    【解决方案2】:

    使用 id 获取您要更新的行的 client_id 和 Agency_id 的现有值以及其他复合键,并使用这些值删除 stops_by_client_id 中的行。

    更新stops 表中的该行后,您必须从表中获取该ID 的其他列的值,并在stops_by_client_id 表中创建一个新行。

    希望这是您正在寻找的。

    【讨论】:

    • 当对这些表的更新是同步的时,这将起作用,但在我的情况下,对这些表的更新是以异步方式完成的,因为写入它们的处理器接收异步事件(StopUpdated)。我忘了在我的问题中提到这一点。感谢@b1k 的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2015-07-25
    • 2018-02-14
    • 2017-10-18
    相关资源
    最近更新 更多