V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

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

  •  
  •   rizon ·
    othorizon · 2019-05-21 11:12:01 +08:00 · 1100 次点击
    这是一个创建于 2043 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

    2 条回复    2019-05-21 16:50:42 +08:00
    opengps
        1
    opengps  
       2019-05-21 12:49:29 +08:00 via Android
    A 尽量合并上报
    B 扩展负载均衡,扩展队列保证数据快速收取,然后再找一组机器从队列取数识别报警
    xkeyideal
        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 扩容方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5182 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.