我有一系列事件流经系统(例如披萨订购系统),我想计算每个事件的某些属性随着时间的推移。例如,我可能想查看过去 5 分钟内有多少独特的人点了意大利辣香肠比萨,或者 John Doe 在过去一周点了多少比萨。
这是很多事件,所以我们使用 Cassandra 或 HBase 之类的东西,因为即使是计数也不能存储在内存中。此外,由于我们需要跟踪集合成员资格(例如,为了计算订购特定类型披萨的独特人),它变得更大。
我们可以存储一个订单列表,然后查询计数,但这很慢。而且我们大多不在乎谁点了意大利辣香肠比萨,只在乎有多少独特的订单,以及在给定的时间窗口内。
存储此信息的最佳方式是什么,例如在 Cassandra 中,以便可以在某些时间间隔内检索信息?
我一开始尝试使用 Redis + 布隆过滤器,但是存储布隆过滤器位向量需要事务以避免竞争条件,所以我使用了 redis 集。
然后我意识到整个事情太大了,不能只在内存中,所以我决定切换到磁盘支持的存储。但是,没有像 redis 那样的原生集合。
我查看了像 HyperLogLog 这样的草图/流式算法,但结论是,为了保存 hyperloglog 对象,我需要存储位数组(或腌制对象或其他任何东西)......这是洁净的吗,最好的做法是什么,如果这确实是解决方案?
我很想用时间戳单独保存每个事件,然后按需查询和计数,但这很慢。我正在寻找更好的东西,如果它存在的话。
示例请求:
- 过去 10 分钟内有多少独特的人点了意大利辣香肠披萨
- 在过去 30 分钟内,某人 John Doe 订购了多少个独特的意大利辣香肠披萨