多点部署的系统下高并发的数据收集汇总,怎么设计?

2019-05-21 11:12:01 +08:00
 rizon

A 服务高并发的上报数据,
B 服务是多点部署的,B 服务要接收 A 服务的上报数据,并对上报的数据及时的汇总进行后需要的监控报警操作。

这个场景该怎么设计好,求大佬们支招?

抛砖引玉:
A 服务通过 MQ 上报数据,
B 服务消费数据,在消费到一条数据后存储到 redis 中,然后触发一个异步的汇总线程任务。
异步汇总线程任务: 申请一个 redis 锁(确保只有一个任务在做汇总操作),拉取所有的明细数据,汇总后将汇总结果存储到 redis 中(如果已经存在一个汇总结果,则合并结果),删除明细数据,释放 redis 锁。


另外问一个 MQ 的问题:
我再 MQ 中通过 fanout Exchange 模式,将一个消息发送到两个队列,
然后每个队列中各有 5 个消费者,
那么是不是每个队列只有一个消费者可以消费到数据?
就是说实现了类似 kafka 中对消费者分组的那种效果:每组消费者都可以消费到数据,每组消费者中只有一个消费者可以消费到数据。

1019 次点击
所在节点    程序员
2 条回复
opengps
2019-05-21 12:49:29 +08:00
A 尽量合并上报
B 扩展负载均衡,扩展队列保证数据快速收取,然后再找一组机器从队列取数识别报警
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 扩容方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX