Есть сервер, который иногда дает данные клиентам. Клиенты эти данные обрабатывают как-то и им нужно брать новые. При этом, сервер должен правильно распределять нагрузку, чтобы все клиенты закончили обработку в одно и то же время. Как лучше сделать: чтобы клиенты сами запрашивали данные или чтобы сервер их спрашивал?
29.08.05 07:55: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Здравствуйте, Аноним, Вы писали:
А>Есть сервер, который иногда дает данные клиентам. Клиенты эти данные обрабатывают как-то и им нужно брать новые. При этом, сервер должен правильно распределять нагрузку, чтобы все клиенты закончили обработку в одно и то же время. Как лучше сделать: чтобы клиенты сами запрашивали данные или чтобы сервер их спрашивал?
Пусть клиенты сообщают серверу о комплите обработки, а затем соят и ждут пока он ид не дас данных, а он им не даст их пока все обработку не закончат.
Но помоему тут какието бока. Надо лучше описывать проблему, КЫВТовци не медиумы мыслей не читают.
Re[2]: Вопрос по проектированию
От:
Аноним
Дата:
25.08.05 16:22
Оценка:
Здравствуйте, LexKex, Вы писали:
LK>Здравствуйте, Аноним, Вы писали:
А>>Есть сервер, который иногда дает данные клиентам. Клиенты эти данные обрабатывают как-то и им нужно брать новые. При этом, сервер должен правильно распределять нагрузку, чтобы все клиенты закончили обработку в одно и то же время. Как лучше сделать: чтобы клиенты сами запрашивали данные или чтобы сервер их спрашивал?
LK>Пусть клиенты сообщают серверу о комплите обработки, а затем соят и ждут пока он ид не дас данных, а он им не даст их пока все обработку не закончат.
LK>Но помоему тут какието бока. Надо лучше описывать проблему, КЫВТовци не медиумы мыслей не читают.
Есть большое количество данных для обработки. Есть сервер, который рулит раздачей блоков, и есть клиенты, которые эти блоки обрабатывают. Один клиент за сеанс может обработать огромное количество блоков, т.е., сервер высылает одному клиенту блоки не один раз. В целях ускорения процесса необходимо, чтобы клиенты закончили обработку в итоге одновременно (обработку самых последних блоков, а не тех, которые возникают посредине процесса). Вот. Описал. Вопрос тот же
Так пусть скармливает по чуть-чуть блоков каждому. Клиент обработал свою порцию — стучится на сервер за следующей.
Загрузка будет равномерной. Система в интранете или как?
Здравствуйте, g_i, Вы писали:
g_i>Здравствуйте, Аноним, Вы писали:
g_i>Так пусть скармливает по чуть-чуть блоков каждому. Клиент обработал свою порцию — стучится на сервер за следующей. g_i>Загрузка будет равномерной. Система в интранете или как?
Согласен. В противном случае надо как-то оценить объем работ по каждому блоку, вычислительные мощности клиента (их много — скорее всего разные, плюс прочая загрузка), а это уже скорее всего неоправданные расходы на проектирование, разработку, отладку, тестировани и т.д.
Конечно, с этим подходом если блоки сильно разнятся по объему работы, то можно нарваться на то, что при наличии 2-х блоков, один из которых элементарный, а второй — огромный, обработка их 2-мя клиентами не закончится одновременно Но если блоки примерно одинаковые, их много, то они приблизительно равномерно и обработаются.
Если надо, то можно внести некую дополнительную эвристику. Например, можно ввести некую метрику объема работы, которую вычисляет сервер (например, размер сообщения), и вести статистику производительности клиента с каналами связи, то есть запоминаем, когда кому какой объем работы отдали, а по следующему обращению (или сообщению об окончании работы — это уж как сделаешь) посчитать пропускную способность клиента и в дальнейшем ее учитывать. Но это, конечно, усложнение дизайна, скорее всего, как я уже говорил, неоправданное.
А вообще, требование по одновременному завершению обработки на клиентах выглядит несколько.. странным что-ли: > При этом, сервер должен правильно распределять нагрузку, чтобы все клиенты закончили обработку в одно и то же время.
Наверное, имеется в виду: "Cервер должен правильно /равномерно/ распределять нагрузку *ТОЧКА*"?
Здравствуйте, <Аноним>, Вы писали:
А>Есть сервер, который иногда дает данные клиентам. Клиенты эти данные обрабатывают как-то и им нужно брать новые. При этом, сервер должен правильно распределять нагрузку, чтобы все клиенты закончили обработку в одно и то же время. Как лучше сделать: чтобы клиенты сами запрашивали данные или чтобы сервер их спрашивал?
Недавно реализовал похожую систему на сокетах. Пришёл к выводу, что однозначно удобнее, кодгда состояние соединения клиента с сервером хранится за клиентом. Тогда сервер получается на порядок более простым. Соответственно, лучше, чтобы клиенты сами запрашивали данные, когда очередная порция обработана.
То есть примерно так:
клиент запрашивает данные
сервер высылает необработанные данные и их id
клиент обрабатывает данные
клиент отправляет серверу запрос "посчитал данные с таким-то id, принимай результаты"
клиент запрашивает данные
...
В этом случае сервер лишь отвечает на запросы клиентов и легче использовать разные асинхронные схемы, типа IO Completion Port.
При такой схеме также удобно отслеживать обрывы и зависания клиентов. Достаточно завести за данными время последней отправки. Если при выборе очередного задания для очередного клиента все задания уже в работе, то ему можно отправить задание которые ещё не выполнено, но было отправлено раньше остальных и у него привышен лимит времени ожидания.
Это задачка по оптимизации производственного цикла. Берем учебник по управлению производством и читаем
То, что здесь описали, в производственном менеджменте называется "выталкивающий" и "вытягивающий" процесс снабжения комплектующими и материалами производственных цехов в попередельном производстве.