我在BigTable中存储了一系列event
s,格式为:
rowKey | col_1 | col_2
----------------------|-------|------
uuid1!uuid2!timestamp | val1 | val2
....
col_1
持有float64
,col_2
持有string长63个字符。
这一系列event
s中的特定范围被分组,并且松散地与我们称为operation
的对象相关联:
{
"id": 123,
"startDate": "2019-07-15T14:02:12.335+02:00",
"endDate": "2019-07-15T14:02:16.335+02:00"
}
因此,您可以说operation
是event
的时间窗口,可能与10-1000 event
相关联。
当我想向用户显示这些数据时,我首先查询operation
对象,然后为每个operation
执行一个BigTable查询,以找到它所涵盖的event
。
通过monitoring,我发现每个BigTable(开发实例,请注意)查询可能需要20ms到300ms。
这让我想知道,鉴于BigTable的架构 - 执行小型的个人查询是否有意义?
执行覆盖我的operation
s范围的一个大查询,然后将事件划分到我的应用程序中各自的operation
是否更有意义?
分析解答
很可能是的,但细节在这里很重要。
如果每个用户请求只有几个操作,那么并行发出小查询实际上可能更好。这将为您提供每个请求的最佳延迟,但代价是集群的某些per-request CPU开销。您的应用程序代码也会更复杂。
如果每个用户请求有大量操作,那么您肯定希望通过扫描获得更高的吞吐量效率。
对于高级用例,您还可以在两者之间进行折衷,并将扫描分成并行运行的N个分片,其中N << #operations。
你绝对不应该做的一件事是一次发送一个小的请求,因为你只会产生一堆不必要的往返!