03.08.2024

Система распределенных вычислений. Грид-сеть.

Vortex777

Интересующийся
Регистрация
27.06.2022
Сообщения
98
Реакции
0
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
Введение.

Материал появился в результате анализа замечаний и предложений, поступивших от тех, кто прочитал статью “Процесс создания ПО для распределенных вычислений (C++)”. Отсутствие явного распределения задачи сервером между клиентами и отсутствие конкретной задачи в принципе заставили автора иначе подойти к изложению своих идей. Если предыдущая статья и прилагающийся к ней код были в какой-то степени концепцией, то в данном материале будет использоваться код приложения, реализующего в полной мере поставленные задачи. Однако не стоит ждать от приложения дополнительного оформления, коим являются GUI, конфигурационные файлы, продолжительные диалоги и тому подобные вещи, никак не относящиеся к цели.

Несколько слов о предмете статьи. В качестве объема работы, который будет распределяться, выступает перебор MD5-хеша (поиск коллизии) по диапазону символов. Задача достаточно актуальна и позволяет наглядно продемонстрировать методы своего распределения. Как результат, получится система распределенных вычислений типа «грид-сеть».


Немного терминологии.

Грид вычисления – форма распределенных вычислений, в которой группа компьютеров, объединенных каналами связи (кластер), выполняет большой объем работ. Впервые эта технология была применена для решения научных, математических задач, требующих для решения значительных вычислительных ресурсов. Сейчас грид вычисления используются также и в коммерческой инфраструктуре для решения таких трудоёмких задач как экономическое прогнозирование, сейсмоанализ, разработка и изучение свойств новых лекарств. Но ничто не мешает нам организовать такую сеть для выполнения полезных для нас действий, требующих огромных вычислительных ресурсов. Одно из таких действий – перебор MD5-хеша.

Почему именно MD5? Ответ: потому что хеши этого алгоритма наиболее распространены в веб-инфраструктуре (уже чувствуются летящие в сторону автора камни). К тому же, ничто не мешает переписать участок кода, отвечающего за генерацию хеша по строке, для нужного вам алгоритма шифрования, благо - этот участок небольшой.

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


Создание базы будущей системы.

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

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

При первом запуске сервера требуется создать и зарегистрировать канал на определенном порту (используем порт с номером 39993), а также зарегистрировать класс для удаленной активизации, т.е. для предоставления этого класса клиентам. В этом, собственно, суть Ремоутинга: клиент создает у себя экземпляр класса, который расположен на удаленном сервере, и работает с этим экземпляром, как со своим. При этом все расчеты, которые используются в классе, выполняются на сервере, а клиенту передаются лишь результаты этих расчетов. Вся эта система работает через прозрачный (не видимый с точки зрения программиста) прокси-сервер. В общем, за деталями технологии к поисковику. Вот код, выполняющий наши требования:
Код:
 //создать и зарегестрировать канал на порту 39993      
        TcpServerChannel channel = new TcpServerChannel(39993);
        ChannelServices.RegisterChannel(channel);

        //зарегистрировать класс для удаленной активизации
        RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(Bot),//регистрируемый класс
            "Bot",//URI регистрируемого класса
            WellKnownObjectMode.SingleCall);//режим активизации для каждого клиентского вызова
URI , он же Uniform Resource Identifier (унифицированный идентификатор ресурса) – параметр, который используется клиентом для активизации объекта, т.е. с помощью URI клиент укажет серверу, что требуется экземпляр именно класса Bot.
Клиент, в свою очередь, должен создать клиентский канал и зарегестрировать удаленный класс в локальном домене:
Код:
 //создать и зарегестрировать клиентский канал
        TcpClientChannel channel = new TcpClientChannel();
        ChannelServices.RegisterChannel(channel);
        //зарегистрировать удаленный класс в локальном домене
        RemotingConfiguration.RegisterWellKnownClientType(
            typeof(Bot),//удаленный класс
            "tcp://localhost:39993/Bot");//URI удаленного класса
Здесь URI задает местоположение удаленного класса. Протокол (в данном случае tcp) соответствует протоколу каналов, зарегистрированных в доменах приложений. Идентификатор машины (localhost) задает сервер, экспортирующий класс Bot и таким образом указывает компьютер, на котором будет создан объект. Вместо localhost можно использовать IP-адрес или имя компьютера. Далее в строке URI через двоеточие указывается номер порта, соответствующий номеру порта, на котором сервер ожидает вызовы (порт с номером 39993).
Для того, чтобы класс Bot поддерживал удаленное взаимодействие необходимо использовать в качестве базового класса System.MarshalByRefObject:
 

Performance

Проверенный продавец
Проверенный продавец
Бар "Собрание"
Регистрация
05.12.2021
Сообщения
63
Реакции
2
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
Спасибо за статью)
 
Сверху