【发布时间】:2014-08-12 01:52:33
【问题描述】:
我们目前正在重写我们的点对点服务总线目录 (Zebus)。
我们有一个 Cassandra/Thrift 实现,必须对其进行改进以满足一些新的负载需求,因此使用 CQL 重写它似乎是正确的做法。
我们有两个 CF,一个用于存储 Peers,一个用于存储 Subscriptions,后者是最棘手的。
我们需要存储每个消息类型的路由键(绑定)列表,以及每个对等点的消息类型列表。我们还需要能够分别更新每种消息类型的路由列表(我们使用 Cassandra 的时间戳来处理潜在的竞争条件,因为我们有多个目录)。最后,我们需要能够在有人请求 Peers 状态时列出所有这些订阅。
最后一点是一个问题,因为它意味着运行SELECT * FROM "Subscriptions",这意味着列出来自多个节点的行(顺便说一句,CQL 如何允许您列出底层的 Cassandra 行?)而且速度很慢。
因此,我们最终为 CF 提供了以下架构,以将所有内容连续存储在同一 Cassandra 行的磁盘上,并具有出色的读取性能(我们知道这在平衡节点之间的数据方面非常糟糕)。
CREATE TABLE IF NOT EXISTS "DynamicSubscriptions" (
"UselessKey" boolean,
"PeerId" text,
"MessageTypeId" text,
"SubscriptionBindings" blob,
PRIMARY KEY("UselessKey", "PeerId", "MessageTypeId")
);
这很丑陋,但可以解决问题,每个人最终都在同一个“Thrift row”上,导致读取速度快如闪电。
所以我的问题如下:如果我希望我的数据在不受约束的 SELECT 期间非常快速地可查询,是否有一种漂亮方法可以使用 CQL 设计 CF?
(或者如果您认为我们的设计完全有缺陷,请随意说)。
【问题讨论】:
-
我不确定我是否正确理解了您的数据模型 - 对于您想要存储消息类型列表的每个对等点以及您想要存储绑定列表的每个消息类型,对吗?特定消息类型的绑定列表是否为每个对等方独立定义?第二个问题——你想每次都选择所有数据吗?还是单个同行的数据?
-
是的,我们希望为每个对等方独立地存储特定消息类型的不同绑定。关于检索,我们希望能够为特定对等点选择数据。
标签: database-design cassandra cql zebus nosql