Monday, July 18, 2011

Мысли о конфигурационных файлах.

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

Я сам долгое время считал, что лучше всего делать конфигурацию на базе лексического и синтаксического анализа (lex + yacc), выполняя семантический анализ собственными силами. Однако, практика показывает, что реализация Тюринг полного языка конфигурации (или хотя бы организация правильных ветвлений, а не костылей, похожих на них) является крайне сложной задачей. А кроме того, этот подход ведет к очень плохой тенденции: пользователь должен знать язык конфигурации. Это приводит к таким странным решениям, как, например, конфигурация sendmail. С другой стороны, при необходимости реализации большей части конфигурации, используя парадигмы языка программирования очень сложными являются базовые настройки.
Учитывая это, я решил, что для rspamd я буду использовать некоторую смесь этих подходов - настройка базовых параметров простым и достаточно понятным xml, обеспечивающим нужный уровень вложенности и аттрибуты для некоторых параметров, и lua для написания синтаксических правил.
Недостаток у такого подхода очевиден - например, правило и его вес находятся в разных файлах (причем, разных синтаксически), и для добавления новых правил требуются дополнительные и не всегда очевидные усилия.
Видимо, единственный выход из сложившейся ситуации - дублировать любые часто употребляемые параметры и обеспечивать их внятную перезапись. Например, что значения, определенные в lua файле, перекрывают значения в xml (и обязательно писать об этом в логе). Таким образом, я все больше замечаю, что новые правила и их настройки я задаю только в lua файлах. Но на самом деле это не повод отказываться от простого xml - для обычных инсталляций гораздо удобнее немного поправить коэффициенты, чем разбираться, как программировать на lua.
Подводя итог, думаю, что уместно будет сказать, что использование языка разметки для параметров (а это могут быть и более простые ini файлы) и использование Тюринг полного языка программирования для сложных правил - это достаточно правильная архитектура конфигурации программы, позволяющая как "грубую", так и "тонкую" настройку программы. Самый же главный минус данного подхода - избыточность с точки зрения кода и возможное создание конфликтов.

No comments:

Post a Comment