A 服务高并发的上报数据,
B 服务是多点部署的,B 服务要接收 A 服务的上报数据,并对上报的数据及时的汇总进行后需要的监控报警操作。
这个场景该怎么设计好,求大佬们支招?
抛砖引玉:
A 服务通过 MQ 上报数据,
B 服务消费数据,在消费到一条数据后存储到 redis 中,然后触发一个异步的汇总线程任务。
异步汇总线程任务: 申请一个 redis 锁(确保只有一个任务在做汇总操作),拉取所有的明细数据,汇总后将汇总结果存储到 redis 中(如果已经存在一个汇总结果,则合并结果),删除明细数据,释放 redis 锁。
另外问一个 MQ 的问题:
我再 MQ 中通过 fanout Exchange 模式,将一个消息发送到两个队列,
然后每个队列中各有 5 个消费者,
那么是不是每个队列只有一个消费者可以消费到数据?
就是说实现了类似 kafka 中对消费者分组的那种效果:每组消费者都可以消费到数据,每组消费者中只有一个消费者可以消费到数据。
1
opengps 2019-05-21 12:49:29 +08:00 via Android
A 尽量合并上报
B 扩展负载均衡,扩展队列保证数据快速收取,然后再找一组机器从队列取数识别报警 |
2
xkeyideal 2019-05-21 16:50:42 +08:00
刚好有个类似的场景,目前我的项目中 B 是单点,同样也考虑过 B 是多点部署的问题,下面是我的解决思路:
1. 需要引进一个 C,C 可以单点部署,C 专门用来接收 MQ 中 A 发送的消息 2. C 需要进行消息的路由分发工作,即提前对同类消息进行分片操作,B 的单点机器只处理分片后的某类消息 3. 上述方案,本质上还是将 B 变成单点,避免消息汇总的操作,单点即不安全,那么可以使用 raft 协议将单点变成集群 4. 随着数据量的增加,分片的量如果不够多,那么随着类别的增多,也必然对 B 造成压力 5. 解决 4 的问题方案有两种,直接用另外更多的机器把全套系统搭起来,然后将负载切过来,原来的机器下线;采用 redis 的 slot 扩容方案 |