我在BigTable中存储了一系列events,格式为:

rowKey                | col_1 | col_2
----------------------|-------|------
uuid1!uuid2!timestamp | val1  | val2
....

col_1持有float64col_2持有string长63个字符。

这一系列events中的特定范围被分组,并且松散地与我们称为operation的对象相关联:

{
    "id": 123,
    "startDate": "2019-07-15T14:02:12.335+02:00",
    "endDate": "2019-07-15T14:02:16.335+02:00"
}

因此,您可以说operationevent的时间窗口,可能与10-1000 event相关联。

当我想向用户显示这些数据时,我首先查询operation对象,然后为每个operation执行一个BigTable查询,以找到它所涵盖的event

通过monitoring,我发现每个BigTable(开发实例,请注意)查询可能需要20ms到300ms。

这让我想知道,鉴于BigTable的架构 - 执行小型的个人查询是否有意义?

执行覆盖我的operations范围的一个大查询,然后将事件划分到我的应用程序中各自的operation是否更有意义?

分析解答

很可能是的,但细节在这里很重要。

如果每个用户请求只有几个操作,那么并行发出小查询实际上可能更好。这将为您提供每个请求的最佳延迟,但代价是集群的某些per-request CPU开销。您的应用程序代码也会更复杂。

如果每个用户请求有大量操作,那么您肯定希望通过扫描获得更高的吞吐量效率。

对于高级用例,您还可以在两者之间进行折衷,并将扫描分成并行运行的N个分片,其中N << #operations。

你绝对不应该做的一件事是一次发送一个小的请求,因为你只会产生一堆不必要的往返!