微博的消息队列 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
tabsu

微博的消息队列

  •  
  •   tabsu 2016 年 3 月 18 日 3070 次点击
    这是一个创建于 3690 天前的主题,其中的信息可能已经有所发展或是发生改变。

    离开微博已久,总想着弄点东西出来纪念一下当年的峥嵘岁月:)。在微博,你不能不知道鸟哥 Laruence ,也不能不知道 mq 。 mq 是一个基于 memcached 协议,用 c/c++编写的消息队列中间件,有着高性能、解耦、异步化等特点。现在用 Go 重新实现了一遍,将早前自己用 mq 的过程中觉得有些特性可以加上的,都一一加上了,由于其依赖的东西极少,只是简单用了一个轻巧型的嵌入式数据库 BerkeleyDB ,就可以实现一个 simple 的队列服务 tcp server ,见https://github.com/YoungPioneers/mgq,特性如下:

    • 一写多读:举个例子, set myqueue message ,只要 get 的时候, myqueue 开头,#分隔,如 myqueue#1 ,多个客户端之间读是彼此独立的,是不受影响的 默认的 get 是读取队列中未读取的最旧消息
    • 支持 getc 操作,支持获取队列中某一个 cursor 位置的数据:举个例子,假设 myqueue 已经有 1000 条数据, getc myqueue 99,就可以获取队列当中 cursor 为 99 的消息 *支持 getr 操作,支持获取队列中某一个 start cursor 位置开始,到 end 的数据:举个例子,假设 myqueue 已经有 20 条数据, getr myqueue 1 10 ,就可以获取队列当中 cursor 为[1-10]的消息
    • getn 支持 timeout 机制的阻塞 api 来获取队列中的最新消息,举个例子: getn queue 10,意味着 10s 内有数据则立马返回,否则会 10s 后立马返回数据不存在的错误,默认 getn 的 timeout 是 0s ,永不超时(需要注意的是如果客户端有 getn 的操作,则 set 的另一个客户端需要调用 setn )
    第 1 条附言    2016 年 3 月 24 日

    特意做了一下简单的测试,测试结果如下: 针对消息的丢失率,做了一下单个set和get的测试,下面的是消息数为30w,50w,100w时候的结果:平均可以达到每秒2300+的set,5700+的get操作,消息丢失率为0.

    message total:30w

    mgq message set total:300000, cost total time:123518222205 ns, 2428 per/s ,fail set total:0 mgq message get total:300000, cost total time:51103619703 ns, 5870 per/s ,fail get total:0 

    message total:50w

    mgq message set total:500000, cost total time:210480212729 ns, 2375 per/s ,fail set total:0 mgq message get total:500000, cost total time:87694742059 ns, 5701 per/s ,fail get total:0 

    message total:100w

    mgq message set total:1000000, cost total time:422339921379 ns, 2367 per/s ,fail set total:0 mgq message get total:1000000, cost total time:173768683759 ns, 5754 per/s ,fail get total:0 

    同时简单做了一下压测,下面的结果依次是1,2,3,4个routine,单个set和get的相对平均耗时时间,more detail Benchmark code

    Benchmark_MgqMultiSetAndGet-4 2000 546617 ns/op (1829 per/s) Benchmark_MgqMultiSetAndGet-4 2000 583259 ns/op (1714 per/s) Benchmark_MgqMultiSetAndGet-4 2000 723603 ns/op (1381 per/s) Benchmark_MgqMultiSetAndGet-4 2000 754741 ns/op (1324 per/s) 
    13 条回复    2016-03-20 10:00:12 +08:00
    est
        1
    est  
       2016 年 3 月 18 日
    kafka 路过。
    tabsu
        2
    tabsu  
    OP
       2016 年 3 月 18 日
    @est 公司小,用不起 kafka 这么个集群
    hbkdsm
        3
    hbkdsm  
       2016 年 3 月 18 日
    最近在了解 message queue 这项技术,请问微博内部的消息队列用的是哪种实现?
    还有 memcached 协议与 AMQP 协议有哪些区别呢?
    tabsu
        4
    tabsu  
    OP
       2016 年 3 月 18 日   1
    @hbkdsm 微博的消息队列是基于一个嵌入式 nosql BerkeleyDB 来实现的,见 http://www.oracle.com/technetwork/cn/database/database-technologies/berkeleydb/overview/index.html ,另外基于 memcached 的优势在于: 1 )协议简单 2 )目前支持多种语言的 client 端,比较方便使用,不需要自己写一个长连接的 client
    slixurd
        5
    slixurd  
       2016 年 3 月 18 日
    没给出 benchmark ,没给吞吐量,没说怎么保证可靠性和可靠性有多少,会不会丢数据
    这东西在这样的介绍下真会有人用么
    楼主快把文档完善一下
    tabsu
        6
    tabsu  
    OP
       2016 年 3 月 18 日
    @slixurd 谢谢,是的, todo 里面就有,周末就加上
    hbkdsm
        7
    hbkdsm  
       2016 年 3 月 18 日
    @tabsu 感谢回复!
    wjfz
        8
    wjfz  
       2016 年 3 月 19 日
    感谢分享。
    starry16
        9
    starry16  
       2016 年 3 月 19 日
    赞,不错
    pubby
        10
    pubby  
       2016 年 3 月 19 日
    以前用 RabbitMQ ,现在用 beanstalk
    sbpcx
        11
    sbpcx  
       2016 年 3 月 20 日
    @tabsu 已经不是说微博的队列是基于 redis 的 list 吗?。
    tabsu
        12
    tabsu  
    OP
       2016 年 3 月 20 日 via iPhone
    @sbpcx 在微博,有基于 redis 改造的组件,应用于点赞数,转发数等, mq 是自研的用于如博文消息体的中间存储
    tabsu
        13
    tabsu  
    OP
       2016 年 3 月 20 日 via iPhone
    @pubby 现有 queue 比较多,场景不一样,选取也不同。以前总好奇消息队列是怎么实现,打算自己动手弄一个,明白下原理,后面也打算对比下各种 queue 之间的性能对比图
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2463 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 01:16 PVG 09:16 LAX 18:16 JFK 21:16
    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