Перейти к содержимому
Разделы
ЯзыкRUEN

v2.1Концепции

Архитектура

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

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

text
источник  ->  разделитель  ->  склейка  ->  сопоставитель  ->  фильтр  ->  приёмник
(Readable)    (строки)         (multiline)   (формат/шаблон)    (query)     (ваш код)

Стадии#

  1. Разделитель строк. Режет поток на строки по \n и \r\n, хранит неполный хвост между чанками и отбрасывает строки длиннее maxLineLength до того, как они попадут в память.
  2. Склейка. Применяет правило multiline. Если правило не задано, стадия ничего не делает и не копирует данные.
  3. Сопоставитель. Применяет формат или шаблон. Шаблон компилируется в конечный автомат, который читает строку слева направо один раз.
  4. Типизатор. Превращает найденные подстроки в Date, числа и уровни. Ошибка типа превращается в ParseError, а не в NaN.
  5. Фильтр. Функция из parser.query пропускает или отбрасывает готовую запись.

Решения и причины#

РешениеПричина
Автомат вместо регулярных выраженийВремя работы линейно по длине строки, строка с миллионом пробелов не вешает процесс
Запись создаётся только после успешной типизацииНет наполовину заполненных объектов в parser.errors
fields без прототипаКлючи из лога не могут перезаписать методы объекта
Нет глобального состоянияДва разборщика в одном процессе не влияют друг на друга
Нет eval и new FunctionЗапрос и шаблон из внешнего источника нельзя превратить в выполнение кода

Границы ответственности#

Сверло не читает файлы само, не следит за ротацией логов и не отправляет записи по сети. Для первого есть Readable, для второго — tail в CLI, для третьего — ваш код. Узкая зона ответственности держит библиотеку маленькой и предсказуемой.

Об ожидаемой скорости и бюджетах читайте в разделе производительность.

Обновлено: