SlideShare una empresa de Scribd logo
1 de 25
高性能队列Fqueue的设计和使用实践



               孙立@qunar.com
          weibo.com@sunli1223



                  2011.11
提纲




•    FQueue简介
•    Fqueue的存储设计
•    Fqueue的使用实践
•    Q&A
Fqueue简介



Fqueue(Fast Queue)
    提供跟Memcached一样的客户端分布式和高可用机制
   单实例多队列功能
   每个队列可设置安全认证密码
   可动态增加队列或者更改密码
   纯JAVA实现,可以内置到JAVA进程内使用
   simple,真的simple


开源
   http://code.google.com/p/fqueue/
Fqueue有多快



• 进程内
  每次写入10字节,909万qps 86MB/s
  每次写入1024字节,19万qps 185MB/s
• 跨服务器
  多个client每次写入10字节,32万qps
Fqueue使用有多简单



• 下载->解压->启动
• 直接使用




无需繁杂的参数优化,你总是能获得高性能的Queue队列服务器
Fqueue的存储设计
Fqueue的整体设计结构

架构在Memcached协议之上



             add                      FSQueue持久化
  Producer
                                         队列存储
                   Memcached
             get     接口               FSQueue持久化
  Comsumer                               队列存储

                                      FSQueue持久化
                                         队列存储
                               Fqueue协议实现




                   管理、监控
Fqueue的存储结构设计

初始想法

                                     单文件顺序
1   2    3   4   5   6   7   8   9   存储数据




3   18           存储出队和入队的位置




             问题:出队数据不好删除
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
选择读写实现方式-内存映射


JAVA的读写文件方式有很多,性能、特点都不一样,所以需要选择一个合适的。

测试方式:循环顺序写入10字节数据1000万次


写方式                    结果耗时(ms)   备注
BufferedOutputStream   414        速度最快(与设置的cache大小
                                  有关),数据cache在JVM内。
RandomAccessFile       29499      速度最慢,数据直接刷盘。
FileChannel            1868       速度比较快。OS级别cache
MappedByteBuffer       1456       速度快。OS级别内存映射


BufferedOutputStream虽然最快,但是易丢失数据,权衡之下,我们选择
了MappedByteBuffer作为我们的文件操作实现
Fqueue一些优化




 1. FileNo文件全部消费后,交给后台线程异步删除
 2. 在新创建一个FileNo时,会让后台线程预创建
   下一编号的存储文件
 3. 每10ms让OS强制刷盘
 4. 每个Queue的读写都有自己的Queue级别writeLock



 1、2在FileRunner.java中实现
Fqueue的使用实践
队列服务器的常见使用场景-缓解数据库写压力


• 直接写数据库




           直接Insert into   数据库
 app




 应用的性能直接依赖于数
 据库的响应时间和性能
队列服务器的常见使用场景-缓解数据库写压力


• 用队列服务器应付高峰写入



        queue
                  处理job     数据库
 用户              批量insert

        queue

                       合并写。(批量插入可提升性能)
 高速队列,降低了应用
 写库的时间,能提高系
 统的写入吞吐量,应付
 高峰值
队列服务器的常见使用场景-缓解数据库写压力


• 用队列服务器应付高峰写入




        queue
                 处理job   数据库
 用户

        queue


 数据库宕机,队列部分宕机
 不影响应用的正常服务
队列服务器的常见使用场景-缓解数据库写压力


• 用了队列服务器,如何实现实时性?




        queue
                        处理job   数据库
 用户

        queue                     复制


       实时缓冲区
 用户                             数据库

                merge
队列服务器的常见使用场景-任务处理


• 比如发送邮件

 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()    发送进程
队列服务器的常见使用场景-任务处理


• 自描述任务

//存储逻辑到队列
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);
队列服务器的常见使用场景-数据收集


• 日志收集


  app                       统计系统
            queue
                         日志监控报警系统
  app

            queue        系统性能分析系统
  app
                    延迟比较高,速度不稳定,
                       可能跨机房
 低延迟,速度稳定




日处理1亿日志的队列服务资源占用截图,高峰期不超过20%
队列服务器的常见使用场景-解耦程序


• 视频网站的用户视频上传流程


 视频上传
                    转换处理         Queue
                                         文件分发
 视频上传                                    文件分发
            Queue   转换处理        存储转换
           存储用户上传
 视频上传                           成功的数     文件分发
           的信息,文件   转换处理          据
           实体分开存储
  视频传


                           db
                                         Queue
        成功的后续处                           存储分发
           理          转换成功               成功的数
                                          据
用队列异步解耦程序,可以更好的进行扩展,这与actor模型类似。
Fqueue的使用


             PHP使用




              Java使用
            (Xmemcached
                 )
Fqueue的使用-分布式与key的设计




 Fqueue1    Fqueue2   Fqueue3   •   Hash(key_pass)始终 只会hash到一台。(HA)
                                •   Hash(key_pass_固定字符串),固定hash到3三台,
                                    可用于负载均衡。
                                •   Hash(Key_pass_变化字符串),随机hash到三台,
                                    可用于负载均衡。

           client
Fqueue实践-Qunar.com的火车票余票抓取



         Memcached



   火                 Fqueue    处理程序
   车
   票                           处理程序
   系   余票抓取任务
   统                 Fqueue    处理程序




                     后台定时任务   清除堆积数据
Fqueue实践-监控
Q&A




               谢谢

           加入我们吧

      各种技术人员,简历投递到 li.sun@qunar.com
      微博联系:http://weibo.com/sunli1223

Más contenido relacionado

La actualidad más candente

新浪微博redis技术演化
新浪微博redis技术演化新浪微博redis技术演化
新浪微博redis技术演化XiaoJun Hong
 
大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)Tim Y
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
豆瓣数据架构实践
豆瓣数据架构实践豆瓣数据架构实践
豆瓣数据架构实践Xupeng Yun
 
redis 适用场景与实现
redis 适用场景与实现redis 适用场景与实现
redis 适用场景与实现iammutex
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优thinkinlamp
 
阿里CDN技术揭秘
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘Joshua Zhu
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构Cosey Lee
 
Memcached vs redis
Memcached vs redisMemcached vs redis
Memcached vs redisqianshi
 
美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术团队
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁reinhardx
 
Hbase架构简介、实践
Hbase架构简介、实践Hbase架构简介、实践
Hbase架构简介、实践Li Map
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosqlknuthocean
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践jackbillow
 
了解集群
了解集群了解集群
了解集群Feng Yu
 
Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0qianshi
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130Jinrong Ye
 
美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统美团点评技术团队
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构drewz lin
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践Feng Yu
 

La actualidad más candente (20)

新浪微博redis技术演化
新浪微博redis技术演化新浪微博redis技术演化
新浪微博redis技术演化
 
大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)大数据时代feed架构 (ArchSummit Beijing 2014)
大数据时代feed架构 (ArchSummit Beijing 2014)
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
豆瓣数据架构实践
豆瓣数据架构实践豆瓣数据架构实践
豆瓣数据架构实践
 
redis 适用场景与实现
redis 适用场景与实现redis 适用场景与实现
redis 适用场景与实现
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
阿里CDN技术揭秘
阿里CDN技术揭秘阿里CDN技术揭秘
阿里CDN技术揭秘
 
构建基于Lamp的网站架构
构建基于Lamp的网站架构构建基于Lamp的网站架构
构建基于Lamp的网站架构
 
Memcached vs redis
Memcached vs redisMemcached vs redis
Memcached vs redis
 
美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
Hbase架构简介、实践
Hbase架构简介、实践Hbase架构简介、实践
Hbase架构简介、实践
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践
 
了解集群
了解集群了解集群
了解集群
 
Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0Traffic server 管理员指南v1.0
Traffic server 管理员指南v1.0
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130
 
美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统美团点评技术沙龙14:美团云对象存储系统
美团点评技术沙龙14:美团云对象存储系统
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践
 

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

优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析George Ang
 
Key value store
Key value storeKey value store
Key value storexuanhan863
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijingdrewz lin
 
大型视频网站单点分析与可用性提升-Qcon2011
大型视频网站单点分析与可用性提升-Qcon2011大型视频网站单点分析与可用性提升-Qcon2011
大型视频网站单点分析与可用性提升-Qcon2011Yiwei Ma
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲84zhu
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现orczhou
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0jinqing zhu
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails serverMichael Chen
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计zhujiadun
 
阿里云技术实践
阿里云技术实践阿里云技术实践
阿里云技术实践drewz lin
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发litaocheng
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)涛 吴
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计aleafs
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研zijingyeshao
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelHo Kim
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture introted-xu
 

Similar a 高性能队列Fqueue的设计和使用实践 (20)

优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析
 
Key value store
Key value storeKey value store
Key value store
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijing
 
大型视频网站单点分析与可用性提升-Qcon2011
大型视频网站单点分析与可用性提升-Qcon2011大型视频网站单点分析与可用性提升-Qcon2011
大型视频网站单点分析与可用性提升-Qcon2011
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
 
阿里云技术实践
阿里云技术实践阿里云技术实践
阿里云技术实践
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
Pegasus: Designing a Distributed Key Value System (Arch summit beijing-2016)
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
Zabbix in PPTV
Zabbix in PPTVZabbix in PPTV
Zabbix in PPTV
 
PHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits LevelPHP Optimization for Millions Visits Level
PHP Optimization for Millions Visits Level
 
1, OCP - architecture intro
1, OCP - architecture intro1, OCP - architecture intro
1, OCP - architecture intro
 

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