Web挂钩任务队列服务。

ntorque的Python项目详细描述



ntorque-web hook任务队列

[ntorque][]是一个使用[web hook][]的[任务](http://www.celeryproject.org)
[队列](https://github.com/resque/resque)服务。
它是免费的,开放源代码软件[发布到公共域][]可以从任何编程语言(讲http)使用它来排队并可靠地执行等幂任务。例如,在python中:

``python
import os
import requests


params={url':'http://example.com/myhooks/send嫒email'}
data={user嫒id':1234}

response=requests.post(endpoint,data=data,params=params)
````

[ntorque]:http://ntorque.com
[web hooks]:http://timothyfitz.com/2009/02/09/what webhooks are and why you should care/
[released into public domain]:http://unlicense.org/unlicense


解决方案当您需要比
火和忘记,但您不需要一个[ampq][/[esb][]大锤来破解
您的"以后做这个"螺母。


因为它使用网络挂钩,您可以:

1。从用任何语言编写的应用程序中使用它(并集成它)。使用dns/web服务器负载平衡来分配任务
1。引导任务执行环境的方式与引导web应用程序的方式相同,即:在启动时启动一次,重新使用web应用程序的配置
和中间件

[ampq]:http://www.rabbitmq.com
[esb]:http://en.wikipedia.org/wiki/enterprise嫒service嫒bus



post/`将任务排队
*`get/tasks/:id`查看任务状态


和以下功能:

*持久任务存储
*非阻塞,并发任务执行
*https和重定向支持
*configurable(线性或指数)backoff



它们使用[PostgreSQL][]数据库来持久化任务,并使用
[redis][]数据库作为通知通道。

<;pre>;<;code>;+------+ | +--------+ +--------+ +--------+ |
|POST /| |Frontend| |Web app | |Postgres|
|------| | |--------| |--------| |--------| |
|- url |+- ->|- auth |+-->|- store |+-->|- tasks |
|- data| | |- rate | |- notify| | | |
|||限制
+——+——+——————————————————————————————————————————————————————————————————————————————————————————————————||||
v+v
||——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————使用状态代码:

*200或201:任务标记为已成功完成
*202-499:任务标记为失败且未重试
*500(或网络错误):如果您希望使用其他策略,则重试该任务

[hack here][]。

[hack here]:https://github.com/thruflo/ntorque/blob/master/src/ntorque/work/perform.py l133


a)指定适当的默认超时,b)根据每个任务的需要覆盖该超时。


与[rq][]和[resque][]一样,ntorque使用redis作为推送消息通道。一个
请求进入,一个通知被"rpush"到一个通道上,然后"blpop"关闭。
这意味着任务被立即执行,具有良好的事件/推送
通知模式。

与[rq][]和[resque][]不同,ntorque不信任redis作为持久层。
它依赖于老式的postgresql:当一个新任务到达时,ntorque首先要做的是将其写入磁盘。然后它使用redis[blpop][]通知消费者进程
。消费者然后从磁盘读取数据,并通过对其url发出http请求来执行任务。

但是,这种情况不会每次都发生,例如:当
出现网络错误或webhook服务器暂时关闭时。由于存在web钩子响应不可靠的边缘案例失败场景,ntorque拒绝将其作为任务状态的真实性和交易来源。相反,
唯一的真相来源是postgresql数据库。

具体来说,读取任务数据的查询是在一个事务中执行的,该事务还更新任务的到期日期并重试
计数。这意味着在任何失败的情况下,ntorque总是可以重新启动
(只要它连接到同一个数据库,就有可能在新服务器上重新启动),并且您可以确保任务至少执行一次,无论它们在管道中的什么位置,当它发生故障时。

retried由一个后台进程接收,该进程每隔"ntorque_requeue_interval"秒轮询一次数据库。


更重要的是,在这个描述的标题中,是任务的到期日之间的关系
,非常好地在respose中,以及web钩子调用的
超时。因为有一件事我们不想做,那就是在任务有机会完成之前不断地重试。


为了防止这种行为,我们施加了一个简单的约束:

>;**在事务性读取和递增任务时设置的到期日期必须
长于web钩子超时时间。**

这意味着,在最坏的情况下(当web钩子请求超时或
响应失败时),在重试任务
之前,必须等待整个超时时间。因此,虽然您可能很自然地希望为长时间运行的任务设置相对较高的超时
,但对于像
发送新用户的欢迎信或重置密码电子邮件这样的简单任务,您可能希望将其保持较短的超时时间,以便更快地重试这些任务。

除了全局"ntorque_default_timeout"配置变量之外,您可以使用[`timeout`查询参数](usage api/post)为不同的任务设置适当的超时。


simple——一旦您知道系统是如何工作的。

[blpop]:http://redis.io/commands/blpop
[gevent]:http://www.gevent.org
[postgresql]:http://www.postgresql.org
[redis]:http://redis.io
[resque]:https://github.com/resque/resque
[rq]:http://python rq.org/



如有必要,创建数据库:

createdb-t template0-e utf8 ntorque

使用:

bundle install

/>
foreman运行python alembic/scripts/create_application.py——命名您的应用程序

或者推到heroku,运行
迁移,它应该可以正常工作。



默认值
到"7"
*`ntorque_default_timeout`:多长时间,以秒为单位,若要在将web
挂接请求视为失败之前等待--默认值为"60",请参见上面的算法部分
了解详细信息
*`ntorque min\u due\u delay`:重试前的最小延迟--不要设置任何低于'2`
*`ntorque max\u due\u delay`:最大重试延迟--默认值到"7200",但您应确保它的长度大于"ntorque_default廑timeout"
*"ntorque廑u max廑retries":放弃任务前尝试了多少次--默认值
到"36"
*"ntorque廑requeue廑interval":轮询数据库以查找要重新排队的任务的频率(秒)-默认值to 5
*`ntorque_transient_request_errors`:ntorque应该重试的4xx个错误--默认为"40842342449"


>部署:

*`ntorque_authenticate`:是否需要身份验证;默认为"true"
--请参阅下面使用中的"身份验证"部分
*"nTorque_enable_hsts":如果使用的是[hsts][]
*"hsts_protocol_header":请将此设置为,例如:`x-forwarded-proto`如果您在https代理前端后面运行
(有关详细信息,请参见[pyramid-hsts][])
*`mode`:如果设置为'development',则在监视模式下运行[gunicorn][](因此当python文件更改时,应用程序
服务器将重新启动),并在
api视图(而不是返回它们)。如果设置为"production",它将在[newrelic][]客户端后面运行gunicorn
。如果这不是您想要的,那么要么不设置它,要么将它设置为任何其他字符串(或者破解"run.sh"和/或"gunicorn.py"脚本)


redis:

*"ntorque_redis_channel":用作通知通道的redis列表的名称;
默认为"ntorque"
*"redis-url"等:有关如何配置
redis连接的详细信息,请参见[金字塔redis][],数据库:

*"database-url",默认为"postgresql:///ntorque"
*"sqlalchemy-max-overflow","sqlalchemy-pool-class","sqlalchemy-pool-size"`以及
`sqlalchemy_pool_recycle`--有关详细信息,请参阅[engine configuration][]
和[pyramid_basemodel][]上的sqlalchemy文档;如果不提供这些
,那么sqlalchemy将使用合理的默认值,还要注意,如果您使用的是
[pgbouncer][],则应设置"sqlalchemy_pool_class=sqlalchemy.pool.nullpool`

[engine configuration]:http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html
[gunicorn]:http://gunicorn.org
[hsts]:http://en.wikipedia.org/wiki/http_strict_transport_security
[newrelic]:https://addons.heroku.com/newrelic
[pgbouncer]:https://wiki.postgresql.org/wiki/pgbouncer
[金字塔基础模型]:https://github.com/thruflo/金字塔基础模型
[金字塔基础模型]:https://github.com/thruflo/pyramid廑hsts
[pyramid廑redis]:https://github.com/thruflo/pyramid廑redis

` alembic/scripts/create_application.py`script)和
在任务排队时在"ntorque_api_key"头中提供其api键。


参数;这是要ntorq的web钩子的urlue
调用以执行任务

**可选**:

*a`method`查询参数;调用webhook时使用的http方法--
默认值为post,但您也可以指定delete、put或patch。
*a`timeout`查询参数;以秒为单位的时间长度,要在将
web hook调用视为超时之前等待,请参见上面的算法部分,了解上下文

**数据**:


这一点,您可以传递任何post数据,编码为您喜欢的任何内容类型。数据、内容类型和字符编码将在post
(或delete、put或patch)请求中传递给您的web hook。

**头**:

web钩子,在头名前面加上前缀"ntorque-passthrough-"。例如,要通过
a`foo:bar`header,您可以在
请求头中提供"ntorque-passthrough-foo:bar"。


**响应**:

任务。

你不应该经常用这个。它被公开为[Hybrid][]集成的优化。

[Hybrid]:https://github.com/thruflo/ntorque/blob/master/src/ntorque/client.py l141




ntorque是一个可靠调用web钩子任务处理程序的系统:不用于实现它们。您负责实现和公开自己的
web挂钩。在大多数语言和框架中,这很简单,例如:在ruby中使用[sinatra][]:

``ruby
post'/hooks/foo'do
#这里的代码需要记住的关键是:

[sinatra]:http://www.sinatrarb.com
[flask]:http://flask.pocoo.org


您的web钩子将返回一个http响应,状态代码为"200"或"201"。否则,ntorque将继续
重试该任务。


如果没有,则在实际成功执行任务时可能会出现错误。以[apache][]作为代理进行30分钟超时:

`` text
超时1800
proxymeout 1800
````

或使用[nginx][]:

`` text
发送超时1800;
代理发送超时1800;
```

[apache]:http://httpd.apache.org
[nginx]:http://nginx.org

例如:使用http s和认证凭证,比如api密钥。

/GitHub上的问题](https://github.com/thruflo/ntorque/issues)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在Spring工具套件中找到Spring版本?   是否有API将vSphere JSON结果映射到适当的Java对象?   java在spring WebSocket中有请求作用域吗?(websocket scop==会话范围)   java我想从list1中删除list2元素并返回list1   java使用JPA/Hibernate为单个集合使用多个@Where   JSF2.0中混合Ajax和完整请求的java   java变量miles可能尚未初始化   java使用文件路径StringArray构建父子数组   java数据源在struts中不起作用   java从另一个类访问txtField值   具有相同主键和外键双向关系的java Hibernate实体OneToOne   java Android广播接收器:上下文问题   java我可以将实体指定为数据存储属性以实现类似joinlike的功能吗?   java如何排除hadoop核心依赖项   java是否可以确定用户是否实时单击了任何通知(不仅仅是来自我的应用程序)?   java在单独的类中访问私有变量?   java如何使用Spring@Value注入映射