【发布时间】:2015-04-09 01:47:24
【问题描述】:
我有许多 python 进程,每个进程都重复查询一个单独的投注 API。请求一次以约 20-100 个突发形式出现,然后该过程会消失以解析响应并在一秒钟左右重复。我希望使用 Cassandra 作为请求和响应的原始存储。这将允许我调试解析数据的问题和/或稍后重新解析。我正在尝试为此设计一个架构。
我想我可以为每个 API 提供一个单独的表(列族),对此没什么好说的。我对表模式的最初想法是:
stripe text, // free text to describe the flavour of the request, e.g. live games
date int, // YYYYMMDD
requests map<datetime, text>,
responses map<datetime, text>
然后,我可以在请求和响应发生时将它们附加到正确的行,并以每天按时间排序的请求和响应结束。然后我可以轻松地返回并查找给定日期的数据(这似乎是一次处理的合理数据块),然后在需要时转到当天的特定时间点。
这里的问题很明显,考虑到我的时间戳分辨率,在同一时间发出的 2 个请求最终会相互覆盖。虽然不太可能,但它是错误的。
然后我继续我不太喜欢的第二个想法,使用时间戳和请求的哈希来消除密钥的歧义,假设同一请求同时返回相同的结果,因此足够独特,即str(timestamp) + str(hash(request)),意思是schema变成(datetime变成text)
stripe text, // free text to describe the flavour of the request, e.g. live games
date int, // YYYYMMDD
requests map<text, text>,
responses map<text, text>
这很糟糕,因为文本占用更多空间并且比较慢,但我愿意接受它,然后我遇到了这个问题:
E InvalidRequest: code=2200 [Invalid query] message="Map value is too long. Map values are limited to 65535 bytes but 435145 bytes value provided"
这基本上是在告诉我,无论如何我都不能将这些东西放在集合列中,因为响应的大小是任意的,而且几乎总是大于限制。
我是 Cassandra 世界的新手,但我认为这些 CQL 映射最终对应于记录中单独的列名和值,并且每列的大小限制为 2GB。我能想到的一件事是不使用映射并每次都更改表架构,然后将正常值插入单元格,但我不确定在底层存储中有什么不同。
所以我想我有两个问题:
- 这只是 CQL 的限制还是 Cassandra 的全部限制?
- 有经验的人能想出一个整体上更好的方法吗?
感谢阅读
KCH
【问题讨论】:
-
我怀疑答案可能存在于datastax.com/dev/blog/thrift-to-cql3
标签: python dictionary cassandra