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

请教一个消息队列方案

  •  
  •   yxjn · 2019-05-29 18:21:16 +08:00 · 4191 次点击
    这是一个创建于 2005 天前的主题,其中的信息可能已经有所发展或是发生改变。

    该系统是一个上游系统,有个需求,需要同步消息到下游服务,下游服务有很多,功能一样,拥有的权限不一样。 每个下游服务需要同步的信息不一样,即上游要分好权限,同步不同的信息给下游。 比如说 A 机器需要 i 信息,B 机器需要 j 信息,C 机器需要 ij 信息。

    问题是,如果想用 mq 的方案,怎么实现。比如说 kafka,每个机器分一个 topic 性能是不是难以保证,因为下游服务数量可能成百上千。

    另外,如果新加一个机器,需要全量同步之后再用 mq 同步,是不是也不好做,现在没想出什么方案可以解决初始化全量的问题。

    20 条回复    2019-05-30 12:17:16 +08:00
    lecher
        1
    lecher  
       2019-05-29 18:23:57 +08:00
    考察一下 pulsar 这类的支持订阅多个主体、支持权限的 MQ ?
    petelin
        2
    petelin  
       2019-05-29 18:41:58 +08:00   ❤️ 1
    kafka, 创建不同的 topic, 然后每个 topic 创建多个 Partition 就行了

    初始化全量更新, 可以将这些数据先写到流里.
    mooncakejs
        3
    mooncakejs  
       2019-05-29 18:44:14 +08:00
    支持 tag 的消息队列
    j2gg0s
        4
    j2gg0s  
       2019-05-29 20:33:10 +08:00
    RabbitMQ 会更适合
    dawncold
        5
    dawncold  
       2019-05-29 23:13:14 +08:00
    告诉下游哪些数据有变更让他们来取?
    CoderGeek
        6
    CoderGeek  
       2019-05-30 01:33:17 +08:00
    zk ? 订阅和发布注册监听的意思吗? pull 还是 push
    CoderGeek
        7
    CoderGeek  
       2019-05-30 01:34:16 +08:00
    消息队列只是其中一个 还需要其他辅助的实现把
    ysweics
        8
    ysweics  
       2019-05-30 09:52:04 +08:00 via iPhone
    用队列通知下游说权限更新了,下游收到消息自己去接口里面拉权限,不一定非要在队列消息里面把权限信息给过去
    axbx
        9
    axbx  
       2019-05-30 10:34:50 +08:00
    用 rabbitmq 吧 支持模式匹配
    yxjn
        10
    yxjn  
    OP
       2019-05-30 11:30:55 +08:00
    @petelin 下游成百上千个机器,每个机器拥有的权限可能不相同,而且会经常变化。按照 topic 区分的话,担心 topic 过多会影响性能。而且同样的信息发给多个 topic (按权限区分)效率也不高。
    yxjn
        11
    yxjn  
    OP
       2019-05-30 11:32:03 +08:00
    @j2gg0s @axbx rabbitmq 用的不多,我再看下。能再详细说下么。
    yxjn
        12
    yxjn  
    OP
       2019-05-30 11:34:25 +08:00
    @ysweics 这样可能也有同样的问题,下游是多个服务,我怎么精确的把权限通知到下游。
    yxjn
        13
    yxjn  
    OP
       2019-05-30 11:37:01 +08:00
    @mooncakejs rocketmq 似乎可行,不知道 tag 很多的时候会不会有性能影响,我再看下。
    petelin
        14
    petelin  
       2019-05-30 11:40:28 +08:00
    @yxjn 不太懂为什么同样的消息要按照不同的权限区分.我的理解同一中消息就应该放在同一个 topic 里, 然后客户端权限验证可以走别的,比如接口鉴权, 发现自己没有读对应消息权限之后, 就不要在消费了. 发现有了新权限, 就开始消费.
    yxjn
        15
    yxjn  
    OP
       2019-05-30 11:44:51 +08:00
    @petelin 需求决定的,:-D 下游只需要拥有权限的信息。
    luozic
        16
    luozic  
       2019-05-30 11:54:31 +08:00
    @lecher pulsar 出錢的基本的定制需求還是有的;又免費,又要求一堆增值功能的,呵呵呵呵。
    lihongjie0209
        17
    lihongjie0209  
       2019-05-30 11:56:51 +08:00
    你解决了全量初始话的问题的话记得去 redis 提交一个 pr, redis 主从就是这么干的.
    ysweics
        18
    ysweics  
       2019-05-30 11:58:17 +08:00
    @yxjn 那你的问题就是怕消息发送出去以后,下游的服务的应用没有收到信息,或者消费失败,那个可以通过分布式消息一致性的方案来解决,这个就能监控到具体的消费流程了
    yxjn
        19
    yxjn  
    OP
       2019-05-30 12:07:36 +08:00
    @ysweics 不是这个问题,是如何分好权限,并通过 mq 精准的推到不同的服务上。
    ysweics
        20
    ysweics  
       2019-05-30 12:17:16 +08:00
    @yxjn 那就是根据上面 V 友提供的方案,可以用模式匹配,你设计的思路只是把消息推送过去,然后下游消费,上游不用管。(我在开始回答的里面想的是我自己想的第二个方案,开始发送的时候,不用管模式匹配的问题,直接一个更新的命令发给所有的服务,然后服务统一到一个权限接口里面去请求,然后逻辑处理 ,相当于你的更新是推的逻辑,我这边想的拉的逻辑)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:32 · PVG 04:32 · LAX 12:32 · JFK 15:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.