我目前正在评估Gearman在我们的后端部署一些昂贵的数据导入作业.到目前为止,这看起来很有希望然而,有一件丢失,我似乎无法找到任何信息.我怎样才能从Gearman获得一份时间表工作清单?
我意识到我可以使用管理协议来获取每个功能的当前排队作业的数量,但我需要有关实际作业的信息.还可以选择使用持久队列(例如MySQL)并查询数据库中的作业,但是我觉得绕过Gearman获取这类信息是非常错误的.除此之外,我没有想法.
可能我根本不需要这个:)所以这里有一些关于我想做什么的更多背景,我会全力以赴提出更好的建议.客户端和工作者都在PHP中运行.在我们的管理界面中,管理员可以触发客户端的新导入;因为导入需要一段时间才能作为后台任务启动.现在我想要回答的简单问题:这个客户端的最后一次导入运行是什么时候?导入是否已排队等候此客户端(在这种情况下,触发新导入应该没有效果)?很高兴:队列中的哪个位置是这个工作(所以我可以估计它何时运行)?
谢谢!
解决方法:
Admin协议是您通常使用的协议,但正如您所发现的,它不会列出队列中的实际任务.我们通过跟踪我们在应用程序层中启动的当前任务来解决这个问题,并在我们的工作人员中通过回调来告知应用程序何时完成任务.这允许我们在任务完成时执行清理,通知等,并允许我们将此逻辑保留在应用程序中而不是工作程序本身.
关于进度的最佳方法是使用Gearman本身的内置进度机制,在PHP模块中,您可以使用$job-> sendStatus(percentDone,100)来调用它.然后,客户端可以使用任务句柄从服务器检索此值(在启动作业时将返回该句柄).这将允许您在界面中向用户显示当前进度.
只要您的应用程序中有当前正在运行的任务,您就可以使用它来回答已经运行的类似任务,但您也可以使用gearman的内置作业合并/重复数据删除;添加任务时查看$unique参数.
当前队列中的位置将无法通过Gearman获得,因此您也必须在应用程序中执行此操作.我不想向Gearman持久层询问此信息.