高性能网站架构方案(三) ——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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

研究consul的service mesh功能

来源:https://jeremy-xu.oschina.io/2018/07/%E7%A0%94%E7%A9%B6consul%E7%9A%84service...

1143
来自专栏EAWorld

Micronaut:面向未来的微服务和云原生应用框架

原题:MICRONAUT: A JAVA FRAMEWORK FOR THE FUTURE, NOW

1212
来自专栏DevOps时代的专栏

Jenkins 的 Pipeline 脚本在美团餐饮 SaaS 中的实践

在日常开发中,我们经常会有发布需求,而且还会遇到各种环境,比如:线上环境(Online),模拟环境(Staging),开发环境(Dev)等。最简单的就是手动构建...

682
来自专栏技术之路

go微服务框架go-micro深度学习(一) 整体架构介绍

      产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以...

1452
来自专栏磨磨谈

Ceph用户邮件列表Vol45-Issue1

这个问题是作者一个集群中(ceph 0.94.5)出现了一个磁盘损坏以后造成了一些对象的丢失,然后在做了一定的处理以后,集群状态已经正常了,但是还是新的请求会出...

642
来自专栏ITCloud的专栏

consul的service mesh功能初体验

|作者简介 ? consul之前一直被当成一个服务发现、分布式KV服务、服务健康检查服务等,但此前发布的1.2版本,宣称其实现了Service Mesh方案。...

741
来自专栏令仔很忙

C/S和B/S的区别

    C/S的学习已经结束有一段时间了,现在正在进行B/S的学习,那么C/S和B/S又有什么样的不同呢?

672
来自专栏技术小黑屋

Android进程线程调度之cgroups

做Android开发的同学们,了解cgroups的同学其实不多,cgroups是什么意思呢,在操作系统中有着什么样的作用,以及Android中的cgroups有...

752
来自专栏FreeBuf

SUpraudit:一款MacOS上的日志审计工具

你可能对BSM审计有所了解,也可能完全没有听说过。这是Solaris OS遗留下来的产物,它存在于FreeBSD,Linux,当然还包括MacOS上。在我的*O...

994
来自专栏杨建荣的学习笔记

数据补丁中需要注意的几个问题(r5笔记第21天)

今天来感慨一下在工作中碰到的几处数据补丁问题,当然这些细节都是流程之外的控制和规范了,但是也或多或少出现了不少的问题,有些让人纠结,有些让人抓狂,有些让人无奈,...

33610

扫码关注云+社区