高性能队列Fqueue的设计和使用实践

17,516 views

Published on

主要介绍Fqueue的设计实现和常见的队列使用场景,并讲解一个Fqueue的真实使用场景

Published in: Technology
1 Comment
21 Likes
Statistics
Notes
  • 非常好的分享,感谢作者的贡献,我们最近项目需要使用一个高吞吐量的本地消息队列,Fqueue是个不错的选择
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
17,516
On SlideShare
0
From Embeds
0
Number of Embeds
10,849
Actions
Shares
0
Downloads
245
Comments
1
Likes
21
Embeds 0
No embeds

No notes for slide

高性能队列Fqueue的设计和使用实践

  1. 1. 高性能队列Fqueue的设计和使用实践 孙立@qunar.com weibo.com@sunli1223 2011.11
  2. 2. 提纲• FQueue简介• Fqueue的存储设计• Fqueue的使用实践• Q&A
  3. 3. Fqueue简介Fqueue(Fast Queue) 提供跟Memcached一样的客户端分布式和高可用机制 单实例多队列功能 每个队列可设置安全认证密码 可动态增加队列或者更改密码 纯JAVA实现,可以内置到JAVA进程内使用 simple,真的simple开源 http://code.google.com/p/fqueue/
  4. 4. Fqueue有多快• 进程内 每次写入10字节,909万qps 86MB/s 每次写入1024字节,19万qps 185MB/s• 跨服务器 多个client每次写入10字节,32万qps
  5. 5. Fqueue使用有多简单• 下载->解压->启动• 直接使用无需繁杂的参数优化,你总是能获得高性能的Queue队列服务器
  6. 6. Fqueue的存储设计
  7. 7. Fqueue的整体设计结构架构在Memcached协议之上 add FSQueue持久化 Producer 队列存储 Memcached get 接口 FSQueue持久化 Comsumer 队列存储 FSQueue持久化 队列存储 Fqueue协议实现 管理、监控
  8. 8. Fqueue的存储结构设计初始想法 单文件顺序1 2 3 4 5 6 7 8 9 存储数据3 18 存储出队和入队的位置 问题:出队数据不好删除
  9. 9. Fqueue的存储结构设计最终的结构1 2 3 4 5 6 7 8 File1 1. 数据顺序写 2. 数据顺序读 3. IndexFile记录读写位置和文件编号1 2 3 4 5 6 7 8 File2 4. Index File标记删除,不删除物理数据 FileNo全部消费后,再删除FileNo文件。1 2 3 4 5 6 7 8 File3 Read Write Read Write Index File offset offset FileNo FileNo
  10. 10. 选择读写实现方式-内存映射JAVA的读写文件方式有很多,性能、特点都不一样,所以需要选择一个合适的。测试方式:循环顺序写入10字节数据1000万次写方式 结果耗时(ms) 备注BufferedOutputStream 414 速度最快(与设置的cache大小 有关),数据cache在JVM内。RandomAccessFile 29499 速度最慢,数据直接刷盘。FileChannel 1868 速度比较快。OS级别cacheMappedByteBuffer 1456 速度快。OS级别内存映射BufferedOutputStream虽然最快,但是易丢失数据,权衡之下,我们选择了MappedByteBuffer作为我们的文件操作实现
  11. 11. Fqueue一些优化 1. FileNo文件全部消费后,交给后台线程异步删除 2. 在新创建一个FileNo时,会让后台线程预创建 下一编号的存储文件 3. 每10ms让OS强制刷盘 4. 每个Queue的读写都有自己的Queue级别writeLock 1、2在FileRunner.java中实现
  12. 12. Fqueue的使用实践
  13. 13. 队列服务器的常见使用场景-缓解数据库写压力• 直接写数据库 直接Insert into 数据库 app 应用的性能直接依赖于数 据库的响应时间和性能
  14. 14. 队列服务器的常见使用场景-缓解数据库写压力• 用队列服务器应付高峰写入 queue 处理job 数据库 用户 批量insert queue 合并写。(批量插入可提升性能) 高速队列,降低了应用 写库的时间,能提高系 统的写入吞吐量,应付 高峰值
  15. 15. 队列服务器的常见使用场景-缓解数据库写压力• 用队列服务器应付高峰写入 queue 处理job 数据库 用户 queue 数据库宕机,队列部分宕机 不影响应用的正常服务
  16. 16. 队列服务器的常见使用场景-缓解数据库写压力• 用了队列服务器,如何实现实时性? queue 处理job 数据库 用户 queue 复制 实时缓冲区 用户 数据库 merge
  17. 17. 队列服务器的常见使用场景-任务处理• 比如发送邮件 a@126.com maila Queue.get() 发送进程 b@126.com maila Queue.get() 发送进程 b@gmail.com maila c@126.com mailb Queue.get() d@sina.com mailb 发送进程 e@sina.com mailb a@126.com maila …… b@126.com maila Queue.get() 发送进程 c@126.com mailb d@sina.com mailb e@sina.com mailb Queue.get() 发送进程 分组发送 b@gmail.com maila Queue.get() 发送进程
  18. 18. 队列服务器的常见使用场景-任务处理• 自描述任务//存储逻辑到队列memcachedClient.add("job_pass", 0, "#!/bin/shrnsome code");memcachedClient.add("job_pass", 0, "<?php sone code?>");//执行代码String code = memcachedClient.get("job_pass");String result=RunJob.runCode(code);
  19. 19. 队列服务器的常见使用场景-数据收集• 日志收集 app 统计系统 queue 日志监控报警系统 app queue 系统性能分析系统 app 延迟比较高,速度不稳定, 可能跨机房 低延迟,速度稳定日处理1亿日志的队列服务资源占用截图,高峰期不超过20%
  20. 20. 队列服务器的常见使用场景-解耦程序• 视频网站的用户视频上传流程 视频上传 转换处理 Queue 文件分发 视频上传 文件分发 Queue 转换处理 存储转换 存储用户上传 视频上传 成功的数 文件分发 的信息,文件 转换处理 据 实体分开存储 视频传 db Queue 成功的后续处 存储分发 理 转换成功 成功的数 据用队列异步解耦程序,可以更好的进行扩展,这与actor模型类似。
  21. 21. Fqueue的使用 PHP使用 Java使用 (Xmemcached )
  22. 22. Fqueue的使用-分布式与key的设计 Fqueue1 Fqueue2 Fqueue3 • Hash(key_pass)始终 只会hash到一台。(HA) • Hash(key_pass_固定字符串),固定hash到3三台, 可用于负载均衡。 • Hash(Key_pass_变化字符串),随机hash到三台, 可用于负载均衡。 client
  23. 23. Fqueue实践-Qunar.com的火车票余票抓取 Memcached 火 Fqueue 处理程序 车 票 处理程序 系 余票抓取任务 统 Fqueue 处理程序 后台定时任务 清除堆积数据
  24. 24. Fqueue实践-监控
  25. 25. Q&A 谢谢 加入我们吧 各种技术人员,简历投递到 li.sun@qunar.com 微博联系:http://weibo.com/sunli1223

×