我正在使用gearman对各种不同的作业进行排队,其中一些可以立即得到服务,一些可以“失败”,因为它们需要不可靠的外部服务。 (例如,发送电子邮件可能需要经常不可用的SMTP服务器。)
如果外部服务出现故障,我希望将所有需要该服务的作业保留在队列中,并偶尔重试一项作业(比如每隔几分钟),直到服务再次可用。 (如果服务几小时没有提供,也许可以选择发送电子邮件。)
但是,我希望尽快将不需要失败服务的工作传递给员工。怎么能实现这一目标? (如果有必要,我很乐意在工人中加入一些逻辑,尽管在工人方面似乎有点“迟到”。)
答案 0 :(得分:2)
Gearman应该已经处理好了。只要你有一些专门处理具有不可靠依赖性并且不处理其他工作的工作的工人,以及一些完成所有工作的工人,或者只是没有不可靠依赖性的工作。
所有你需要做的就是为不可靠的依赖工作者添加一些代码,这样他们只有在检查了从属服务正在运行的情况下才接受作业,如果服务已关闭,那么只需让他们稍稍等待并重新测试服务(并且无限期地继续),一旦服务到了,然后让他们加入gearmand服务器,做好工作,返回工作,重新测试服务等等。
当依赖服务关闭时,不处理需要该服务的作业的工作人员将继续在其他作业的作业队列中滚动。如果有工作人员可以处理其他工作类型,Gearmand将不会阻止一个作业类型上的整个作业队列(或工作人员)。
关键是要明确你如何定义你的工作类型和工人。
编辑 -
啊哈,我知道我的想法有点过了,(我大约一年前写过我的齿轮系统并且从那时起就没有真正触及它)。我对此类问题的解决方案是,一旦通过依赖服务检测到故障,让所有通常处理依赖作业的工作人员使用gearmand服务器取消注册其依赖作业处理能力。 (并且当前正在尝试完成该工作的任何工作人员都应该返回失败。)一旦服务进行备份 - 让那些相同的工作人员重新注册他们处理该工作的能力。请注意,这确实需要另一个通信渠道,以便工人了解相关服务的状态。
希望这有帮助