2

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

如果外部服务出现故障,我想将所有需要该服务的作业保留在队列中,并偶尔(例如每隔几分钟)重试一项作业,直到该服务再次可用。(如果服务几个小时不可用,也许可以选择发送电子邮件。)

但是,我希望尽快将不需要失败服务的工作传递给工人。如何做到这一点?(如有必要,我很乐意将一些逻辑放入工人中,尽管在工人方面节流似乎有点“迟到”。)

4

1 回答 1

2

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

您需要做的就是为不可靠的依赖工作者添加一些代码,以便他们只接受检查依赖服务是否正在运行的工作,如果服务关闭,那么让他们稍等一下并重新测试服务(并继续ad infinitum),一旦服务启动,然后让他们加入 gearmand 服务器,做工作,返回工作,重新测试服务等。

当依赖服务关闭时,不处理需要该服务的作业的工作人员将继续在作业队列中寻找其他作业。如果有可用于处理其他工作类型的工作人员,Gearmand 不会在一种工作类型上阻止整个工作队列(或工作人员)。

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

编辑 -

啊哈,我知道我的想法有点出格,(大约一年前我写了我的齿轮系统,从那以后就没有真正接触过它)。我对此类问题的解决方案是,一旦检测到依赖服务发生故障,让所有通常处理依赖作业的工作人员向 gearmand 服务器取消注册其依赖作业处理能力。(并且当前正在尝试完成该工作的任何工作人员都应该返回失败。)一旦服务备份 - 让这些工作人员重新注册他们处理该工作的能力。请注意,这确实需要另一个通信渠道来通知工作人员相关服务的状态。

希望这可以帮助

于 2011-11-20T14:08:34.323 回答