高性能网站架构方案(三) ——Varnish加速与Gearman任务分发
高性能网站架构方案(三)——Varnish加速与Gearman任务分发
原创内容,转载请注明来源,谢谢)
一、Varnish
在没有代理的情况下,对于http请求,都需要web服务器从磁盘取数据(如操作数据库),再发送给客户端。把访问过的页面缓存到内存中,下次访问直接从内存读取,能有效加快web应用的访问速度。
Varnish作为web服务器,其缓存的功能较好。varnish可以作为浏览器和apache的中间层,浏览器的请求都统一由varnishe来代理。而varnish对于浏览器又足够透明,对于浏览器而言,不会感觉到varnish的存在。
1、启用
1)修改配置文件default.vcl
backenddefault{
.host = “127.0.0.1”;
.port = “80”;
}
2)开启varnish
varnished -f /path_to_default/default.vcl-s malloc,128M -T 127.0.0.1:2000 -a:8000
开启的时候,选择配置文件、分配用于缓存的内存空间、侦听的地址和端口等。
2、修改缓存规则
开启varnish后,在没有修改缓存规则的情况下,每次的请求都会被缓存,当需要动态加载内容时则无法加载。因此,需要配置缓存规则。
1)vcl_recv函数配置
请求达到varnish时,第一个调用的函数是vcl_recv,其告诉varnish哪些请求需要先找缓存,哪些请求直接转发给服务器。
通过req.request的值,可以选择性的返回结果,如果返回的是”pass”表示直接请求服务器,如果返回的是”lookup”则表示查找缓存。
pass以后会进入vcl_pass阶段请求服务器;而lookup则可能会进入vcl_hit阶段,命中并将结果返回,也可能进入vcl_miss阶段,没有命中缓存,则重新进入vcl_pass阶段请求服务器。
2)vcl_fetch函数配置
服务器处理完数据后,返回给varnish时,会调用此函数。varnish会根据配置决定哪些内容要缓存,哪些内容不缓存。
返回的结果中,”pass”表示不需要缓存直接返回给浏览器,而”deliver”表示写入缓存。
二、Gearman
当处理用户上传的图片、文件、视频等内容时,由于比较耗时,因此可以将计算交给后台服务器进行处理。
gearman是分发任务的程序框架,包括三个部分:client部分用于创建并发起一个job请求;job server部分用于找到合适的worker,并把job交给worker;worker部分执行job。
1、gearman工作流程
gearman提供了一系列的api,让client、worker都能与job server通信。对于gearman使用者,只需要编写client和worker的应用程序,而不需要管中间怎么操作。即client可以将任务派发给gearman,worker可以接收任务并进行处理,而不需要管中间的细节。
2、业务场景
对于群发邮件等耗时较多的场景,可以用gearman进行任务分发,则客户端选择群发后,可以立即返回,而不需要讲界面阻塞着等待发送成功。
使用gearman需要先安装gearman服务器软件,再安装php的扩展,并加入php.ini即可。
gearman默认使用4730端口。
3、gearman实现邮件发送
gearman的编程在业务场景中分为两部分,一是client,即提出某项任务需求方,二是worker,即执行需求放。在发送邮件的场景中,client负责提出发送邮件的需求给gearman,worker负责执行发送邮件。
1)client
<?php
$client= new GearmanClient();
$client->addServer(‘127.0.0.1’,4730);
$message= array(
‘to’ => ‘mailtoyou.163.com’,
‘subject’ => ‘this is the title ofmail’,
‘message’ => ‘mail message’,
‘headers’ => ‘From:mymail.qq.com’
);
echo$client->doBackground(‘send’, serialize($message));
其中,doBackground的第一个参数是gearman的worker的php代码中定义的功能,即下面的代码定义的名称;第二个参数是执行的参数,必须是字符串,如果是其他内容,必须序列化后进行传输。
2)worker
<?php
$worker = newGearmanWorker();
$worker->addServer(‘127.0.0.1’,4730);
$worker->addFunction(‘send’,‘execSend’);
while($worker->work());
functionexecSend($job){
$mail = unserialize($job->workload());
return mail($mail[‘to’], $mail[‘subject],$mail[‘message], $mail[‘headers’]);
}
在worker中,通过while,无限循环,每当检测到有任务时,就执行。另外worker中需要定义功能,供client调用。
——written by linhxx 2017.08.17
- Maven 项目下slf4j 包冲突问题
- 谷歌教你学 AI-第三讲简单易懂的估算器
- 黑产是如何强刷用户银行卡8.1万元的?
- Spring 必知概念(二)
- 利用iText 组件导出PDF
- 利用POI组件导出Excel的简单示例
- MongoDB 整合spring-data-jpa,spring 4.x
- 【微信开发】 红包接口开发
- 【微信开发】 使用单例设计模式 提供AccessToken 和Jsapi_ticket缓存支持
- @ResponseBody响应JSON 406
- tomcat不能运行或共存多个项目
- Spring Task 定时任务
- 如何为机器学习索引,切片,调整 NumPy 数组
- 逆向工程分析:摩托罗拉安全摄像头究竟有多不安全?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法