1.1. php + redis 高并发实时数据处理
- 需要有序队列处理 毫秒级数据
- 有序集合 + hash
- 数据来源 rabbitmq
- 平均1s 1200条数据 单条数据需要处理 10次 对应不同业务
1.rabbitmq 消耗速度要达到生产速度
- 方案1 php rabbiqmq 消息 ttl 3s 过期 多进程无法保证消息顺序 ,但是单进程无法快速消耗掉消息会导致消息过期
- 瓶颈 在 redis 数据插入上无法达到处理速度
- 方案2 使用go接入 单个消费 协程+通道 插入redis 轻松达到处理速度
2.单条 消息 10次处理 平均0.4s 需要 8min 才能处理掉 1200条数据
- php 多进程任务消耗 锁机制处理
- go 接入后避免上游生产数据队列中的数据乱序 推送到redis
- php 多进程处理任务 用redis 形成任务栅栏 保证消息顺序执行 hash+zlist 实现有序处理
- php 任务进程切换造成cpu占用较高
- redis cpu 过高 + mongo 内存越来越大
1.2. 注意
- 插入和消耗 zlist && hash 需要保持事务处理
- 采用 pipeline 一次性的发送多个命令,无需等待服务端返回
pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力