4

我有一系列事件流经系统(例如披萨订购系统),我想计算每个事件的某些属性随着时间的推移。例如,我可能想查看过去 5 分钟内有多少独特的人点了意大利辣香肠比萨,或者 John Doe 在过去一周点了多少比萨。

这是很多事件,所以我们使用 Cassandra 或 HBase 之类的东西,因为即使是计数也不能存储在内存中。此外,由于我们需要跟踪集合成员资格(例如,为了计算订购特定类型披萨的独特人),它变得更大。

我们可以存储一个订单列表,然后查询计数,但这很慢。而且我们大多不在乎点了意大利辣香肠比萨,只在乎有多少独特的订单,以及在给定的时间窗口内。

存储此信息的最佳方式是什么,例如在 Cassandra 中,以便可以在某些时间间隔内检索信息?

我一开始尝试使用 Redis + 布隆过滤器,但是存储布隆过滤器位向量需要事务以避免竞争条件,所以我使用了 redis 集。

然后我意识到整个事情太大了,不能只在内存中,所以我决定切换到磁盘支持的存储。但是,没有像 redis 那样的原生集合。

我查看了像 HyperLogLog 这样的草图/流式算法,但结论是,为了保存 hyperloglog 对象,我需要存储位数组(或腌制对象或其他任何东西)......这是洁净的吗,最好的做法是什么,如果这确实是解决方案?

我很想用时间戳单独保存每个事件,然后按需查询和计数,但这很慢。我正在寻找更好的东西,如果它存在的话。

示例请求:

  • 过去 10 分钟内有多少独特的人点了意大利辣香肠披萨
  • 在过去 30 分钟内,某人 John Doe 订购了多少个独特的意大利辣香肠披萨
4

2 回答 2

1

根据我所学到的,有几种方法可以解决这个问题。

  1. 使用锁定 + 设置成员资格/计数数据结构,例如 hyperloglog 或布隆过滤器。只要没有针对特定锁的太多争吵,事情就应该没问题。
  2. 使用具有内置集合/集合支持的数据库。他们几乎在内部实现了#1。
于 2013-08-29T23:27:05.827 回答
0

我的猜测:

  • cassandra 支持计数器——我想我看到了一些应该同时工作的 incr 操作——通过在你的事件上使用自由运行的计数器,你只需要设置一些东西,以指定的时间间隔(5 分钟?)对所有计数器进行采样,然后你可以在两个之间给出估计样本(http://wiki.apache.org/cassandra/Counters
  • cassandra 可以使列超时..我从来没有真正使用过它,但它可能值得一试
于 2013-08-26T22:44:47.750 回答