关于worker的busy问题

NickBai

我用gatewayworker做了一个客服系统,但是在使用中,经常会遇到 无法连接的问题。于是通过手册介绍的方法进行了调试。

图片
发现有一个 进程是busy,而此时连接正好被分配到了这个worker,就出现了无法连接。

图片
继续排查,发现 是卡在了 等待fd为11的描述事件。然后能看到是发送一个原子的 cas命令

图片
再继续发现,fd为11的是 监听端口 2207的 globaldata服务。为了保证对进程之间的数据的一致性,我采用了globaldata组件,并且为了保证操作的唯一性,我用了cas 操作。根据手册的写法

do
{
    $old_value = $new_value = $global->user_list;
    $new_value[] = 4;
}
while(!$global->cas('user_list', $old_value, $new_value));

像这样,写在一个死循环中的,这样如果 globaldata没有响应的话,会一值卡死在这。
到底该怎么解决这个问题呢?还望 walkor老大,不吝赐教!十分感谢!

阅读 2054
2个回答

walkor

看起来像是 $global->user_list 不存在导致的

  • 暂无评论
walkor

globalData 发布了1.0.3版本,
cas在key不存在的情况下返回成功,请重新下载globalData试下