Gearman和重试具有不可靠外部依赖的工人



我使用gearman对各种不同的作业进行排队,其中一些作业总是可以立即得到服务,而另一些则可能"失败",因为它们需要不可靠的外部服务。(例如,发送电子邮件可能需要一个经常不可用的SMTP服务器。)

如果一个外部服务宕机,我希望所有需要该服务的作业都保持在队列中,并偶尔(比如每隔几分钟)重试一个作业,直到该服务再次可用。(如果服务数小时不可用,可以选择发送电子邮件。)

然而,我希望工作不需要一个失败的服务被传递给工人尽快。如何才能做到这一点?(如果有必要的话,我很乐意把一些逻辑放在工人中,尽管在工人端节流似乎有点"晚了"。)

Gearman应该已经处理好了。只要你有一些工人专门处理具有不可靠依赖关系的工作,而不处理其他工作,还有一些工人要么做所有工作,要么只做没有不可靠依赖关系的工作。

你所需要做的就是为不可靠的依赖worker添加一些代码,这样它们就只接受那些检查了依赖服务正在运行的工作,如果服务关闭了,那么就让它们等一会儿,重新测试服务(并无限地继续),一旦服务启动了,然后让它们加入设备服务器,做作业,返回工作,重新测试服务,等等。

当依赖服务关闭时,不处理需要该服务的作业的worker将继续在作业队列中处理其他作业。如果有工人可以处理其他类型的作业,那么Gearmand不会阻塞一个作业队列(或工人)的整个作业队列。

关键是要明智地定义你的工作类型和员工。

编辑,

啊哈,我知道我的想法有点过时了,(我大约一年前写了我的gearman系统,从那以后就再也没有碰过它)。我对这类问题的解决方案是,一旦检测到依赖服务出现故障,就让通常处理依赖作业的所有worker向gearand服务器注销它们的依赖作业处理能力。(并且任何当前试图完成该任务的工人都应该返回失败。)一旦服务备份,让这些工人重新注册他们处理这项工作的能力。请注意,这确实需要另一个通信通道,以便将依赖服务的状态通知给工人。

希望能有所帮助

相关内容

  • 没有找到相关文章

最新更新