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}
````
[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)。