`
tailorcai
  • 浏览: 93592 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Twitter用的Kestrel队列的应用实践

    博客分类:
  • JAVA
阅读更多
新的公司准备上消息队列,用于统一用户发布信息后续处理流程。考虑到网站的流量已经比较大了,选择一个消息队列产品成为当务之急。

运行环境:LAMP,PHP服务器6台。
要求:速度快;简单易用;运行稳定(数据一般不丢失);支持子队列

稳定性,应该包含下面一些情况:
1. 如果队列服务出错,能够有failover的队列保证业务正常运行
2. 已经在队列中的数据,能够在队列恢复时,得到处理
3. 如果处理脚本出现错误,当前正在处理的数据不会丢失。

之前用过redis/resque,感觉很不错。可惜不满足数据丢失,和取数据的事务。

本来就不想用很复杂的商用产品,又看了一些文章后
http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes
准备用Kestrel。


部署方案

在两台机器上部署kestrel,前端用负载均衡设备作load balance和fail over。在PHP逻辑中也进行错误处理,写入失败则自动重试。

出现的问题:
流量低的时候一切正常,流量高后,kestrel队列响应非常慢,直到kestrel出现异常退出。

分析:
看java的错误日志,以及在网上搜,发现时最新的JDK的bug。
http://forums.sun.com/thread.jspa?threadID=5424728
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb04a3705, pid=3301, tid=2948414352
#
# JRE version: 6.0_18-b07
# Java VM: Java HotSpot(TM) Server VM (16.0-b13 mixed mode linux-x86 )
# Problematic frame:
# C  0xb04a3705
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x0894f800):  GCTaskThread [stack: 0xafb53000,0xafbd4000] [id=33
08]

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000
0

Registers:
EAX=0xb04a2618, EBX=0xdf07ae68, ECX=0xb04a2608, EDX=0x00000000
ESP=0xafbd31f8, EBP=0xafbd3278, ESI=0xafbd32c8, EDI=0x00000000
EIP=0xb04a3705, CR2=0x00000000, EFLAGS=0x00010212

Top of Stack: (sp=0xafbd31f8)

换成推荐的版本后,退出的问题解决了,但是速度还是很慢。

经过反复研究后,以及编写了测试脚本进行大量连接的测试后,发现kestrel(也许是scala/mina),对大量短连接的响应速度很慢。

这下把我给急坏了。本来就是因为twitter的人说kestrel比较适合web下,大量producer,但是consumer比较少的情况。也许twitter用的ruby,用长连接比较方便。但是我们是PHP,长连接相对比较麻烦。怎么办呢?

后来就想,既然你连接慢,我给你转成长连接。于是开始找agent做代理。幸好协议是memcache,找到两个memcache的代理工具。因为magent比较好编译,就先试它吧。

在每个kestrel前面加两个magent,再测试。发现速度很快了。且经过长时间运行,系统很稳定,没有出现任何问题。

总结:
1. 没有东西是完美的,各有各的问题
2. 开放的协议救了我一命啊

0
0
分享到:
评论
2 楼 tailorcai 2010-08-17  
kestrel当然是persist的
memcacheq响应速度相当快,我的理解是跟memcached查不了太多
jd2bs 写道
kestrel 没有 persist吧?  对丢消息敏感的应用可能不太合适
twitter只是发个帖子 丢了也就丢了问题不大


memcacheq 怎么样?  也是memcached协议 后台存储好像是BerkerlyDB

测试后 发现 效率一般

1 楼 jd2bs 2010-07-29  
kestrel 没有 persist吧?  对丢消息敏感的应用可能不太合适
twitter只是发个帖子 丢了也就丢了问题不大


memcacheq 怎么样?  也是memcached协议 后台存储好像是BerkerlyDB

测试后 发现 效率一般

相关推荐

    Kestrel持久化队列服务器

    Kestrel是一款高性能、轻量级的消息队列系统,最初由Twitter开发并开源。它主要被设计用来处理实时流数据,提供了一个简单的基于HTTP的API来发送和接收消息。Kestrel的一个关键特性是其持久化能力,这使得即使在...

    征服 Kestrel + XMemcached

    例如,在高并发场景下,应用可以将数据先发送到Kestrel队列,然后由后台工作进程慢慢消费,这样可以避免瞬间大量请求对后端服务造成压力。XMemcached则可以用来存储从Kestrel中取出的数据,作为快速访问的缓存层,...

    征服 Kestrel + XMemcached + Spring TaskExecutor

    首先,Kestrel是一个开源的、基于内存的分布式消息队列系统,它主要由Twitter开发并维护。Kestrel以其高吞吐量和低延迟而著名,被广泛用于构建实时处理系统和微服务架构。它的核心特性包括持久化、多客户端支持以及...

    kestrel-task-executor:Kestrel + XMemcached + Spring TaskExecutor

    在"kestrel-task-executor"项目中,Spring TaskExecutor负责接收从Kestrel队列获取的任务,并将它们分发给合适的线程进行执行。 项目结构可能包括以下几个核心组件: - **TaskProducer**:负责将任务放入Kestrel...

    Storm @Twitter-Slides.pdf

    《Storm @Twitter》是大数据流处理领域的经典之作,它由Twitter公司的工程师们提出,为实时数据流分析提供了一个强大的平台。这篇论文的原作PPT是学习Storm和流处理技术的重要资源。以下是对Storm核心概念和内部机制...

    message_system_test_report.rar_ActiveMQ java_activemq_httpsqs_me

    Kestrel是一款轻量级的消息队列,由Twitter开发,主要用于内部的实时数据处理。Kestrel使用内存存储,因此具有较高的性能,但数据持久化可能不如其他队列强大。部署Kestrel时,需要安装其依赖库并配置服务器端口和...

    QCon 北京 2010大会演讲之:构建可扩展微博架构,演讲者:Tim Yang,新浪微博技术架构师

    在新浪微博的实际应用中,使用了轻量级的消息队列产品,如Twitter的Kestrel、Erlang实现的RabbitMQ以及广泛使用的Memcacheq。 异步设计不仅降低了发表操作的复杂性,还确保了系统的响应速度和稳定性,从而能够有效...

    storm深入学习.pdf

    Spouts是数据的源头,它们可以是从Kestrel队列读取数据,或者连接到Twitter API获取推文流。Bolts则消费这些输入流,进行各种处理,比如过滤、聚合,甚至与数据库交互,生成新的数据流。Topologies可以在任何语言中...

    微博.构建可扩展的微博架构_TimYang_QCon_Beijing_2010.pdf

    - **消息队列产品**:例如Twitter的Kestrel、Erlang编写的RabbitMQ以及在新浪微博广泛使用的Memcacheq,这些轻量级的消息队列服务能够有效地处理高并发场景,确保系统的可扩展性和稳定性。 3. **微博系统的扩展性*...

    02、Storm入门到精通storm3-1.pptx

    1. **Spout**: Spout是数据流的源头,它可以是从Kestrel队列读取数据,或者连接到Twitter API获取推文流。Spout负责产生并发出`Tuple`,即Storm的数据模型,这些数据流无边界且持续不断。 2. **Bolt**: Bolt则消费...

Global site tag (gtag.js) - Google Analytics