stream_logger_chalange

cd agent node agent.js cd master node app.js

Система должна располагаться на 2-х и более серверах (для тестового задания достаточно 2-х). Для тестирования нет необходимости иметь 2 компьютера. Можно запустить 2 процесса на одном, но суть обмена данными через сетевой интерфейс должна остаться. На первом сервере располагается располагается текстовый файл (лог) и на нем же запускается мастер-процесс (далее мастер). На остальных серверах стоят скрипты, которые подключаются к мастеру (далее агенты). Способ подключения не важен (сокет, http, rpc и т.д.).

Мастер:

  • Мастер создает несколько дочерних процессов (cluster) и дает команду подключившимся к нему тоже создать несколько дочерних процессов(обычно по колличеству ядер, но в тестовом варианте можно меньше).
  • Мастер читает текстовый файл построчно и порциями (порции должны содержать целое число строк) переадрисовывает поток своим дочерним процессам и процессам на других машинах. Способ передачи потока в дочерние процессы на других машинах так же не важен (отдельное подключение или через агента на этом сервере).
  • Если в процессе переадрисации потока подключится еще один агент, мастер также должен дать ему команду на создание дочерних процессов и распределять поток на них тоже.
  • По окончании файла и окончании обработки потока на каждом дочернем процессе, мастер дает команду агентам закрыть потоки и переслать обработанный лог на сервер мастера (по ssh).
  • По окончании пересылки мастер склеивает все полученные кусочки лога в один файл и выдает в консоль суммарное время обработки лога.

Агенты:

  • После запуска мастера его должны увидеть агенты и автоматически подключиться к нему.
  • При получении команды на создание дочерних процессов, создать кластер из указанного в команде колличества процессов.
  • При получении команды окончания лога, дождаться окончания обработки потока в кластере, закрыть все процессы и скопировать по ssh полученные после обработки логи.
  • По окончании копирования отправить команду мастеру об окончании копирования.

Кластер:

  • Каждый процесс кластера должен получать на вход поток и разбивать его на строки.
  • В строке найти число от 1 до 100 000 000 (отделенное табуляцией) перевести его в hex формат в верхнем регистре, 8 символов. (например: 654321 = 0009FBF1)
  • Полученное число в hex формате записать в свой лог отдельной строкой.

Лог:

  • Пример строк входного лога:
194.135.154.57 [15/Feb/2015:06:38:22 +0200] 654321 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) 

Gecko/20100101 Firefox/37.0"

46.165.13.23 [15/Feb/2015:06:38:48 +0200] 8761824 "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; 

Trident/6.0)" 

81.25.53.30 [15/Feb/2015:06:39:01 +0200] 1233321 "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.17"
  • Пример строк выходного лога:
0009FBF1
0085B1E0
0012D1A9