分析 :
Redis 发布订阅 :publish指令 subscribe指令
1. 单发布者生产者极限本机约8w
2. 发布者根据chanel发布msg
3. 订阅者根据chanel订阅msg
4. 如果发布者发布了但没有订阅者正在监听则数据丢失
Redis 生产者消费者: LPUSH命令(Producer) BRPOP命令(Consumer)
1. 单生产者或者消费者极限本机约8w
2. 生产者利用LPUSH命令将msg以key-value形式推入队列中
3. 消费者使用阻塞POP命令以key将对应value在队列中取出
4. 如果生产者生产了但是没有消费,数据将会堆积在队列中等待消费
5. 如果有两个消费者,那他们之间不会取到相同一个数据,因为队列中的数据每次消费都会被pop掉
kafka生产者消费者:
1. 单生产者加消费者极限本机约20w-30w
2. 生产者根据key决定msg被写到Topic的哪个分区,一个Topic有多个分区,key也作为msg的附加信息
3. 消费者根据Consumer Group 去取msg,不同的Consumer Group取消息互不影响,同一组中只有一个人消费者接收消息
思路:
利用Redis实现部分kafka功能,可以在上述生产者消费者基础上修改
分析:
1. (生产者)根据Topic生产储存msg 使用redislist 将Topic做为key msg作为value
2. (消费者)根据Topic消费msg 使用lrang的方式获取msg
3. 如何确定lrange的index 使用HSET 储存 groutid(key_name) Topic(field) Offset(value)
4. 可以多个消费者共同消费数据并不冲突 同上,通过groutid和Topic 确认唯一Offset,并不冲突
5. 多个进程中同一个groupid 只能有一个在取得状态
用set指令修改”groutid:Topic:status“标识任务队列状态 “0” 表示没人在取 ”1“表示有人在取
ci.markID = time.Now().UnixNano()标识本函数
用set指令修改”groutid:Topic:markId”标识正在取值的函数 判断是否是自己