用HTTP方式调用gearman任务处理

本来以为是个挺美好的东西,结果。。。

这样的方式非常不安全,尤其是假设暴露在公网地址,非常easy被攻击,并且gearman的http服务远没有专业的webserver健壮。

攻击方式非常easy:telnet host 8080,连接成功后,随便输入点内容,如:aaa,gearman日志就不停的出现例如以下错误信息:

bad request line:aaa

简直就是死循环,gearmand就顶不住了,系统内存也一会就被耗尽,说明http这块实现的有BUG。

只是能够通过改动源代码来修复这个BUG:

You can open file libgearman-server/plugins/protocol/http/protocol.cc , find ‘bad request line:‘ and ‘bad method:‘,
then chang ‘GEARMAND_SUCCESS‘ to ‘GEARMAND_INVALID_PACKET‘ after them. This way is quick for this bug.

也能够下载以下的补丁,对源patch:

https://bugs.launchpad.net/gearmand/+bug/1348865/+attachment/4182968/+files/gearmand-1.1.12.patch

gearmand-1.1.12源代码安装文件夹下运行:patch -p0 < ../gearmand-1.1.12.patch

该补丁攻克了上面的错误,同一时候也添加了对get方法的支持

bug信息參见:https://bugs.launchpad.net/gearmand/+bug/1348865

原文:

This protocol plugin allows you to map HTTP requests to Gearman jobs. It only provides client job submission currently, but it may be extended to support other request types in the future. The plugin can handle both GET and POST data, the latter being used
to send a workload to the job server. The URL being requested is translated into the function being called.

For example, the request:

POST /reverse HTTP/1.1
Content-Length: 12

Hello world!

Is translated into a job submission request for the function “reverse” and workload “Hello world!”. This will respond with:

HTTP/1.0 200 OK
X-Gearman-Job-Handle: H:lap:4
Content-Length: 12
Server: Gearman/0.8

!dlrow olleH

The following headers can be passed to change the behavior of the job:

* X-Gearman-Unique: <unique key>
* X-Gearman-Background: true
* X-Gearman-Priority: <high|low>

For example, to run a low priority background job, the following request can be sent:

POST /reverse HTTP/1.1
Content-Length: 12
X-Gearman-Background: true
X-Gearman-Priority: low

Hello world!

The response for this request will not have any data associated with it since it was a background job:

HTTP/1.0 200 OK
X-Gearman-Job-Handle: H:lap:6
Content-Length: 0
Server: Gearman/0.8

The HTTP protocol should be considered experimental.

应用场景:

开启gearman http监听功能,让前端以web api方式调用gearman job

起用方式:

在gearmand的起动參数中加上:

/usr/local/gearman/sbin/gearmand        \

-l /usr/local/gearman/log/trace.log     \

--verbose INFO -p 4730 -u root -d -t 4  \

--http-port 8080                        \

-r http

--http-port=8080 指定监听端口号

-r http 起用http协议模块

调用方式:

眼下http协议仅仅支持任务提交类接口,其他类型的暂不支持。

按官方文档上说,http支持GET和POS两种方式调用,可是GET方式我还没弄清楚如何携带数据,POST方式实验过是能够的

http://172.16.18.116:8080/reverse

reverse就为函数名,假如POST的数据内容为:“Hello world!”,返回结果为:“!dlrow olleH”

在http的header头中能够设置一些任务參数:

* X-Gearman-Unique: <unique key>

* X-Gearman-Background: true

* X-Gearman-Priority: <high|low>

这样的使用方式,实际上gearmand监听着两个端,原来的4730端还是能够接收正常的gearman协议client的请求,另外的8080port则监听着http协议的请求,两种方式共同工作,http服务前端如移动端调用,gearman服务内部的其他模块的调用。

时间: 2024-10-11 16:39:32

用HTTP方式调用gearman任务处理的相关文章

RTX——第19章 SVC 中断方式调用用户函数(后期补历程)

本章节为大家讲解如何采用 SVC 中断方式调用用户函数. 当用户将 RTX 任务设置为工作在非特权级模式时,任务中是不允许访问特权级寄存器的,这个时候使用 SVC 中断,此问题就迎刃而解了. SVC 功能介绍SVC 用于产生系统函数的调用请求.例如,操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数,让用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件.因此,当用户程序想要控制特定的硬件时,它就要产生一个 SVC 异常,然后操作系统提供的SVC

JavaScript中以构造函数的方式调用函数

转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明.函数表达式或者函数构造器(见以前的随笔)等方式来构造函数对象.函数构造器和其它函数的区别在与它们的调用方式不同. 要以构造函数的方式调用函数,只需要在调用时在函数名称前加new 关键字,比如:function whatsMyContext(){ return this; }; 调用:new what

Delphi编写DLL(以及静态和动态方式调用)

Delphi编写DLL(以及静态和动态方式调用) 作者/cadenza7 什么是DLL? DLL是Dynamic Link Library(动态链接库)的缩写形式.DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译.链接并与使用它们的进程分开存储的函数.DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容

SSIS使用OleDB和Ado.Net两种方式调用 存储过程

在使用"执行 SQL 任务"组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Name的0代表第一个参数,1代表第二个参数 当我们使用Ado.net 方式的时候,注意要设置IsQueryStoredProcedure为True Sqlstatement 填写存储过程的名字 而参数设置需要和存储过程的参数名字保持一致 就到这了,欢迎大家来补充解释... SSIS使用OleD

C#通过http post方式调用需要证书的webservice

前一段时间做花旗银行的项目,用到花旗的接口是websevice,由于很多原因直接在项目中引用webservice不成功,于是就用了http post方式请求,把请求信息(xml格式)组装之后发送到服务器,返回结果. 下面就把我当时做的方法分享,希望对大家有用. 1,首先在webconfig中配置需要的信息 注:RewardUrl为url地址中公用的部分,因为后面调用不同的接口,地址是不一样的,所以就抽出来单独定义了,CommonUrl为IP+端口号,因为这个地址有可能更换所以也单独定义了. <a

使用ajax和urlconnection方式调用webservice服务

<html> <head> <title>使用ajax方式调用webservice服务</title> <script> var xhr = new XMLHttpRequest(); function sendAjax(){ var url = "http://192.168.13.66:8080/hello";//webservice服务的地址 var requestBody = '<soapenv:Envelope

idhttp.post方式 调用datasnap rest 远程方法

idhttp.get方式调用,这种比较简单,大家都会.post方式网上却没有任何成功的代码,本人也是摸索了一个上午才搞定. 分享给大家. (1)post方式调用的远程方法,方法名必须加“update”前缀,不加行不?你试下啦. function TServerMethods1.updateecho(const value: String): String;beginResult := value;end; (2)客户端调用,参数必须是JSON格式的字符串. 客户端POST方式调用时,远程方法名必

Post方式调用wcf服务

我们平常在PC端调用WCF服务,只要知道WCF服务的地址,客户端直接添加引用服务就可以使用了,殊不知还有其他方式,其实,我们也可以 通过HTTP POST的方式调用WCF服务,这样就不用添加引用了,在手机移动端开发后台服务,都是通过Post的形式调用WCF服务,当然,这种方式在PC也可以使用. 我们来看下面的一个简单示例.下面的示例演示了服务器端和客户端的简单通讯 服务器端返回一个JSON字符串,代码如下 契约定义 [csharp] view plaincopy [OperationContra

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的. 为实现上述要求,本文介绍如下可供选择的三种方式.   1.