Главная страница

Практика НИР. Практическая работа 1. Подготовка требований к качеству информационной системы 3 1 Основные определения 3 2 Цель практической работы 3


Скачать 298.72 Kb.
НазваниеПрактическая работа 1. Подготовка требований к качеству информационной системы 3 1 Основные определения 3 2 Цель практической работы 3
АнкорПрактика НИР
Дата15.07.2022
Размер298.72 Kb.
Формат файлаdocx
Имя файлаPrakticheskie_raboty_1-6.docx
ТипПрактическая работа
#631229
страница6 из 7
1   2   3   4   5   6   7

4.2 Цель практической работы


Цель настоящей практической работы – подготовить клиентское программное обеспечение для генерации и отправки HTTP-запросов по заданному адресу.

4.3 Задачи практической работы


Для достижения поставленной цели необходимо решить следующие задачи:

  1. Создать структуру клиентского программного обеспечения, обеспечивающую отправку запросов на сервер по заданным конфигурациям.

  2. Удостовериться в корректности работы клиентского программного обеспечения.

  3. Рассмотреть перечень конфигураций, используемых клиентским программным обеспечением в рамках практических работ.

4.4 Рекомендации по выполнению практической работы


Ранее, внутри корневой директории, уже была создана поддиректория /app. В ней следует создать поддиректорию /vm/client, в которую поместите файл .npmrc (точка в начале названия обязательна) содержащий единственную строчку (без кавычек): «bin-links=false». Ввиду того, что для экспериментов используются общие папки, создание символических ссылок (symbolic links) может быть проблематичным. Этот файл конфигурации устанавливает настройки пакетного менеджера npm по умолчанию, а указанная опция отключает использование символических ссылок.

В директории /app/client создайте файл с именем package.json и поместите в него следующее содержимое.

{

  "name": "client",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {},

  "author": "",

  "dependencies": {

    "fs-extra": "9.1.0",

    "lodash": "4.17.20",

    "needle": "2.6.0",

    "threads": "1.6.3"

  },

  "license": "UNLICENSED"

}

Файл конфигурации проекта содержит перечень зависимостей, которые должны быть установлены. Чтобы это осуществить, подключитесь к виртуальной машине клиента с помощью команды vagrant ssh, перейдите в каталог проекта (cd /vagrant/app/client) и выполните команду установки – npm install.

Клиентское программное обеспечение будет состоять из двух частей: основного модуля генерации запросов к серверу и модуля отправки запросов. Для реализации модуля генерации запросов предлагается использовать следующий программный код, который следует поместить в файл index.js:

const { spawn, Pool, Worker } = require('threads');

const path = require('path');

const fs = require('fs-extra');

const _ = require('lodash');
const config = require('./config.json');

require('events').EventEmitter.defaultMaxListeners = 0;
const pool = Pool(() => spawn(new Worker('./worker')), {

  concurrency: config.concurrency,

});

const pause = async time => (new Promise((resolve) => {

  setTimeout(resolve, time);

}));

const loadData = async () => {

  const normalizedPath = path.join(__dirname, 'data');
  const files = await fs.readdir(normalizedPath);
  const promises = _.map(files, async (file) => {

    const content = await fs.readFile(path.join(normalizedPath, file));

    return _.split(_.trim(content.toString()), '\n');

  });
  const fileContents = await Promise.all(promises);

  return _.zip(...fileContents);

};
(async () => {

  const tuples = await loadData();
  console.log(`Concurrency is ${pool.options.concurrency}`);

  console.log(`Worker pool size is ${pool.workers.length}`);
  const batchSize = pool.options.concurrency * pool.workers.length;

  const tupleBatches = _.chunk(tuples, batchSize);

  console.log(`Resulting batch size is ${batchSize}`);

  console.log(`Total number of batches is ${tupleBatches.length}`);
  console.log(`Start time: ${(new Date()).toString()}`);

  await pause(config.pause);
  await _.reduce(tupleBatches, async (acc, batch, i) => {

    await acc;

    const promises = _.map(batch, (tuple, j) => pool.queue(async (worker) => {

      const res = await worker.get(config.url, {

        a: tuple[0],

        b: tuple[1],

      });

      return res;

    }));
    await Promise.all(promises);
    return pause(config.batchDelay);

  }, Promise.resolve());
  await pause(config.pause);

  console.log(`End time: ${(new Date()).toString()}`);
  console.log('Exiting...');

  await pool.terminate();

})();

Реализацию модуля отправки запросов следует поместить в файл worker.js:

const { expose } = require('threads/worker');
const needle = require('needle');

const config = require('./config.json');

require('events').EventEmitter.defaultMaxListeners = 0;
expose({

  get: async (url, data) => needle('get', url, data, {

    response_timeout: config.clientTimeout,

    read_timeout: config.clientTimeout,

    headers: {

      Connection: 'close',

    },

  })

    .catch(id => id)

    .then(res => res.statusCode || res.code),

});

Кроме этих двух модулей необходимо создать файл конфигурации клиентского программного обеспечения config.json. В качестве заготовки можно использовать следующий код:

{

  "pause": 10000,

  "clientTimeout": 10000,

  "batchDelay": 300,

  "concurrency": 10,

  "url": "http://192.168.84.123:3000/algorithm"

}

В файле конфигурации представлены следующие настройки:

  • pause – задержка перед началом отправки данных и после завершения отправки данных (в миллисекундах);

  • clientTimeout – максимальное время ожидания ответа сервера на отправленный запрос (в миллисекундах);

  • batchDelay – задержка между отправляемыми пакетами запросов (в миллисекундах);

  • concurrency – количество запросов, отправляемых одновременно (из расчёта на 1 ядро процессора);

  • url – адрес, по которому будет производиться отправка GET-запросов.

После этого, в директории клиентского программного обеспечения создайте поддиректорию data. В неё поместите два текстовых файла. Текстовые файлы должны содержать одинаковое количество строк. Эти строки будут отправляться клиентским программным обеспечением по указанному в файле конфигурации URL в качестве параметров a и b, рассмотренных в предыдущей практической работе.

Далее, в соответствии с вариантом задания, измените файл конфигурации config.json (см. раздел 4.5). На данном этапе должна получиться структура, идентичная показанной на рисунке Рисунок 5



Рисунок 5 – Структура файлов и директорий

После этого необходимо проверить работоспособность клиентского программного обеспечения. В первую очередь необходимо запустить серверное программное обеспечение. После, не останавливая его работы, нужно внутри виртуальной машины клента перейдите в каталог /vagrant/app/client и выполнить команду node index.js. Пример успешного запуска клиентского программного обеспечения показан на рисунке Рисунок 6.



Рисунок 6 – Работа клиентского программного обеспечения в терминале

После выполнения программы следует проверить содержимое директории /app/server/log – там должен быть файл, соответствующий выбранному варианту задания в предыдущей практической работе и использованному в качестве URL в текущей работе. Сгенерированный файл соответствует формату CSV и состоит из 3 столбцов: время выполнения запроса (в миллисекундах), HTTP-код ответа сервера, содержание ответа сервера.
1   2   3   4   5   6   7


написать администратору сайта