有没有这样一款队列 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiboshi
V2EX    问与答

有没有这样一款队列

  •  
  •   hiboshi 2017-07-11 16:03:26 +08:00 3119 次点击
    这是一个创建于 3043 天前的主题,其中的信息可能已经有所发展或是发生改变。

    子节点服务器上面写入,然后推送到 master 节点统一处理。

    比如有 100 台服务器 ,写入消息,然后这 100 台服务器推送到 master 节点。然后 由 master 消费

    18 条回复    2017-07-12 09:56:08 +08:00
    Kilerd
        1
    Kilerd  
       2017-07-11 16:05:22 +08:00
    redis.

    slave 写,master 读.

    done, next one, please.
    hiboshi
        2
    hiboshi  
    OP
       2017-07-11 16:22:07 +08:00
    @Kilerd redis 中 slave 写入的数据能同步到 master ?
    fwee
        3
    fwee  
       2017-07-11 16:22:51 +08:00
    etcd
    Kilerd
        4
    Kilerd  
       2017-07-11 16:23:05 +08:00
    @hiboshi 用同一个 redis 就好啦。
    hiboshi
        5
    hiboshi  
    OP
       2017-07-11 16:27:52 +08:00
    @Kilerd 因为服务器在全球各地,国际带宽的各种阻塞,这延时 出错率太高,还是放本地妥当。
    hiboshi
        6
    hiboshi  
    OP
       2017-07-11 17:44:23 +08:00
    up
    whywhy36
        7
    whywhy36   2017-07-11 19:00:03 +08:00
    你的需求感觉用一个单独的 queue 就可以了

    假如你可以容忍数据丢失,Redis 就可以了。假如不能容忍,可以考虑 RabbitMQ 或者 etcd,不过取决于你消息的大小。两者感觉都是对于相对较小的消息比较友好。

    或者直接上 amazon 的 SQS
    hiboshi
        8
    hiboshi  
    OP
       2017-07-11 19:44:25 +08:00
    @whywhy36 本来是一台 消息队列就可以,但是目前来看,这 100 台服务器 存在 全球 ,肯定会有国际带宽波动影响,阻塞的。
    Lax
        9
    Lax  
       2017-07-11 20:34:25 +08:00
    感觉你这个 master - slave 的叫法弄反了,远端做写入端,它们就是 master,相对的被同步到的端是 slave。
    这种多 master-单 slave 的方案,redis 本身不支持,可以写一个脚本全读回来写到中心的队列里。
    因为 redis 队列读出来之后就删掉了,自己写脚本的确认到达代码复杂。
    RMQ / Kafka 都有确认到达的同步工具,比较成熟,不过运维复杂性高于 redis。
    vingz
        10
    vingz  
       2017-07-11 20:47:39 +08:00 via Android
    这是 producer 和 consumer 模型,任何一款消息队列都可以满足需求,可以去看看 kafka
    hiboshi
        11
    hiboshi  
    OP
       2017-07-11 21:36:31 +08:00
    @Lax 有想过用这种 多主到单个 slave 但是没有实践过不知道能不能行,另外还想过,在主服务器端去 主动拉取也想过,但是目前更倾向于 消息队列本身能够解决。
    hiboshi
        12
    hiboshi  
    OP
       2017-07-11 23:19:08 +08:00
    @vingc723 是消费者和生产者关系,但是问题不在这里,而在于 ,如何把存在很多地方的消费者和生产者的队列( 100 台服务器中),同步到一个地方。
    Lax
        13
    Lax  
       2017-07-11 23:48:50 +08:00   1
    @hiboshi
    redis 另一个比较坑的是同步机制,如果中断时间长会触发全量复制,如果网络本来就差这无疑是雪上加霜。因此没有脱离这个机制作同步都不太靠谱。
    kafka 同步是依赖记录的 offset,中断后还能从断点继续。不太方便的是要把记录 offset 的 zookeeper 暴露出来,你提到这种场景好像问题不大。
    有个 Kafka MirrorMaker 你可以调研一下。https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27846330
    msg7086
        14
    msg7086  
       2017-07-12 04:17:52 +08:00   1
    自己写一个不行吗……

    for redis100 in 100 redis servers:
    .. len = redis100->llen()
    .. data = redis100->lrange(0,len-1)
    .. redislocal->rpush(data)
    .. redis100->ltrim(len, -1)

    还有一种比较难看的 workaround,就是用 MySQL 的 Multi-master replication,中心节点开 100 个 slave 从世界各地读数据。队列表不要用 auto_increment 的主键,避免多主写入数据时产生唯一性冲突。世界各地的程序用不冲突的 uuid 来做主键。不太好看,但是很可靠。master 上的历史数据可以通过 SET sql_log_bin = 0; DELETE WHERE UUID = x; 做本地删除。
    hljjhb
        15
    hljjhb  
       2017-07-12 08:39:09 +08:00 via Android   1
    kafka

    uber 有开源针对这种情况的 mirrormaker 改进

    https://github.com/uber/uReplicator
    hiboshi
        16
    hiboshi  
    OP
       2017-07-12 09:54:31 +08:00
    @msg7086 第一个考虑过,但是觉得麻烦,想通过架构解决,而且还要开启 ssl 又要弄 stunnel ;实在不行只能这样搞了。
    hiboshi
        17
    hiboshi  
    OP
       2017-07-12 09:55:03 +08:00
    @hljjhb 我看下 不过 kafka 可能有点大了。
    hiboshi
        18
    hiboshi  
    OP
       2017-07-12 09:56:08 +08:00
    @Lax 好的 我看看
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3317 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 00:06 PVG 08:06 LAX 16:06 JFK 19:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86