starling试用手记
twitter最近将ruby实现的消息队列服务器starling开源了,这是一个支持memcache协议的轻量级持久化服务器,因此使用php/perl/ruby/java等多种客户端都没问题,可以将较慢的处理逻辑通过消息队列放在后台处理,同时也支持多点分布式处理。周末找了个闲置的centos 5机器搭了一套starling试用,配合php的memcache扩展测试一番,有点意思。
starling安装步骤
centos默认不带ruby,得重新装,以下安装步骤都是以root身份跑的。
yum install ruby ruby-devel rubygems
gem install memcache-client starling
如果你使用yum找不到ruby的相关包,请记得添加epel repository。安装之后新增的程序:
- /usr/bin/starling #一个ruby脚本,starling的服务程序
- /usr/bin/starling_top #starling的状态检查程序,可以查看starling的运行状态,类似memcache的状态显示,不同的是能够显示每个key的状态
starling启动后默认会在22122端口蹲点守候。
为了使用方便,我修改了一个starling在centos下的启动脚本,放在/etc/init.d/starling,下载地址:http://customcode.googlecode.com/files/starling。使用方法:
/etc/init.d/starling start|stop|restart
测试程序
以下是在测试中用的php脚本,说实话php在循环比较大的时候没啥优势,但是关键是简单,几行就搞定了。
写入的测试程序
-
#!/usr/bin/php
-
<?php
-
$m = new Memcache;
-
$m->addServer('127.0.0.1', '22122');
-
-
$start = microtime(true);
-
-
for($i = 0; $i <10000; ++$i) {
-
//echo $i, "\n";
-
$m->set('testtesttesttest', '中文测试中文测试中文测试中文测试中文测试中文测试中中文测试中中文中a');
-
}
-
echo "time:" . (microtime(true) - $start), "\n";
读出来的测试程序
-
#!/usr/bin/php
-
<?php
-
$m = new Memcache;
-
$m->addServer('127.0.0.1', '22122');
-
-
while(1) {
-
echo $m->get('test'), "\n";
-
usleep(100); // 休息一下,否则容易cpu 100%
-
}
性能测试
测试条件:
- key的长度16B
- value的长度100B,
- 8个并发写入进程
- 每个进程插入10,000条记录
平均每个进程花了7秒完成写入操作,那么照这样计算:
10000 * 8 / 7 = 每秒写入11428次
以上测试进行的比较随意,而且我懒得插入大量数据来测试了,这个比较花时间,所以测试结果仅供参考。由于starling是目前twitter在生产环境中运行的,经过实践检验过,稳定性应该不成问题。
作者: Volcano 发表于March 21, 2009 at 6:48 pm
willko 于 2009-03-21 @ 19:15:55 留言 :
汗,现在轻量级持久存储有点春后竹笋啊
Volcano 于 2009-03-21 @ 21:03:40 留言 :
应用场景不同
rates 于 2009-03-22 @ 11:28:17 留言 :
有没有办法看twitter的api wiki?
Volcano 于 2009-03-22 @ 12:01:08 留言 :
一直无法访问twitter的api wiki
Roast 于 2009-03-23 @ 09:33:11 留言 :
说到消息队列,相同的开源产品也有一些,都是支持memcache的协议的。
memcacheq是持久化的队列系统:
http://code.google.com/p/memcacheq
memqd是一个内存化的队列系统:
http://code.google.com/p/memqd
Volcano 于 2009-03-23 @ 09:48:27 留言 :
说到memcacheq,之前也试着在某个场景中用到过,但是运行一段时间后有的队列老是读不出来,也没有查到原因以及解决办法,所以我转移了目标
skyblue 于 2009-04-26 @ 17:13:03 留言 :
echo $m->get(‘test’), “\n”;
key怎么不同了