V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
tabsu
V2EX  ›  Go 编程语言

微博的消息队列

  •  
  •   tabsu · 2016-03-18 20:20:13 +08:00 · 2461 次点击
    这是一个创建于 3174 天前的主题,其中的信息可能已经有所发展或是发生改变。

    离开微博已久,总想着弄点东西出来纪念一下当年的峥嵘岁月:)。在微博,你不能不知道鸟哥 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-03-24 11:01:47 +08:00

    特意做了一下简单的测试,测试结果如下: 针对消息的丢失率,做了一下单个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-03-18 20:23:30 +08:00
    kafka 路过。
    tabsu
        2
    tabsu  
    OP
       2016-03-18 21:05:01 +08:00
    @est 公司小,用不起 kafka 这么个集群
    hbkdsm
        3
    hbkdsm  
       2016-03-18 21:26:05 +08:00
    最近在了解 message queue 这项技术,请问微博内部的消息队列用的是哪种实现?
    还有 memcached 协议与 AMQP 协议有哪些区别呢?
    tabsu
        4
    tabsu  
    OP
       2016-03-18 21:41:15 +08:00   ❤️ 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-03-18 22:20:29 +08:00
    没给出 benchmark ,没给吞吐量,没说怎么保证可靠性和可靠性有多少,会不会丢数据
    这东西在这样的介绍下真会有人用么
    楼主快把文档完善一下
    tabsu
        6
    tabsu  
    OP
       2016-03-18 22:55:11 +08:00
    @slixurd 谢谢,是的, todo 里面就有,周末就加上
    hbkdsm
        7
    hbkdsm  
       2016-03-18 23:17:36 +08:00
    @tabsu 感谢回复!
    wjfz
        8
    wjfz  
       2016-03-19 00:16:28 +08:00
    感谢分享。
    starry16
        9
    starry16  
       2016-03-19 22:16:14 +08:00
    赞,不错
    pubby
        10
    pubby  
       2016-03-19 23:22:37 +08:00
    以前用 RabbitMQ ,现在用 beanstalk
    sbpcx
        11
    sbpcx  
       2016-03-20 02:14:44 +08:00
    @tabsu 已经不是说微博的队列是基于 redis 的 list 吗?。
    tabsu
        12
    tabsu  
    OP
       2016-03-20 09:57:10 +08:00 via iPhone
    @sbpcx 在微博,有基于 redis 改造的组件,应用于点赞数,转发数等, mq 是自研的用于如博文消息体的中间存储
    tabsu
        13
    tabsu  
    OP
       2016-03-20 10:00:12 +08:00 via iPhone
    @pubby 现有 queue 比较多,场景不一样,选取也不同。以前总好奇消息队列是怎么实现,打算自己动手弄一个,明白下原理,后面也打算对比下各种 queue 之间的性能对比图
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:48 · PVG 22:48 · LAX 06:48 · JFK 09:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.