2012-05-03 1 views
1

Допустим, у меня есть 100 серверов, каждый из которых запускает демон - позволяет называть его server - этот сервер отвечает за размножение потока для каждого пользователя этой конкретной службы (скажем, 1000 потоков на сервер). Каждые N секунд каждая нить делает что-то и получает информацию для этого конкретного пользователя (эта модель запроса/ответа не может быть изменена). Проблема у меня есть иногда зависает и останавливается что-то. Мне нужно каким-то образом узнать, что данные пользователей устарели, и их необходимо обновить.Модель распределенного сервера

Единственная идея, у меня есть каждая 5N секунды есть нить обновить запись MySQL, связанную с этим пользователем (а last_scanned столбца в таблице пользователей), и другой процесс, который проверяет, что таблица каждые 15N секунд, если last_scanned колонка не текущий, перезапустите поток.

+0

Когда поток перестает что-то делать, это ожидаемое поведение или из-за ошибки? – Jordan

+0

Из-за ошибки - я должен указать, что зависает нить (и да, я также должен исправить ошибку, так что это не произойдет в первую очередь, но давайте проигнорировать это) – v0idless

ответ

1

Общий способ справиться с этим состоит в том, чтобы потоки сообщали о своем статусе обратно на серверный демон. Если вы не видели обновления состояния за последние 5N секунд, вы убиваете поток и начинаете другое.

Вы можете отслеживать текущие активные потоки, которые вы развернули в списке, а затем просто прокручивать их, чтобы определить состояние.

Вы, конечно же, должны также исправить ошибки в своей программе, которые вызывают потоки преждевременно.

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

+0

Это, безусловно, лучший модем, но что бы произойдет, если демон сервера умер (отключение питания, отказ оборудования и т. д.)? Я все еще чувствую, что должно быть какое-то постоянное хранилище, поэтому, если демон сервера погибнет, он либо узнает пользователей, на которых он держался, либо пользователей, которые должны быть отсканированы. – v0idless

+0

Я предположил, что у вас уже есть какое-то постоянное хранилище для выполнения этой работы. Обычно люди будут использовать очередь для такого рода вещей. Для этого вы можете проверить RabbitMQ. – Jordan