V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
bigpigeon
V2EX  ›  Linux

rocketmq 踩坑和吐槽

  •  
  •   bigpigeon · 2021-01-15 10:54:50 +08:00 · 4657 次点击
    这是一个创建于 1433 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 1 个 queue 只能被一个消费者订阅,也就是说如果你消费者增加时必须手动调整 topic 的队列数
    • round robin 只在 queue 层面,可以理解为就是生产者吧消息平均分配到多个 queue 上,但 queue 只能被单消费者消费,在慢任务做负载均衡不好做
    • 没有 create topic 的 api,必须通过 mqadmin 来创建 topic,极其麻烦
    • go sdk 的 consumer 连 ConsumeTimeout,ConsumeConcurrentlyMaxSpan,PullThresholdForQueue 这几个这么重要的参数都没有暴露出来,并发控制都不好做
    • go 的 sdk 日志乱打,1 秒几十行的无用日志,压根没法正常阅读,必须通过环境变量控制日志级别

    这 2 个月用下来的体验就是 go 开发者建议还是使用 nsq,没有入坑的别踩这个坑了

    阿里的组件还是别碰的好

    25 条回复    2021-07-03 10:29:07 +08:00
    fantastM
        1
    fantastM  
       2021-01-15 11:31:26 +08:00
    对于第一点,据我了解,Kafka 中的分区和消费者也是这种设计。这样做的原因估计是在实现上会简单很多吧
    hun2008hun
        2
    hun2008hun  
       2021-01-15 11:38:48 +08:00
    推荐下 pulsar 吧,前三个问题都可以解决。go sdk 不了解,我只用过 java client
    ylsc633
        3
    ylsc633  
       2021-01-15 11:51:09 +08:00
    go rmq sdk 问题挺多的 当然了,也可能是我菜, 不会用..
    ddxx200
        4
    ddxx200  
       2021-01-15 12:10:12 +08:00
    我一直用 RocketMQ,不过是 Java 的,没什么问题哈
    bigpigeon
        5
    bigpigeon  
    OP
       2021-01-15 12:14:04 +08:00
    @ylsc633 是啊
    go sdk 我还遇到 一个 go 进程的 producer 关了,consumer 也不可用
    一个进程无法创建多个 consumer 对象,等等问题,如果不是老大拍板,我肯定换回 nsq 了
    rnicrosoft
        6
    rnicrosoft  
       2021-01-15 12:25:22 +08:00 via Android
    关于第一个,我觉得没啥问题,1 个 topic 下面多个 queue 本身就是实现一种负载均衡了。多个消费者可以扔进一个消费 group 里,不需要去做每个消费者和 queue 之间的绑定,可以按负载随时启动新的消费者实例
    young1lin
        7
    young1lin  
       2021-01-15 12:29:41 +08:00 via Android
    ons client[doge],用过加 tag 的 topic,不好用。
    yzbythesea
        8
    yzbythesea  
       2021-01-15 12:33:28 +08:00
    @bigpigeon 慢任务下为什么不好做负载均衡?
    joesonw
        9
    joesonw  
       2021-01-15 12:50:28 +08:00
    对数据有保障性要求的话还是 rabbitmq 吧. nsq 没 persistence, 每次都落盘的话性能就爆炸了.
    duwan
        10
    duwan  
       2021-01-15 12:52:19 +08:00
    前两点在 kafka 中不也是一样的嘛?
    第三点为了生产环境的资源考虑的吧,只有运维人员可以操作,不允许开发人员随意创建 topic,开发环境可以配置自动创建不存在的 topic
    后两点不了解
    cassyfar
        11
    cassyfar  
       2021-01-15 12:59:35 +08:00
    貌似整个 topic management 都不支持。。。阉割版 go client

    是不是 go 在阿里是五等公民,没人用,没人做?
    bigpigeon
        12
    bigpigeon  
    OP
       2021-01-15 14:08:17 +08:00
    @yzbythesea 恰好有些耗时长的任务丢到某个队列,导致堆积的很长这种情况
    我们这边需求是想要一些竞争去取任务方法
    no1xsyzy
        13
    no1xsyzy  
       2021-01-15 14:10:46 +08:00
    @young1lin 你触发了我的眼 parse,觉得是用 ons 包管理器安装一个叫做 client 的包,并具有参数 [doge] ……
    bigpigeon
        14
    bigpigeon  
    OP
       2021-01-15 14:11:53 +08:00
    @duwan 而且创建 topic 只能发送方创建,我开发环境订阅一个不存在的 topic 直接报错
    再说非要运维手动管理也不方便吧,比如调整个 topic queue 的操作都没法自动化
    rainfd
        15
    rainfd  
       2021-01-15 14:34:46 +08:00
    @bigpigeon 你订阅一个不存在的 topic 报错这逻辑没啥不对的吧
    bigpigeon
        16
    bigpigeon  
    OP
       2021-01-15 14:38:29 +08:00
    @rainfd 所以要 api 啊,在开发的时候方便创建 topic
    shuangchengsun
        17
    shuangchengsun  
       2021-01-15 14:40:45 +08:00
    关于第一个点,consumer 只要指定 group 了貌似就没有这个烦恼了吧,再就是 create topic 的事儿,我记得是可以通过配置来实现是否允许自己创建 Topic,只不过一般都是关闭的,一般来说部署的时候都是不允许自己创建 Topic,无论是在什么环境都会是关闭的,不然管理起来会很混乱。在阿里里面,有一个运维平台去创建 Topic,只不过在开发环境做的配置,会随着开发流程的推进,同步到测试环境,集成环境直到生产环境。不过我倒是没有用过 go 的 sdk 。
    yukong
        18
    yukong  
       2021-01-15 14:55:14 +08:00
    1. 用过 kafka 都知道 消费者跟消费者组的区别
    2.生成产者的路由规则可以根据 key 与 tag 设置 消费者跟消费者组设置
    3. 从运维层面来看 api 创建 topic 跟删除 topic 都是很危险的行为
    4. go 的 sdk 没有用过 你可以检查一下是不是官方的 反正 java 可以设置
    5. 日志配置 java 配置还是很灵活的 go 不清楚
    yukong
        19
    yukong  
       2021-01-15 14:56:31 +08:00
    关于配置或者日志设置这一方面 可能 go 的 sdk 支持的不是很到位,比较 go 的生态才刚刚起来 要理解一下
    TypeError
        20
    TypeError  
       2021-01-15 15:00:37 +08:00
    MQ 选用的人多的,
    传统金融业务小吞吐选 RabbitMQ 、大吞吐高性能的选 Kafka
    bigpigeon
        21
    bigpigeon  
    OP
       2021-01-15 15:01:46 +08:00
    @shuangchengsun 不同的 group 消息是互相独立的,也就是说一条消息在 2 个组会分别被消费一次,相当于 redis 的 pub sub,我们的需求是消费消息的负载均衡
    bigpigeon
        22
    bigpigeon  
    OP
       2021-01-15 15:11:46 +08:00
    @yukong 特别是文档方面的,rocketmq 的文档写的感觉也很简单,特别是 go sdk 的文档,基本等于没有,全靠阅读源码找用法
    还有就是 rocketmq 的容器化部署也不方便
    日志还是默认打到文件里面而不是 stdout
    而且 dashboard 是第三方的,还得自己想办法构造 Docker image
    相比之下 nsq 这方面就做的好很多
    YouLMAO
        23
    YouLMAO  
       2021-01-18 16:15:42 +08:00
    kpi 3.25
    cominghome
        24
    cominghome  
       2021-01-22 17:28:28 +08:00
    凑合用吧,毕竟 KPI 产物,文档写得鬼一样
    bthulu
        25
    bthulu  
       2021-07-03 10:29:07 +08:00
    @hun2008hun pulsar 的 java client 太大了, 加上它自身的依赖, 高达 36.1M. 我本身项目其余所有依赖加起来都没这家伙大, 不知道 pulsar 在搞什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1320 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:34 · PVG 01:34 · LAX 09:34 · JFK 12:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.