您的位置  > 互联网

什么是?提供了一个通用的应用程序框架?

提供通用的应用程序框架,用于将工作转移到更适合该工作的其他机器或流程。 它允许您并行工作、负载平衡处理以及语言之间的函数调用。 它可用于从高可用性网站到传输数据库复制事件的各种应用程序。 换句话说,它是一个以分布式方式处理通信的神经系统。 一些优点:

内容会定期更新,因此请经常回来查看。 如果您想了解更多信息或参与其中,您可能还想查看其他形式的沟通!

怎么工作?

驱动程序应用程序由三部分组成:客户端、工作人员和作业服务器。 客户端负责创建要运行的作业并将其发送到作业服务器。 作业服务器会找到一个合适的来运行作业并转发作业。 执行客户端请求的工作,并通过作业服务器将响应发送给客户端。 提供应用程序调用以与作业服务器(也称为作业服务器)对话的客户端和工作 API,因此您无需处理作业的网络或映射。 在内部,客户端和工作 API 使用 TCP 套接字与作业服务器进行通信。 为了更详细地解释它是如何工作的,让我们看一个反转字符串中字符顺序的简单应用程序。 这个例子是用 PHP 给出的,

我们首先编写一个客户端应用程序,负责发送作业并等待结果以便打印。 它通过使用客户端 API 发送一些与函数名称(在本例中为函数)相关的数据来实现此目的。 代码是(为简洁起见,省略了错误处理):

<?php// Reverse Client Code$client = new GearmanClient();$client->addServer();
print $client->do("reverse", "Hello World!");

此代码初始化一个客户端类,将其配置为使用作业服务器(不带参数意味着使用 127.0.0.1 默认端口),然后通知客户端 API 以工作负载“Hello world!”运行该函数。 就我而言,函数名称和参数是完全任意的,因此您可以发送适合您的应用程序的任何数据结构(文本或二进制)。 此时,客户端API会将作业打包成协议包并发送给作业服务器,以寻找可以运行该功能的合适。 现在让我们看一下工人代码:

<?php// Reverse Worker Code$worker = new GearmanWorker();$worker->addServer();$worker->addFunction("reverse", function ($job) { return strrev($job->workload());});
while ($worker->work());

此代码定义了一个函数,该函数接受一个字符串并返回该字符串的反向内容。 作业对象使用它来注册一个函数,该函数设置为连接到与客户端相同的本地作业服务器。 当作业服务器收到要运行的作业时,它会查看已注册功能名称的工作人员列表,并将作业转发给其中一名空闲工作人员。 然后, API 接受该请求,运行该函数,并通过作业服务器将函数的结果发送回客户端。

如您所见,客户端和工作线程 API(以及作业服务器)处理作业管理和网络通信,因此您可以专注于应用程序部分。 有多种不同的方式来运行作业,包括异步处理和优先作业的上下文。 有关更多信息,请参阅各种 API 的可用文档。

有什么用?

上面的例子看起来运行一个函数需要做很多工作,但是有很多方法可以做到。 最简单的答案是,您可以将其用作用不同语言编写的客户端和工作人员之间的接口。 如果您希望 PHP Web 应用程序调用用 C 编写的函数,您可以将 PHP 客户端 API 与 C API 结合使用,并在中间放置一个作业服务器。 当然,有更有效的方法可以做到这一点(例如用 C 语言编写 PHP 扩展),但您可能需要一个 PHP 客户端和一个工作器,或者一个 MySQL 客户端和一个 Perl 工作器。 只要所有应用程序都了解所发送的工作负载,您就可以轻松混合和匹配任何支持的语言界面。 支持您最喜欢的语言吗? 要参与该项目,您或现有开发人员可能相当容易在 C 库之上放置语言包装器。

另一种有用的方法是将工作代码放在更适合工作的单独机器(或一组机器)上。 假设您的 PHP Web 应用程序想要进行图像转换,但处理量太大,无法在 Web 服务器计算机上运行。 您可以将图像发送到一组单独的工作计算机进行转换,这样负载就不会影响 Web 服务器和其他 PHP 脚本的性能。 通过这样做,您还可以获得一种自然形式的负载平衡,因为作业服务器仅向空闲工作人员发送新作业。 如果在特定机器上运行的所有工作人员都很忙,您不必担心向那里发送新作业。 这使得扩展多核服务器变得非常简单:一台工作机器上有 16 个核? 启动 16 个工作线程实例(或者更多,如果它们不受 CPU 限制)。 还可以无缝添加新机器来扩展您的工作池,只需启动它们,安装工作代码,并将它们连接到现有的作业服务器。

现在你可能会问如果作业服务器挂掉了怎么办? 您可以运行多个作业服务器,并让客户端和工作人员连接到配置的第一个可用作业服务器。 这样,如果工作服务器挂掉,客户端和工作人员将自动故障转移到另一台工作服务器。 您可能不想运行太多作业服务器,但两到三个是实现冗余的好主意。 左图显示了简单集群的样子。

从这里,您可以根据需要扩大您的客户和员工。 作业服务器可以轻松处理同时连接的数百个客户端和工作人员。 您可以在容量允许的情况下绘制自己的物理(或虚拟)机器生产线,从而可以将负载分配到任意数量的机器。 有关具体使用和安装的更多详细信息,请参阅示例部分。

更新来了。

建筑中的三种角色

:请求的发起者,工作任务的需求者(可以是C、PHP、Java、Perl、Mysql udf等)

Job:请求的调度器,负责将请求转发到对应的(服务进程创建)

:请求处理程序(可以是C、PHP、Java、Perl等)

它是如何工作的?

从上图可以看出,API、API、Job都是自己提供的,我们只需要在应用程序中调用即可。 目前API非常丰富。

吞吐能力

经过测试,结果如下:

系统环境:-14.0.4 1 CPU 4核2G内存(虚拟机)

默认启动:./ -d

.php