Представьте себе следующий сценарий: допустим, у вас есть центральный компьютер, который генерирует много данных. Эти данные должны пройти некоторую обработку, которая, к сожалению, занимает больше времени, чем генерация. Чтобы обработка работала в режиме реального времени, мы подключаем больше подчиненных компьютеров.
Кроме того, мы должны учитывать возможность выпадения рабов из сети в середине работы, а также добавления дополнительных рабов. Центральный компьютер должен гарантировать, что все задания завершены, и что задания, отброшенные подчиненным, передаются другому.
Главный вопрос: какой подход я должен использовать для достижения этой цели?
Но, возможно, следующее поможет мне прийти к ответу: есть ли название или шаблон дизайна для того, что я пытаюсь сделать?
Какие области знаний мне нужны для достижения цели, чтобы заставить эти компьютеры общаться друг с другом? (например, будет ли достаточно базы данных, о которой я знаю, или это будет включать сокеты, о которых я еще не знаю?)
Есть ли примеры такой системы? Основной вопрос немного общий, поэтому было бы хорошо иметь отправную точку / контрольную точку.
Заметьте, я предполагаю ограничения c ++ и windows, поэтому решения, направленные в этом направлении, будут оценены.
Ответы:
Да. Этот паттерн известен как распределенные вычисления (или распределенное программирование, или любое другое крутое слово, которое вы хотите добавить после распределения). Мое предложение будет заключаться в том, чтобы не строить это собственными силами, прежде чем искать другие решения. Вы можете посмотреть на этот вопрос переполнения стека для различных вариантов. А потом принять взвешенное решение.
источник
Как отмечалось в других ответах, это поле известно как распределенные вычисления , грид-вычисления , кластерные вычисления и высокопроизводительные вычисления .
Позвольте мне добавить различие, которое заключается в том, что, когда система может быть изменена после запуска, чтобы соответствовать рабочей нагрузке, она называется « эластичной », и это отличается от традиционных вычислений в сетке. Это одна из (не связанных с маркетингом) причин для термина « облачные вычисления »: пользователю не нужно планировать емкость, а количество и расположение компьютеров, выполняющих вычисления, остаются для него как для облака бесполезными.
Кроме того, ваше требование о том, что мастер перепланирует неудавшиеся задачи, называется свойством « отказоустойчивости » этой системы. (Обязательная ссылка на этот мультфильм )
Какой подход вы должны использовать для создания собственного частного облака? В моем заказе или предпочтении:
Не создавайте свое собственное облако , используйте инфраструктуру, предоставленную другими. Amazon называет это виртуальным частным облаком , а Rackspace - просто частным облаком ; Я уверен, что вы можете найти другие предложения и сравнить.
Не создавайте свой собственный механизм распределенных вычислений , используйте механизм, предоставленный другими. Если вы настаиваете на использовании своих машин, используйте как можно больше программного обеспечения, которое предоставляется и тестируется другими. Вы можете использовать Hadoop из C ++ через интерфейс Pipes или из любого исполняемого файла через Streaming API . На Spark есть похожий потоковый интерфейс .
Не используйте все компоненты с нуля , используйте компоненты сообщества. Если по какой-то причине вы уже прочитали и хотите развернуть свои собственные облачные компоненты, не начинайте со стандартной библиотеки C ++. Основные компоненты, которые вам понадобятся:
Есть много альтернатив для обоих. Для организации очередей RabbitMQ имеет установщик Windows, как и ZeroMQ . Что касается распределенных файловых систем, у меня действительно недостаточно опыта работы с Windows: похоже, вы можете организовать общие ресурсы SMB в DFS , но я не могу дать вам подсказку. Как можно заметить в другом ответе, вы можете использовать распределенную базу данных, такую как MongoDB для данных; он работает на Windows .
Вы также можете подумать об использовании MPI (обычно это реализация OpenMPI , обычно через оболочку Boost ), но обратите внимание, что программы MPI сами по себе не являются ни эластичными, ни отказоустойчивыми; Вы должны позаботиться об этом самостоятельно (по крайней мере, они предоставляют некоторые механизмы для достижения этой цели ). Вот почему я бы порекомендовал вам сначала оценить структуру для распространения, которая обладает такими свойствами.
источник