C : идея распределенной обработки клиент-сервер, закрыть соединение после отправки данных, снова открыться по завершении задачи?

#c #network-programming #client-server #cloud #distributed-computing

#c #сетевое программирование #клиент-сервер #облако #распределенные вычисления

Вопрос:

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

* Обратите внимание, я использую библиотеку boost, хотя я еще не запустил ни одного клиент-серверного кода.

Я думаю, что хочу открыть TCP-соединение от клиента к серверу, сказав «эй, я кое-что сделаю для тебя», сервер отправляет задачу и данные для этой задачи во время этого соединения, затем закрывает это соединение, чтобы на сервере не было тонны открытых потоков сокетов. Когда клиент завершит обработку, он повторно подключится к серверу и отправит завершенные данные (снова закроет соединение, если больше никаких задач выполнять не нужно).

Хорошая ли это идея? Каков наилучший способ сделать это?

Возможно, что серверу потребуется управлять до 256 клиентами (самый большой случай).

Комментарии:

1. 256 клиентов на самом деле не так уж много… Из вашего описания у меня создается впечатление, что вы планируете иметь 1 поток на клиентское соединение. Это верно?

2. Ну, это то, чего я пытаюсь избежать. Потому что такое количество одновременных потоков может стать интенсивным на небольшой машине? idk. Я не совсем уверен, много ли 256 потоков или нет… но я чувствую, что > 10 потоков — это много. Просто пытаюсь быть оптимальным.

3. Обычно я использовал некоторый пул рабочих потоков для обработки соединений, чтения / записи в них по мере поступления данных и использования ‘select’ (не уверен, что такое эквивалент boost) для проверки, когда сокеты готовы выполнить некоторую работу

Ответ №1:

Вы смотрели сервис Amazon MapReduce? Он создан именно для такого рода вещей.

http://aws.amazon.com/elasticmapreduce/

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

РЕДАКТИРОВАТЬ: Если вам нужно открытое решение, я предлагаю взглянуть на Apache Hadoop и его предложение MapReduce. Кроме того, вы можете использовать OpenStack для размещения собственной облачной инфраструктуры, если это кажется выгодным для вашего приложения.

http://www.openstack.org/

Комментарии:

1. Это здорово. Однако это стоит денег. Проект, над которым я работаю, не финансируется, так что на самом деле это не вариант. На данный момент у нас есть примерно .. 4 компьютера для работы. Однако, если проект станет достаточно большим, это, безусловно, может быть вариантом. Что я мог бы сделать, это что-то похожее на сворачивание @home, где люди просто устанавливают что-то, и оно запускается, когда система простаивает.

2. К вашему сведению — Добавлена дополнительная информация о бесплатных альтернативах.

3. Мне нравится решение openstack, 1

Ответ №2:

Я бы предложил в качестве опции изучить программное обеспечение BOINC с открытым исходным кодом, разработанное именно с учетом этого. Это предполагает, что задаче не нужно будет взаимодействовать с другими клиентами, только с сервером

Это программное обеспечение, используемое seti@home, einstein@home, folding@home и почти всем @home!