离开微博已久,总想着弄点东西出来纪念一下当年的峥嵘岁月:)。在微博,你不能不知道鸟哥 Laruence ,也不能不知道 mq 。 mq 是一个基于 memcached 协议,用 c/c++编写的消息队列中间件,有着高性能、解耦、异步化等特点。现在用 Go 重新实现了一遍,将早前自己用 mq 的过程中觉得有些特性可以加上的,都一一加上了,由于其依赖的东西极少,只是简单用了一个轻巧型的嵌入式数据库 BerkeleyDB ,就可以实现一个 simple 的队列服务 tcp server ,见https://github.com/YoungPioneers/mgq,特性如下:
特意做了一下简单的测试,测试结果如下: 针对消息的丢失率,做了一下单个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)
1
est 2016-03-18 20:23:30 +08:00
kafka 路过。
|
3
hbkdsm 2016-03-18 21:26:05 +08:00
最近在了解 message queue 这项技术,请问微博内部的消息队列用的是哪种实现?
还有 memcached 协议与 AMQP 协议有哪些区别呢? |
4
tabsu OP @hbkdsm 微博的消息队列是基于一个嵌入式 nosql BerkeleyDB 来实现的,见 http://www.oracle.com/technetwork/cn/database/database-technologies/berkeleydb/overview/index.html ,另外基于 memcached 的优势在于: 1 )协议简单 2 )目前支持多种语言的 client 端,比较方便使用,不需要自己写一个长连接的 client
|
5
slixurd 2016-03-18 22:20:29 +08:00
没给出 benchmark ,没给吞吐量,没说怎么保证可靠性和可靠性有多少,会不会丢数据
这东西在这样的介绍下真会有人用么 楼主快把文档完善一下 |
8
wjfz 2016-03-19 00:16:28 +08:00
感谢分享。
|
9
starry16 2016-03-19 22:16:14 +08:00
赞,不错
|
10
pubby 2016-03-19 23:22:37 +08:00
以前用 RabbitMQ ,现在用 beanstalk
|