V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EthanDon
V2EX  ›  程序员

关于消息队列对选型和微服务

  •  
  •   EthanDon · 2019-04-29 16:53:49 +08:00 · 4624 次点击
    这是一个创建于 2020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前没用过消息队列,背景是这样的:

    生产者分发题目到多个消费者,消费者计算出结果再汇总。这个业务量应该很大,百万级别吧。

    分发需要消息队列吗?目前看中了 nsq,因为程序是 go 语言开发,nsq 有一个负载均衡的功能;

    汇总需要消息队列吗?其实汇总就是为了方便统计结果,目前的思路是写到一个数据库,每个机器打包多条结果发送到消息队列再由数据库所在服务器进行写入,或者直接写入?有什么更好的方法吗?

    另外需要上微服务吗?目前只考虑计算 A 结果,后续可能会有 B 结果 C 结果,上微服务有利于扩展吗?

    老大要我给出中间件到调研结果。。。

    18 条回复    2019-04-30 10:47:34 +08:00
    xyqhkr
        1
    xyqhkr  
       2019-04-29 17:05:38 +08:00
    nsq 支持的客户端较少。貌似现在也不怎么更新了。。kafaka 比较多吧
    wind3110991
        2
    wind3110991  
       2019-04-29 17:13:20 +08:00
    ( 1 )百万级别不算多,你的场景加好锁就行了;
    ( 2 )多个消费者直接从消费者取,不用分发;
    ( 3 )一定要用消息队列的话,建议用 kafka,单独开一个 topic ;
    ( 4 )计算结果结束后,如果结果之间存在关联关系,需要再次写入队列计算,这里用消息队列和 queue 都可以;
    不要介意,总感觉你这个需求感觉说的不清不楚,有点为了用消息队列和为了用微服务而用的感觉。
    EthanDon
        3
    EthanDon  
    OP
       2019-04-29 17:18:19 +08:00
    @xyqhkr 你知道哪个消息队列支持多个生产者一个消费者的模式吗?
    EthanDon
        4
    EthanDon  
    OP
       2019-04-29 17:22:19 +08:00
    @wind3110991 感谢回复,的确是这样的。我还是个 noob,微服务和消息队列之前都没接触过,既然被委任调研中间件就思考了一下怎么去用,怎么可能用得上。。
    ( 2 ) 这个怎么直接取呢?利用 redis 吗?
    ( 3 ) kafka 可以支持多个生产者一个消费者吗?
    ( 4 )应该是没有关联的。其实计算结果是一些指标,比如 url 能不能访问,延迟多少之类的。
    wind3110991
        5
    wind3110991  
       2019-04-29 17:30:19 +08:00
    ( 2 )一个进程取所有题目回来,开 N 个子线程直接消费;
    ( 3 )可以,https://www.jianshu.com/p/6233d5341dfe
    ( 4 )那你可以多个消费线程计算后直接刷新数据库;
    你其实要理解的是,消息队列就是个管道,主要是为了解耦系统模块与模块之间的高耦合,降低相互之间的依赖,防止一个部分挂了后,整个系统都 GG ;
    EthanDon
        6
    EthanDon  
    OP
       2019-04-29 17:40:33 +08:00
    @wind3110991 嗯嗯谢谢
    ( 4 )里面还有一个问题是消费者是部署在多个机房甚至是跨网络的,直接访问数据库可能不太方便(这里我也不是很明白什么意思,当初老大给我讲让消费者直接读数据库可能不太好,但是我想再昂贵的操作也不过就是 http 了吧。。。)
    LeoQ
        7
    LeoQ  
       2019-04-29 19:31:56 +08:00 via iPhone
    感觉像监控系统 hhh
    9hills
        8
    9hills  
       2019-04-29 19:37:12 +08:00 via iPhone
    kafka 你这个需求都可以。

    其实 redis 5.0 刚刚也支持 queue 了,你可以用这个,简单
    opengps
        9
    opengps  
       2019-04-29 20:03:04 +08:00
    量将来会更大,消息队列就很有必要了
    汇总部分已经做了打包,写入不密集,可以考虑下直接写入数据库,不过多了个数据库挂掉丢数据的问题
    至于微服务,我不太懂没啥可说的
    wind3110991
        10
    wind3110991  
       2019-04-29 20:30:23 +08:00
    @EthanDon 你这个就是分布式理论 CAP 中的 C (一致性),在延时不一致的消费情况下,如何在 C 和 A 之间做平衡和取舍。这个看你们对数据的要求,如果是诸如报表之类的展示分析型数据,可以适度舍弃可用性,保证一致性即可。但是如果是关键数据,涉及计费和关键业务的,要保证数据是高可用的。
    fishioon
        11
    fishioon  
       2019-04-29 20:31:28 +08:00 via iPhone
    redis 5.0 的 stream 考虑一下?
    version
        12
    version  
       2019-04-29 20:42:02 +08:00
    用阿里云的消息队列咯.蛮多的.而且还有 http 这样方便很多
    自己搭不靠谱.没经验维护不好.掉包出错重发怎么处理..百万级当练手.不可能吧.
    yippees
        13
    yippees  
       2019-04-29 21:31:52 +08:00
    干嘛不直接数据库计算好了··
    百万级别 数据库也不至于撑不住吧
    kimown
        14
    kimown  
       2019-04-29 21:41:29 +08:00 via Android
    redis 完美解决
    petelin
        15
    petelin  
       2019-04-29 21:45:26 +08:00 via iPhone
    百万级汇总直接扔
    Es 得了一点不用操心
    troywinter
        16
    troywinter  
       2019-04-29 22:47:56 +08:00
    你需要的不是消息队列,你需要的是 streaming system,参考 flink, spark, storm,这事是典型的 map reduce
    wc951
        17
    wc951  
       2019-04-30 08:26:05 +08:00 via Android
    这个不是典型的流式计算吗,消息队列在这里面只是作为数据源而已
    lwb
        18
    lwb  
       2019-04-30 10:47:34 +08:00
    学习下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:48 · PVG 09:48 · LAX 17:48 · JFK 20:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.