有一批随着时间不断增加的数据
多个程序获取这批数据, 每次获取 n 个, 每个程序都能拿到所有的数据, 但是不能重复获取.
例如: 数据 [1, 2, 3, 4, 5]
第一次: 程序 A [1, 2], 程序 B [1]
第二次: 程序 A [3, 4], 程序 B [2, 3, 4, 5]
这个结构该如何设计呢?
1
weixuan 2020-08-03 00:06:47 +08:00 1
正好最近在看 Redis 相关的书籍,可以参考一下 Redis 的 Stream 部分如何实现的,不断增加数据 [1, 2, 3, 4, 5] 就是消息链表,程序 A 程序 B 对应不同的消费组,每个消费组会有个游标 last_delivered_id 在 Stream 数组(消息链表)之上往前移动,表示当前消费组已经消费到哪条消息了。或者参考一下 Kafka 的实现(据说 Redis 的 Stream 借鉴了 Kafka 的设计,对 Kafka 不熟悉,未验证,有错勿怪)
|
2
luvcrashbot 2020-08-03 01:11:08 +08:00 via iPhone
链表,每个链表关联一个订阅表,订阅表里存的所有订阅者 offset 都大于某个 item 则去掉这个元素。
|
3
opengps 2020-08-03 08:34:05 +08:00
好奇问一下:多个程序获取这批数据, 每次获取 n 个, 每个程序都能拿到所有的数据, 但是不能重复获取.
这是个什么样的需求场景呢?我理解这种需求应该从程序层面做过滤(比如组合 id,id 然后 hash 去重),而不是靠取值时候修改返回量 |
4
arvinsilm 2020-08-03 12:09:08 +08:00
消息队列分组订阅
|
5
YakuMioto OP @weixuan @arvinsilm 确实可行~
@luvcrashbot 第一版就是这么实现, 想找个更简单的方法. @opengps 想做个代理池, 代理池就有这种需求. 哈哈哈 感谢各位出谋划策, 想做的是个简易的代理池, 所以还涉及到 ip 可用性的校验以及丢弃, 基于 kafka 或者 redis 可能会变得更复杂.. 所以打算基于 map 实现了. |