在学习storm的过程中,storm的官方文档中多次在实例中列举kestrel消息队列的例子。处于好奇和兴趣顺便了解了一下kestrel消息队列。
Kestrel是twitter的开发团队用scala语言写的开源消息中间件。 官方网址:http://twitter.github.io/kestrel/
其具备了以下特点:
Kestrel运行在JVM上,用户可以视为java的项目来使用高级的优化手段。
Kestrel大约2500行scala代码
关闭可以保证不丢失数据。
项还可以被其他客户端获取,就是说客户端崩溃不会导致数据项的丢失。
除此之外kestrel还具备了很多让人眼前一亮的特性:
支持多请求协议:目前支持三种协议,
memcache协议(并没有完整的实现memcache协议,只支持部分操作协议),协议的说明 https://github.com/memcached/memcached/blob/master/doc/protocol.txt
text协议,
thrift协议
FanoutQueues(队列分发):根据队列的命名规则完成数据项的自动复制分发,可以发送端只发送一次,多个接受端可以相互之间不受影响的独立接收数据。
kestrel集群类似于memcache集群,集群中的服务器互相并不知道对方的存在。请求的分发主要由客户端来完成,kestrel本身也可以通过设置来结合zookeeper来管理其集群资源。
kestrel具备很多可调节的配置项,比如可以选择是否持久化或者数据项过期时长,结合jvm本身的配置,可提供给使用者更多的优化空间。
有关kestrel的性能:
kestrel安装包中自带了测试kestrel性能的脚本在安装路径下 /scripts/load/下
我个人测试结果如下:
测试机 内存32G cpu:Intel(R) Xeon(R) CPU E5645 @ 2.40GHz * 24
数据大小1kb每条 | |||||
并发插入线程数 | 连接数 | 插入数据 | 总数据量 | 时长 | 单位时间处理数 |
1 | 1 | 10000 | 10000 | 3s | 3333/s |
10 | 1 | 3000 | 30000 | 3s | 10000/s |
20 | 1 | 10000 | 200000 | 14s | 14286/s |
10 | 10 | 10000 | 100000 | 6s | 16667/s |
20 | 10 | 10000 | 200000 | 10s | 20000/s |
40 | 10 | 10000 | 400000 | 20s | 20000/s |
40 | 40 | 10000 | 400000 | 20s | 20000/s |
40 | 1 | 10000 | 400000 | 20s | 20000/s |
20 | 1 | 10000 | 200000 | 10s | 20000/s |
20 | 20 | 10000 | 200000 | 10s | 20000/s |
80 | 1 | 10000 | 800000 | 80s | 10000/s |
80 | 1 | 10000 | 800000 | 40s | 20000/s |
80 | 20 | 10000 | 800000 | 39s | 20000/s |
Xmx=1GB红色背景为修改了Kestrel服务器配置Xmx=4GB测试结果。
Kestrel的结果来看。单线程处理大概3MB/s。而在多线程的测试情况下达到2wQPS约20MB/s。基本上和官方的测试结果相同。
Kestrel还在逐渐的熟悉没有进行过多的服务器调优。所以只能形成暂时的结论。
kestrel的安装运行:
下载kestrel的安装包 下载地址 http://twitter.github.io/kestrel/ 官网上选择kestrel的安装包
解压之后路径假设 KESTREL_HOME
运行 KESTREL_HOME/scripts/devel.sh 可以按照开发的模式启动kestrel。
devel.sh内容其实很少如下:
1. #!/bin/bash
2. echo "Starting kestrel in development mode..."
3.
4. # find jar no matter what the root dir name
5. SCRIPT_DIR=$(cd `dirname "$0"`; pwd)
6. ROOT_DIR=`dirname "$SCRIPT_DIR"`
7.
8. java -server -Xmx1024m -Dstage=development -jar "$ROOT_DIR"/kestrel_2.9.2-2.4.1.jar
其中-Dstage=development 相当与将应用 KESTREL_HOME/config/development.scala 文件作为kestrel的配置文件。
因此修改-Dstage参数可以应用其他的配置。比如 -Dstage=production 就是应用 KESTREL_HOME/config/production.scala 配置文件
另外在实际生产环境中可以使用kestrel.sh脚本来管理kestrel进程。
kestrel.sh 参数有 start stop 等