`
vanadiumlin
  • 浏览: 504753 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Kestrel持久化队列服务器

 
阅读更多

http://www.5ishare.com/tech/program/283112.shtml

net.rubyeye.xmemcached.test.unittest.KestrelClientUnitTest

 

http://code.google.com/p/xmemcached/wiki/User_Guide_zh

教程   使用xmemcached 进行连接

http://code.google.com/p/xmemcached/issues/list?can=1&q=&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles

 

A persistent queue service used by Twitter.

由于工作上的需要,需要找一个高性能的持久化队列服务器,先是发现了Starling,后来就找到了这个Starling的继承者Kertrel,这两个都是Twitter开发的用来分布执行一些异步任务的队列服务,功能和Geraman和JMS差不多,而我感兴趣的是它的队列存储功能。Kestrel一个很大的好处是使用了memcache的协议,而几乎所有语言都有memcache的接口,每个Key对应一个队列,通过set入队列,get出队列,使用上还是非常方便的。在Github上Kestrel的项目介绍里说到,Kestrel是用Scala语言开发的,在JVM上运行,程序代码算上注释不到1500行,应该也是个学习Scala的好资料。性能方面,官方的测试结果,在一个2.5GHz 2008-model macbook pro上可以达到3.23MB/sec (over loopback) and about 4400 puts/sec,还觉得不够用的话还可以distribute一下。

在Github上提供了源代码,用的时候还是需要自己来编译一下的,在此把Build好的打包放在这儿了,包含了所有依赖的包,用的时候直接java -jar kestrel.jar就行了。

在config/里面还有两个配置文件,配置项的含义在Github上的项目主页上有介绍,一帮情况下默认的配置就完全可用了,大规模应用的话,有些配置项还是要调整一下的。

 

安装jdk 环境

下载http://gitub.com/robey/kestrel

在目录下安装,自动安装到本目录

运行$ ./dist/kestrel-VERSION/scripts/devel.sh

使用了 xmemcached 1.3.6  进行连接 成功

XMemcachedClient client = new XMemcachedClient("192.168.37.128", 22133);

(记得关闭防火墙)

每秒插入6000~7000  条数据相当稳定

 

发现starling 已经几年不更新了。选用Kertrel成为必然的选择

一个信息审核的功能,保存未审核信息的队列。
这个服务在Twitter里是用来处理异步的任务的,一头儿把任务塞进队列,另一头儿有一群Worker从队列里取任务执行。

 

   Kestrel是一个scala写的twitter开源的消息中间件,特点是高性能、小巧(2K行代码)、持久存储(记录日志到journal)并且可靠(支持可靠获取)。Kestrel的前身是Ruby写的Starling项目,后来twitter的开发人员尝试用scala重新实现。它的代码非常简洁并且优雅,推荐一读。

Kestrel采用的协议是memcached的文本协议,但是并不完全支持所有memcached协议,也不是完全兼容现有协议。标准的协议它仅支持GET、SET、FLUSH_ALL、STATS,扩展的协议有:

Java代码
  1. SHUTDOWN       关闭kestrel server      
  2. RELOAD         动态重新加载配置文件  
  3. DUMP_CONFIG    dump配置文件  
  4. FLUSH queueName   flush某个队列  

 

    每个key对应都是一个队列。标准memcached文本协议的支持上也没有完全兼容,SET不支持flag,因此现有大多数基于flag做序列化的 memcached client都无法存储任意java类型到kestrel;FLUSH_ALL返回"Flushed all queues.\r\n"而不是"OK\r\n"。

GET协议支持阻塞获取和可靠获取,都是在key上作文章,例如你要获取queue1的消息,并且在没有消息的时候等待一秒钟,如果有消息马上返回,超时时间后还没有就返回空,kestrel允许你通过发送

Java代码
  1. "GET queue1/t=1000\r\n"  


来阻塞获取。本来的key应该queue1,这里变成了"queue1/t=1000",因此如果你使用的client有对返回的key和发送的key做校验,那么可能就认为kestrel返回错误。
什么是可靠获取呢?默认的GET是从队列中获取消息后,server端就将该消息从队列中移除,客户端需要自己保证不把这个消息丢失掉,也就是说这里是类 似JMS规范中的自动应答(auto-acknowledge),如果客户端在处理这个消息的时候异常崩溃或者在接收消息数据的时候连接断开,那么可能导 致这个消息永久丢失。Kestrel的可靠获取就是类似JMS规范中的CLIENT_ACK mode,客户端获取消息后,server将这个消息从队列移除并正常发送给客户端,如果这时候客户端崩溃或者连接断开,那么server将不会确认该消 息被消费并且"un-get"这个消息,重新放到队列头部,那么当client重新连接上来的时候还可以获取这个消息;只有当server收到客户端的明 确确认消息成功的时候,才将消息移除。这个功能也是通过key做手脚,

Java代码
  1. "GET queue1/open\r\n"   开始一次可靠获取  
  2. "GET queue1/close\r\n"  确认消费成功  


你要关闭前一次可靠获取开启新的一次,还可以这样调用

Java代码
  1. "GET queue1/close/open\r\n"  

 
要注意的是每个连接的client只能有一个正在执行的可靠获取,关闭一个没有开启的reliable fetch或者在执行一次reliable fetch再次open一个新的获取都将直接返回空。

从kestrel的协议方面,我们可以学习到的一点就是在做一份协议的时候,如果有多种不同语言的client的话,应该尽量用通用协议,通用协议通常都已经有很多成熟的client可以使用,避免了为私有协议开发不同语言的client;并且我们可以在通用协议上作扩展,例如kestrel在key上面做的花样,通过给key附加不同的属性即可实现一些特殊功能。

XMemcachedClient默认是无法支持kestrel对memcached的协议的扩展,也就是说无法支持阻塞获取、可靠获取和flush_all,这是因为xmemcached会对返回的key和发送的key做校验,如果不相等就认为解码错误;并且由于kestrel不支持flag,因此无法存储java序列化类型;另外一个问题是,xmemcached(spymemcached)都会将连续的GET协议合并成一个bulk get协议,而kestrel也并不支持bulk get,所以需要关闭这个优化,这个可以通过下列代码关闭:

Java代码
  1. memcachedClient.setOptimizeGet(false);  

Spymemcached似乎不提供这个选项。为了解决序列化问题,我添加了一个新的KestrelCommandFactory,使用这个 CommandFactory后,将默认关闭get优化,并且不对GET返回的key做校验从而支持阻塞获取和可靠获取,并且将在存储的数据之前加上4个 字节的flag(整型),因此可以支持存储任意可序列化类型。但是有一些应用只需要存储字符串类型和原生类型,这是为了在不同语言的client 之间保持可移植(如存储json数据),那么就不希望在数据之前加上这个flag,关闭这个功能可以通过

Java代码
  1. memcachedClient.setPrimitiveAsString(true);  


方法来设置,所有的原生类型都将调用toString转成字符串来存储,字符串前不再自动附加flag。使用KestrelCommandFactory后,也将可以正常调用flushAll方法。

KestrelCommandFactory已经提交到svn trunk,预计在xmemcached 1.2.0-RC2的时候发布。

使用KestrelCommandFactory对kestrel做的性能测试,server和client都跑在linux上,jdk6,单线程单client连续push消息

消息个数       消息长度       是否启用journal   时间       TPS(/s)
500000          256              否              123.0s     4065
500000          1024            否              126.3s     3959
500000          4096            否              120.6s     4145
500000          4096            是              122.1s     4095
500000          8192            是              121.2s     4125

从数据上来看比官方数据好很多,可能机器配置不同。是否启用journal带来的影响似乎很小,写文件都是append,还是比较高效的。

kestrel的项目主页  http://github.com/robey/kestrel
kestrel的wiki页    http://wiki.github.com/robey/kestrel
xmemcached项目主页  http://code.google.com/p/xmemcached/

分享到:
评论

相关推荐

    征服 Kestrel + XMemcached + Spring TaskExecutor

    它的核心特性包括持久化、多客户端支持以及基于TCP协议的高效通信。在实际应用中,开发者可以将Kestrel作为任务队列,处理异步任务和批量操作,以减轻应用程序的负担并提高响应速度。 XMemcached是Java社区中一个...

    征服 Kestrel + XMemcached

    例如,在电商网站中,用户添加商品到购物车的操作可以先通过Kestrel进行排队,然后后台服务再将这些信息持久化到数据库,同时利用XMemcached缓存用户购物车状态,提供快速响应。 **学习资源与实践** 要深入了解...

    message_system_test_report.rar_ActiveMQ java_activemq_httpsqs_me

    Kestrel使用内存存储,因此具有较高的性能,但数据持久化可能不如其他队列强大。部署Kestrel时,需要安装其依赖库并配置服务器端口和数据存储路径。性能测试时,主要考察其处理速度、内存占用和故障恢复能力。 ...

    WEB部署相关工具文件.zip

    - 它还支持发布/订阅模式,实现消息队列功能,并且可以将数据持久化到硬盘,保证数据安全性。 2. Nginx: - Nginx是一款高性能的HTTP和反向代理服务器,常用于Web服务器和负载均衡器。 - 其特点是异步非阻塞I/O...

    ASP.NET Core2.2+Vue.js+mysql+redis开发的网站框架

    总的来说,这个网站框架结合了ASP.NET Core 2.2的强大后端能力、Vue.js的高效前端渲染、MySQL的数据持久化和Redis的高速缓存,为开发者提供了一个全面且高效的开发环境。无论是初学者还是经验丰富的开发者,都可以在...

    分布式开发基础教程1

    10. **持久化存储**:分布式系统通常涉及多个节点间的协作,因此需要可靠的数据库系统,如SQL Server、MongoDB或Cassandra,来保证数据的一致性和完整性。 11. **错误处理与重试策略**:在分布式环境中,必须处理...

    2021 AspNet Core,Redis,SQLServer各种面试题汇总!

    - Redis提供了持久化选项,如RDB快照和AOF日志,以防止数据丢失。 - Redis还支持主从复制、集群部署和事务处理,可以应对大规模并发访问的需求。 3. **SQL Server**: - SQL Server是由微软开发的关系型数据库...

    MicroServiceCourse

    6. **数据持久化**:每个微服务通常都有自己的数据库,理解如何设计数据模型,使用Entity Framework Core进行ORM操作,以及数据库分片和复制策略也是重要的。 7. **消息队列与事件驱动**:消息队列如RabbitMQ或...

    AspnetMicroservices:Aspnet微服务

    它提供了服务生命周期管理、负载均衡、故障恢复和数据持久化的功能,简化了ASP.NET微服务的部署和管理。 **5. API Gateway** API Gateway是微服务架构中的重要组件,作为外部系统与内部微服务之间的统一入口。它...

Global site tag (gtag.js) - Google Analytics