zoukankan      html  css  js  c++  java
  • Gearman分布式任务处理系统(六)跨多种环境部署

    现代计算环境最大的挑战之一就是工作分布和计算资源的有效利用。目前的一般趋势是,便宜且轻松地安装一台强大的机器来执行比较直观和简单的任务,但是这可能得不到最佳的总体性能和机器的最佳利用。相反,很多应用程序现在发现自己需要执行一些相当小的操作,但是可能要执行成千上万次,不需要一台强大的机器。

    随着计算场(farm)的增大,有时候需要跨所有机器同时执行一个动作或操作,或者有选择地执行管理或安装任务。

    有很多解决方案可用。例如,虚拟化是其中一种方式,采用此方式时,计算机会被分片,以得到最佳的性能,尽管这些方式也有其各自的问题和局限性。memcached 工具(它采用备用内存)和类似于网格的解决方案 —— IBM 云也支持计算能力的灵活分配,使计算能力可以被随处利用。

    Gearman 采用与之不同的方法,它为跨一组机器分布离散的任务提供一种灵活的机制。利用此方法可以扩展及更加有效地利用系统,同时大大降低维护和支持此类系统的复杂性。这衍生了很多解决方案,包括网格环境,甚至还有 web 服务基础,但是都利用一种实用的分布方法。这使得 Gearman 在网格环境或 Web 环境中很有用 —— 在这样环境中,您想要共享和分布工作及请求。它也可用于从 web、数据库和 Amazon 环境卸载任务和处理信息,这使得它非常适合于支持 IBM WebSphere? 或 Amazon 部署。

    Gearman 基础
    Gearman 服务有很多要素使得它不仅仅是一种提交和共享工作的方式,但是主要的系统只由三个组件组成:gearmand 守护进程(或作业服务器);用于向 Gearman 服务提交请求的客户机;执行实际工作的工人(参见图 1)。

    图 1. Gearman 服务概要

    图中展示了 Gearman 作业服务器处于一堆客户机和工人节点的中心

    Gearmand 服务器执行一个简单的功能,即从客户机收集工作请求并充当一个注册器(工人可以在此提交关于它们支持的工作和操作类型的信息)。在传统的网格服务中,网格节点由管理服务器指派给特定的任务和给定的工作,在 Gearman 中与此不同,是由工人请求做工作。

    这一重要区别意味着,关于哪个工人做哪项工作的决定不是必需的。在分布工作时,没有配置、优先次序或者需要的其他组织。相反,系统的特点是,自运行的和自管理的,对于很多安装,这里最初要描述的基本结构都不复杂。



    在动态环境中部署 Gearman

    当然,具有这样一个灵活的环境对于使用它是一个理想的环境,此时具有灵活的服务器云(例如 Amazon 的 EC2)或者现有的大规模基础设施(比如 Web 服务器场,这里有未被充分利用或者能够处理小型离散任务的机器)。

    在云环境中使用时,您利用 Gearman 的灵活特点来运行可用的工人。将工人添加到 Gearman 系统所需要做的就是让工人脚本在引导时间执行。

    所以请考虑 图 2 中的布局。您具有一个标准的 Gearman 环境,使用标准工人组来满足客户机的需求。当环境中的负载突然增加时,您可以引导 EC2 实例,运行工人脚本来注册它们完成工作的能力,并挑选和处理信息。因此,EC2 实例是临时的,您可以根据需要注册和注销实例。

    图 2. 使用标准工人组的标准 Gearman 环境


    图中展示了一组通过 Gearman Job Server 访问标准工人和云节点的客户机

    如果有明确表达信息时涉及到的处理和准备,这才会真正有用。在本例中,您可以启动 EC2 实例,通过 Gearman 执行工作,比较响应,并关闭 EC2 实例。当您真正需要成百上千的机器来进行处理时,这可以节省资金。

     

     

    在数据环境使用 Gearman

    通常有这么一些情况,您会想要对一些信息执行某些操作,但是处理在时间上不是很紧急,或者数据源和目的地之间存在一些距离(在网络上,不是地理位置上)。

    到目前为止,已经了解在想要或需要即时响应的时候使用 Gearman 的方式。Gearman 也能够初始化background 进程。当前景客户机要求做工作而不担心何时返回响应时,就会发生这种情况。

    考虑这样一个 web 应用程序,它在注册过程中会发送一个注册 e-mail。当用户点击 web 窗体上的 Submit 按钮时实时发送这样的 e-mail,会有很多潜在的问题。问题到达邮件服务器或者只是在忙时提交 e-mail,都会延迟 web 应用程序。有了 Gearman,您可以将任务提交到队列,让您的一个工人完成 e-mail 的实际处理和格式化并发送,这可以让 web 接口做出即时响应。下面是一个很好的例子,演示了在前端不需要等待响应时分派一个 background 进程。

    同样的原理也可适用于其他时间不敏感的要素。例如,如果您在提供或使用 Twitter 集成,那么可以使用 Gearman 来处理到 Twitter 帐户的发布。在本例中,不需要内容是即时的,因而不会出现因执行内容发布而让应用程序的其余方面变慢的问题。Gearman 服务允许您返回一个失败状态,确保任务将被重新排队和重试。

    您也可以使用 Gearman 来处理数据库和其他更新(更新的即时特点不是很重要,所以信息不必即时地写入数据库)。在这种情况下,可以充分利用现代 web 应用程序工具组中其他组件(比如 memcached)的优势。

    有一个应用程序是很好的例子,它处理诸如此类的内容,比如说文档归档器,您想要从内容构建索引和其他信息。尽管已经有用于此类操作的传统队列可用,但是 Gearman 让在一组机器中扩散和分布信息变得更容易,提高了索引过程的性能。

    有助于这些情况的一个要素是,与 memcached 组合使用 Gearman 的处理,以允许您提交数据,解析和处理数据,然后自动更新该信息的高速缓存版本。

    在博客或其他内容管理系统中,可以使用该方式来允许更新和信息的即时发布,方法是更新内容的 memcached 版本并在后台更新数据库,或者更新数据库并在写操作完成后马上更新 memcached 客户端版本以用于显示。通过减少同步写操作的次数,两种方案都有助于减少向数据库写入内容,同时提高前端应用程序的响应性。

    在 清单 8 和 清单 9 中客户机和工人脚本的修改版本中,可以看到一个使用 memcached 的例子。客户机把要被计数的字符串写入 memcached,工人使用客户机提供的 ID 读取字符串,统计单词数量,然后将信息写回 memcached。本例中使用了一个硬编码的 ID,但是您也可以使用来自数据库的 ID 或 UUID。

     

    清单 8. 基于 memcached 的客户机

    1. <span style="font-size:14px;">use Gearman::Client;  
    2. use Cache::Memcached;  
    3.   
    4. # Set up memcached  
    5.   
    6. my $cache = new Cache::Memcached {  
    7.     'servers' => [  
    8.                    '192.168.0.2:11211',  
    9.                    ],  
    10. };  
    11.   
    12. # Set up Gearman  
    13.   
    14. my $client = Gearman::Client->new;  
    15. $client->job_servers('192.168.0.2:4730');  
    16.   
    17. #  
    18. # Obtain the information you want to process  
    19. # and generate a unique key  
    20.   
    21. my $id = 9334;  
    22.   
    23. # Write some metadata  
    24.   
    25. $cache->set(sprintf('doc-%d-srctxt',$id),  
    26.             'The quick brown fox jumps over the lazy dog');  
    27.   
    28. my $result = $client->dispatch_background('wordcount',$id);</span>  


    清单 9. 基于 memcached 的工人

    1. <span style="font-size:14px;">use Cache::Memcached;  
    2. use Gearman::Worker;  
    3.   
    4. my $cache = new Cache::Memcached {  
    5.     'servers' => [  
    6.                    '192.168.0.2:11211',  
    7.                    ],  
    8.     };  
    9.   
    10. my $worker = Gearman::Worker->new;  
    11. $worker->job_servers('192.168.0.2:4730');  
    12. $worker->register_function('wordcount' => &wordcount);  
    13. $worker->work while 1;  
    14.   
    15.   
    16. sub wordcount  
    17. {  
    18.     my ($arg) = @_;  
    19.   
    20.     my $id = $arg->arg;  
    21.   
    22.     print STDERR "Providing word count for ",$id," ";  
    23.   
    24.     my $string = $cache->get(sprintf('doc-%d-srctxt',$id));  
    25.   
    26.     if (!defined($string))  
    27.     {  
    28.         $cache->set(sprintf('doc-%d-status',$id),  
    29.                     'Error: Source text not found');  
    30.         return;  
    31.     }  
    32.   
    33.     my @words = split /s+/,$string;  
    34.     $cache->set(sprintf('doc-%d-status',$id),  
    35.                 'Complete');  
    36.     $cache->set(sprintf('doc-%d-result',$id),  
    37.                 scalar @words);  
    38. }</span>  


    注意,在工人中,脚本使用 status 和 tagged memcached 项来保留信息;失败可以被写入 status。这允许客户机在发生暂时的失败时重新提交工作请求。
    由于客户机不期待收到响应,所以需要一个单独的脚本在 memached 就绪时从它取得信息。清单 10 展示了一个用于此目的的简单客户机脚本,它识别是否出错(并报告错误)或报告结果。

    清单 10. 从 memcached 取得结果

    1. <span style="font-size:14px;">use Cache::Memcached;  
    2.   
    3. my $cache = new Cache::Memcached {  
    4.     'servers' => [  
    5.                    '192.168.0.2:11211',  
    6.                    ],  
    7. };  
    8.   
    9. my $id = 9334;  
    10.   
    11. if ((my $result = $cache->get(sprintf('doc-%d-status',$id))) =~ m/Complete/)  
    12. {  
    13.     print "Count is ",$cache->get(sprintf('doc-%d-result',$id),)," ";  
    14. }  
    15. else  
    16. {  
    17.     print "Result not ready: $result ";  
    18. }</span>  


    要使用该脚本,可运行工人脚本:$ perl workermemc.pl。然后运行客户机脚本,将请求提交到队列中:$ perl clientmemc.pl
    可以通过使用检索脚本,了解请求是否已完成。

    清单 11. 检索脚本 
    $ perl getresult.pl
    Result not ready:

    一旦结果最终可用,您就可以看到。

    清单 12. 最终结果
    $ perl client.pl
    Words 9

    您可以对所有类型的数据和环境重复该脚本,并在该过程中包括数据库写入和恢复。

     

    结束语

    Gearman 是一种简单的思想,它容易使用,却能提供丰富的功能,从容易地分布和共享工作负载,到允许在不同的语言和部署环境之间进行互操作。排队系统允许您利用该功能,并通过排队或降低通常在前端导致性能问题的并发性,使用它来提高应用程序性能及减少数据库和其他服务器组件上的负载。

  • 相关阅读:
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:使用SaveChanges持久化实体
    ASP.NET MVC+Colorbox做的一个Demo(一)
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化的一些技巧
    NHibernate初学者指南(4):定义数据库架构
    Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)
    NHibernate初学者指南(1):开篇
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化修改的实体到数据库
    Java面试题每日五题(2010/02/26)
    Notes for Hadoop the definitive guide
    简明Java笔记
  • 原文地址:https://www.cnblogs.com/shenming/p/3628352.html
Copyright © 2011-2022 走看看