Gearmand异步处理就安全了吗?不!
这篇讲的是一个实际生产中遇到的Gearman异步处理陷阱。当团队使用Gearman作为中间件时,发现Gearmand进程会莫名卡住,将PHP请求长时间“Hold”住,即便设置了超时也无效,这对PHP的同步工作模式风险很高。 问题最终被定位到使用Gearman的 `addFunction` 注册任务时,如果指定了 `timeout` 参数,便可能随机复现。通过 `pstack` 工具观察发现,故障时Gearmand的工作线程数量会减少。文章通过分析版本变更与源码指出,从0.33版本起增加的Worker超时处理特性,在底层依赖的libevent 1.4.x(非线程安全)环境下,导致了 `event_base` 对象被跨线程错误操作,从而使得工作线程的事件循环意外退出。 解决方案是从源码层面修正这一问题,例如将发生跨线程调用的 `event_base_set` 方法中的操作对象进行调整。作者最终建议,通过将 `addFunction` 的 `timeout` 参数临时设为0,可以规避此问题。这篇分享对使用Gearman或类似基于libevent组件的团队有很高的参考价值,尤其是在排查无响应卡顿问题时。