当前位置: 首页 > 知识库问答 >
问题:

在Cassandra中存储大量原始请求和响应的时间序列

温峻熙
2023-03-14

我有许多python进程,每个进程都重复查询一个单独的投注API。请求一次以~20-100的突发形式出现,然后该过程消失以解析响应并在大约一秒后重复。我希望使用卡桑德拉作为我的请求和响应的原始存储。这将允许我调试解析数据的问题和/或稍后重新解析。我正在尝试为此设计一个架构。

我想每个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>  

然后,我可以在请求和响应发生时将它们附加到正确的行中,并以每天一行按时间排序的请求和响应结束。然后,我可以轻松地返回并找到某一天的数据(这似乎是一次处理的合理数据块),然后根据需要转到当天的特定时间点。

这里的问题是显而易见的,给定我的时间戳分辨率,在完全相同的时间发出的两个请求将会相互覆盖。尽管不太可能,但这是错误的。

然后,我继续我不太喜欢的第二个想法,使用请求的时间戳和散列来消除键的歧义,假设同一时间的同一请求应该返回相同的结果,因此应该足够唯一,即str(时间戳)str(散列(请求)),这意味着模式变成(日期时间变成文本)

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

共有1个答案

葛言
2023-03-14

回答我自己的问题——我的误解在于,在CQL,键的第一部分总是行键,所以对于组合键,键的其余部分形成列键。映射也在同一行的不同列中结束,使用它们自己的键名“展开”约定,但是应用了限制大小。

 类似资料:
  • 我是Cassandra的新手,我想在Cassandra中存储加权图的时间序列,其中边权值随时间而增加,但也随时间而更新。例如, 我的第一个镜头涉及两个CQL v3表: 这个策略有什么可怕的低效吗?应该怎么做?我已经知道表2的更新过程不是幂等的,可能会导致不一致,但我暂时可以接受这一点。 edit:我可以做的一件事是将这两个表合并到一个时间序列表中。

  • TLDR:有一个请求/响应模式。目前,请求是通过激活队列完成的,响应是通过memcache键值存储完成的(由前端轮询)。出于各种原因,想转移到kafka,想知道我们是否可以重新构建响应路径,以不使用memcach。 我试图理解什么是针对以下问题的最佳实践系统设计。 我们有一个前端,可以生成需要大量处理的请求。应用程序需要响应才能升级。有时,我们需要撤消/后退(这会使您回到以前的状态)。有一组后端可

  • 我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者。 我想使用度量请求、响应和总时间。 我的示例请求如下所示: 目前我在Linux中使用命令来度量这个值: 但是time命令只测量总时间--这不是我想要的。 是否有任何方法可以使用来度量请求和响应时间?

  • 我正在使用带有Robospice(1.4.14)的Revovit(1.6.1)从一些服务中获取数据(响应应该在JSON中)。 在某些情况下,我可能会收到一个HTML错误页面,而不是一个JSON响应。服务器返回一个200状态代码,我不能改变它。在这种情况下,RoboSpice将调用方法。 在那里,我可以获得原始的expetion,但正文是。我是这样得到的: 在研究了reverfit的源代码之后,我发

  • 问题内容: 我知道使用该模块向URL发出GET请求的方法。最终,该代码仅在产生它的命令外壳中打印GET响应。 如何将这些GET响应存储在本地变量中,以便可以在程序中的其他地方使用它? 这是我使用的代码: 问题答案: 最简单的方法(但也有陷阱-见下文)是进入模块范围。 但是,这可能会导致错误。例如,您可能倾向于在致电之后。 由于异步,这将不起作用,因此它将在回调中设置之前返回控制。 创建事件发送器并

  • 我们正在评估Cassandra用于金融时间序列数据的过程中,并试图了解以最高效的方式存储和检索我们需要的数据的最佳方法。我们在一个虚拟机上运行Cassandra,该虚拟机上已经分配了8个内核和8GB RAM。主机的剩余资源(另外8个内核和12GB RAM)用于开发测试客户机应用程序。我们的数据目前存储在平面文件中,每天大约有100-150GB(未压缩)。就从cassandra检索数据而言,我们需要