有人可以指导我 gearman 在出现异常时如何重试吗
抛出或发生错误时?
我在 Django 应用程序中使用 python gearman 客户端,我的工作人员是
作为 Django 命令启动。我从中读到博客文章 http://www.hermanradtke.com/blog/retrying-failed-gearman-jobs/重试
从错误条件来看并不简单,它需要
sys.exit 从工作端。
是否已修复此问题以使用 sendFail 或 sendException 重试?
gearman 还支持使用指数算法重试 – 比如说
SMTP 失败是否会在 2、4、8、16 秒等后重试?
据我了解,Gearman 采用了一种非常“这不关我的事”的方法 - 例如,它不会干预正在执行的工作,除非工人崩溃。任何成功/失败消息都应该由客户端处理,而不是 Gearman 服务器本身。
在前台工作中,这意味着所有sendFail()
/ sendException()
和别的send*()
定向到客户端,由客户端决定是否重试该作业。这是有道理的,因为有时您可能不需要重试。
在后台作业中,所有send*()
函数失去了意义,因为没有客户端会监听回调。结果,发送的消息将被 Gearman 忽略。重试作业的唯一条件是工作线程崩溃时(可以用exit(XX)
命令,在哪里XX
是一个非零值)。当然,这不是您想要做的事情,因为工作线程通常应该是长时间运行的进程,而不是在每个不成功的作业后都必须重新启动的进程。
就我个人而言,我通过扩展默认的 GearmanJob 类解决了这个问题,我在其中拦截对send*()
函数,然后自己实现重试机制。本质上,我将所有与重试相关的数据(最大重试次数、已重试次数)与工作负载一起传递,然后自己处理所有事情。这有点麻烦,但我理解为什么 Gearman 以这种方式工作 - 它只是允许您处理所有应用程序逻辑。
最后,关于以指数超时(或与此相关的任何超时)重试作业的能力。 Gearman 有一个功能可以添加延迟的作业(寻找SUBMIT_JOB_EPOCH
in the 协议文档 http://gearman.org/index.php?id=protocol),但我不确定它的状态 - PHP 扩展和我认为 Python 模块不支持它,并且文档说它可以在将来删除。但我知道它目前有效 - 您只需向 Gearman 提交原始套接字请求即可实现(指数部分也应该在您这边实现)。
然而,这篇博文 http://code.recollect.com/post/12792504787/queue-within-a-queue认为 SUBMIT_JOB_EPOCH 实现不能很好地扩展。他使用node.js 和setTimeout()
为了让它工作,我见过其他人使用 unix 实用程序at
做同样的事情。无论如何 - Gearman 不会为你做这件事。它将关注可靠性,但会让您专注于所有逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)