如何用队列提升系统性能

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ICQueue与MemcacheQ测试
Icqueue(200客户端)
Memcacheq(200客户端)
ICQueue的配置文件
ICQueue的使用
<?php <?php $mem=new Memcache(); new $mem->addServer ("127.0.0.1",13421,false false,1,100); false $str= json_encode($posts); $mem->add("bbs_password_",$str,0,0);//入队,bbs为队列名称,
//执行代码 String code = memcachedClient.get("job_pass"); String result=RunJob.runCode(code);
用队列收集日志进行处理
准实时的日志处理(统计)
比如wap站不支持js,只能靠日志统计
Байду номын сангаас
app queue app app
低延迟,速度稳定
数据库
高速队列,降低了应用 写库的时间,能提高系 统的写入吞吐量,应付 高峰值
如何用队列提升数据库写入性能
队列在数据写入中的应用
queue 用户 queue 处理job job 数据库
数据库宕机,队列部分宕机 不影响应用的正常服务
如何用队列提升数据库写入性能
队列在数据写入中的实时性
queue 用户 queue 处理job job 数据库
password为密码,$str为入队的内容 $mem->get("bbs_password_");//从队列中获取队列头部的数据
?> <?php <?php $mem=new Memcache(); new $mem->addServer ("127.0.0.1",13421,false false,1,100); false $mem->get(“clear|bbs|password”); //清空 $mem->get(“size|bbs|password”); //获取队列剩余数据条数 ?>
利用故障转移功能可实现高可靠性
$mem=new Memcache(); $mem->addServer (“192.168.100.11",13421,false,1,100); $mem->addServer (“192.168.100.12",13421,false,1,100);
没有了!
如何用队列提升数据库写入性能
典型的数据库写入应用
app
直接Insert into Insert
数据库
应用的性能直接依赖于数 据库的响应时间和性能
如何用队列提升数据库写入性能
数据库写应用中使用队列
queue 用户 queue
合并写,(注:linux文件系统也会利 用合并来提升性能-【电梯算法】)
处理job job 批量insert
复制
实时缓冲区
用户
merge
数据库
如何用队列提升数据库写入性能
Merge举例
用队列实现分布式任务处理
邮件发送,短信发送
a@126.com maila b@126.com maila b@gmail.com maila c@126.com mailb d@sina.com mailb e@sina.com mailb Queue.get() Queue.get() Queue.get()
银行排队的取号机 ebay 微博,sns的feed处理 短信,邮件系统 用户数据的提交(不直接入库) 手机凤凰网,凤凰评论系统 ……
用队列进行异步处理可以
提高系统吞吐量-throughput 降低系统的延迟 -latency 节约峰值处理成本 合并计算和请求 异步任务处理 解耦程序,提高伸缩性和可靠性
如何用队列提升系统的性能
孙立@凤凰网 www.ifeng.com
http://twitter.com/sunli1223 http://t.sina.com.cn/sunli1223 http://t.ifeng.com/sunli http://sunli.cnblogs.com/
谁在用队列完成异步处理
ICQueue的扩展和可靠性
利用memcached的hash可实现扩展
$mem->add(“bbs_password_123”,$str,0,0); $mem->add(“bbs_password_135”,$str,0,0);
//bbs_password_{随机字符},icqueue自动忽略密码后的字符
发送进程
发送进程 发送进程
Queue.get()
用队列实现可执行任务
队列存储可执行脚本逻辑
//存储逻辑到队列 memcachedClient.add("job_pass", 0, "#!/bin/sh\r\nsome code"); memcachedClient.add("job_pass", 0, "<?php sone code?>");
Queue 存储转换 成功的数 据 db
文件分发 文件分发 文件分发
Queue 成功的后续处理 转换成功
存储分发 成功的数 据
用队列异步解耦程序,可以更好的进行扩展,这与actor模型类似。
用ICQueue架构队列
20万QPS(高性能),底层存储高达500万QPS Memcached协议兼容(易用) 支持数万并发连接(高并发) 最低只需几十M内存(低内存消耗) 多队列支持 安全认证,支持密码 基于磁盘持久化,支持大数据量。 随着数据增加,性能稳定
发送进程 发送进程 发送进程
……
用队列实现任务分组
按照规则分组执行任务
邮件按运营商分组,防止过快被封IP 按照优先级别分组任务 按照类型分组任务
a@126.com maila b@126.com maila c@126.com mailb d@sina.com mailb e@sina.com mailb b@gmail.com maila Queue.get() Queue.get()
统计系统 日志监控报警系统 queue 系统性能分析系统
延迟比较高,速度不稳定, 可能跨机房
日处理1亿日志的队列服务资源占用截图,高峰期不超过20%
用队列解耦程序
视频网站的用户视频上传流程
视频上传 视频上传 视频上传 视频传
转换处理 Queue
存储用户上传的 信息,文件实体 分开存储
转换处理 转换处理
相关文档
最新文档