Intereting Posts
как отправлять электронные письма по нескольким адресам с помощью phpmailer Может ли soundex использоваться на части столбца в mysql? Триггер событий в javascript и условном теге PHP: Я смешиваю программирование, управляемое событиями, с сигнальными интерфейсами (сигналом и слотом / шаблоном наблюдателя)? Drupal 6: значения form_state пустые на submit PHP: настройка изображения по сезону? Как я могу получить доступ к конфигурации приложения Zend Framework с контроллера? Могу ли я щелкнуть, чтобы перейти к методу / объекту в Sublime Text, как я могу в NetBeans Активный токен доступа должен использоваться для запроса информации о текущем пользователе и OAuthException => 2500 Как удалить запись mysql с помощью jquery Как разделить файлы yaml валидации в Symfony 2.5? PHP меняет старый mysql_query на PDO Убедитесь, что массив пуст Запись файла .htaccess с php для обновления AJAX с помощью URL-адресов Сообщение об ошибке Amazon

Gearman PHP Extension: Dead Job Server = медленный отклик со стороны всех рабочих

Я начал с этого вопроса: Gearman: 3 секунды между запросом клиента и получателем. Это нормально?

Окружающая среда:

  • Рабочий стол Ubuntu 12.04
  • PHP 5.3.10
  • Gearman (libgearman 1.1.5 с расширением PHP 1.1.1)
  • Несколько серверов в локальной сети

Я не мог получить время отклика рабочего времени менее 3 секунд, и я не мог понять, почему. Я сузил его до класса обертки, который я построил. Затем я сузил его до определенного метода внутри класса. Короче говоря, настоящая проблема заключается в методе addServer для GearmanWorker в расширении PHP.

Мой класс-оболочка пытался подключиться к 3 серверам Job Gearman. На самом деле работают только 2. Когда я пытаюсь подключиться ко всем 3, я получаю предупреждение о том, что третий не сможет подключиться. Я также получаю рабочее время отклика 3 сек. Когда я удаляю попытку addServer на текущем сервере заданий вниз, тогда voila время ответа рабочего составляет около 0,003 секунды.

Теперь вы можете спросить, почему бы вам просто не удалить сервер из списка серверов для подключения? Ну, сначала это не всегда будет вниз. Во-вторых, что происходит, когда один из серверов, которые в настоящее время поднялись или был на 5 минут назад, больше не работает? Теперь все рабочие места занимают минимум 3 секунды. Теперь я полагаю, что, вероятно, есть способ настроить этот тайм-аут до 1 секунды, но лучшее решение IMO – это способ удалить мертвый сервер из списка серверов, на которых рабочий пытается получить задания.

В моем исследовании есть метод addServer. И есть метод addFunction. Затем существует метод отмены регистрации для удаления рабочей функции из списка для данного работника. Однако я не вижу метода removeServer.

Итак, есть ли способ отбросить список серверов заданий в GearmanWorker или мне нужно убить объект, повторно создать его и повторно подключиться к новому, отбракованному списку доступных серверов заданий? Убийство и перезапуск GearmanWorker кажется далеким от идеала.

Каков наилучший способ сканирования (и подключения) всех активных серверов заданий, избегая тайм-аута, присущего серверу заданий, который умер?

благодаря

Поэтому, в конечном итоге, кажется, что я не единственная проблема с этой проблемой. Никто из групп Google для Gearman не мог указать на решение. Поэтому в конечном итоге я написал свой собственный код (взяв кусочки из Gearman Monitor), чтобы определить, какие серверы работы были запущены и которые не были.

try { $cxn = @fsockopen($ip, $gHosts->ports[$host], $errCode, $errMsg, $timeout); /* Using the new \Net_Gearman_Manager on a dead job server kept leading to * fatal error which was uncaught. Thus crashing the script and leading * no update of the server status */ //$gearmanManager = new \Net_Gearman_Manager($ip . ':' . $gHosts->ports[$host], 1); if ($cxn === FALSE) { write_log($fLog, 'Connection FAILED'); $output[$host] = FAILURE; } else { write_log($fLog, 'Connection Succeeded'); $output[$host] = SUCCESS; } } catch (Net_Gearman_Exception $e) { write_log($fLog, $e->getMessage()); $output[$host] = FAILURE; } catch (Exception $e) { write_log($fLog, $e->getMessage()); $output[$host] = FAILURE; } // if (@$wrkr->addServer($ip, $gHosts->ports[$host])) 

Класс $ gHosts – это класс конфигурации, который содержит IP-адреса и порты для каждого из моих потенциальных серверов заданий Gearman. Я прокручиваю каждый потенциальный сервер заданий в $ gHosts и тестирую его.

Затем я пишу вывод из него в memcache и текстовый файл. Только memcache работал нормально, пока я не начал действительно загружать машину. Затем соединение memcache будет многократно терпеть неудачу. Теперь я использую текстовый файл в качестве резервной копии, и проблемы исчезли.

Я сохраняю последнюю попытку подключения к каждому серверу заданий Gearman в массиве, где ключ является именем сервера, а значение – меткой времени последней попытки. Если попытка была успешной, метка времени будет положительной. Если попытка не удалась, метка времени отрицательная. Временные метки позволяют мне определить, являются ли данные устаревшими или свежими.

Затем в сценариях, использующих Gearman, у меня есть класс оболочки Client и Worker вокруг классов расширения PHP. Они обрабатывают обновления соединений по времени, который я хочу автоматически. Таким образом, серверы Gearman Job Servers, которые перестают реагировать на остановку, и скрипт, хотя и потенциально медленный в течение короткого периода времени, обычно выполняется довольно быстро.

Надеюсь, это поможет кому-то там.