Я бы не стал отслеживать эту статистику слишком сильно на уровне сервера. Вы собираетесь ввести изрядную сумму накладных расходов.
Вместо этого сервер управления должен просто вести список рабочих единиц. Когда клиент станет доступным, пусть он захватит следующий блок в строке и обработает его. Промыть, повторить.
Как только список рабочих единиц для данной матрицы исчерпан, разрешите переназначить незавершенные в настоящее время рабочие единицы.
Примеры основаны на матрице, содержащей 10 рабочих единиц и 5 серверов.
одинаково быстро, все доступно:
Сервер 1 регистрируется и захватывает блок 1. Это продолжается для следующих 4 машин (то есть: Сервер 2 получает блок 2 ...)
Когда блок 1 завершен, сервер 1 затем захватывает блок 6. Остальные захватывают остальное. Как только последний сервер регистрируется, матрица готова.
Низкая Раздельная производительность, все доступно:
Вы снова запускаете круговой прием, и первые 5 юнитов приобретаются серверами. Однако сервер 1 занимает на 30% больше времени, чем остальные. Это означает, что сервер 2 захватит блок 6. и т. Д. В какой-то момент сервер 1 проверит блок 1, в то время как блоки 2–5 будут завершены, и 6–10 будут назначены. Серверу 1 назначен блок 6, поскольку это еще не сделано. Однако Сервер 2 проверит свою завершенную работу до того, как Сервер 1 завершит свою работу. Ничего страшного, просто выбросьте этот последний результат.
Огромное отдельное исполнение, все в наличии
Вы снова запускаете круговой прием, и первые 5 юнитов приобретаются серверами. Допустим, сервер 1 занимает на 400% больше времени, чем остальные. Это означает, что сервер 2 захватит блок 6 и т. Д. После того, как сервер 2 проверит блок 6, он увидит, что блок № 1 все еще работает. Идем дальше и назначаем его на сервер 2; который завершит его до того, как сервер 1 вернется.
В этом случае вам, вероятно, следует следить за теми машинами, которые последовательно сообщают о поздних работах, и отбрасывать их из дальнейшего рассмотрения. Конечно, вам придется сделать некоторые скидки для тех, кто отключается из-за выключения или личного использования. Вероятно, какой-то тип взвешенного рейтинга, где, когда он падает ниже определенного порога, вы просто отказываете в дальнейшей работе; возможно, рейтинг периодически сбрасывается, чтобы позволить равновесию из устойчивого состояния, которому он будет соответствовать.
Машина исчезает
Это имеет тот же план, что и «Огромное отдельное представление», указанное выше. Единственное отличие состоит в том, что машина либо никогда не сообщит, либо сделает это через некоторое неизвестное время.
Если по какой-то причине у вас больше машин, чем юнитов, происходит интересная вещь: нескольким серверам сразу же будет назначено одно и то же рабочее место. Вы можете либо остановить это, установив некоторую задержку (например, юнит должен работать в течение x минут, прежде чем разрешить его переназначение), либо просто позволить этому произойти. Это следует продумать.
Что мы сделали? Во-первых, мы избавились от необходимости отслеживать индивидуальные показатели. Во-вторых, мы позволили машинам просто исчезать, следя за тем, чтобы работа все еще была завершена. В-третьих, мы позаботились о том, чтобы работа была завершена в кратчайшие сроки.
Это немного болтливее, чем просто назначать блоки из нескольких блоков компьютерам в зависимости от производительности; однако это позволяет даже быстрым компьютерам отключаться от сети, обеспечивая при этом полное восстановление. Черт возьми, вы можете убить все машины, а затем включить некоторые из них, чтобы забрать, где вы остановились.