Подходящий шаблон проектирования для анализатора журналов событий?

StackOverflow https://stackoverflow.com/questions/94148

  •  01-07-2019
  •  | 
  •  

Вопрос

Работаю над проектом, который анализирует журнал событий, а затем обновляет модель на основе свойств этих событий.Я был довольно ленив в том, чтобы "довести это до конца", и больше беспокоился о предварительной оптимизации, бережливом коде и правильных шаблонах проектирования.В основном эксперимент по самообучению.Меня интересует, какие шаблоны более опытные дизайнеры считают актуальными, или какой тип архитектуры псевдокодированных объектов был бы лучшим, его было бы проще всего поддерживать и так далее.

В одном журнале может быть 500 000 событий, и существует около 60 типов событий, все из которых имеют примерно 7 базовых свойств, а затем от 0 до 15 дополнительных свойств в зависимости от типа события.Тип события является вторым свойством в файле журнала в каждой строке.

Итак, я попробовал действительно уродливый императивный синтаксический анализатор, который просматривает журнал построчно, а затем обрабатывает события построчно.Затем я попробовал лексическую спецификацию, которая использует шаблон "nextEvent", который вызывается в цикле и обрабатывается.Затем я попробовал простой старый метод "parse", который никогда не возвращает и просто запускает события для зарегистрированных обратных вызовов слушателя.Я пробовал как одиночный обратный вызов независимо от типа события, так и метод обратного вызова, специфичный для каждого типа события.

Я попробовал базовый класс "event" с объединением всех возможных свойств.Я пытался избежать вызова "нового события" (поскольку событий может быть огромное количество, а объекты событий, как правило, недолговечны) и использования методов обратного вызова для каждого типа с примитивными аргументами свойства.Я попытался создать подкласс для каждого из 60 типов событий с абстрактным родительским событием с 7 общими базовыми свойствами.

Недавно я попытался пойти дальше и использовать шаблон команды для размещения кода обработки событий для каждого типа события.Я не уверен, что мне это нравится, и это действительно похоже на подход с обратными вызовами для каждого типа, просто код находится внутри функции execute в подклассах типов по сравнению с методами обратного вызова для каждого типа.

Проблема в том, что большая часть логики обновления модели является общей, и большая ее часть специфична для подкласса, и я только начинаю путаться во всем этом.Я надеюсь, что кто-нибудь сможет, по крайней мере, указать мне направление для размышления!

Это было полезно?

Решение

Что ж...во-первых, вместо одного класса событий с объединением всех свойств или 61 класса событий (1 базовый, 60 вспомогательных), в сценарии с такими большими вариациями, у меня был бы соблазн иметь один класс событий, который использует пакет свойств (dictionary, hashtable, w / e floats your boat) для хранения информации о событии.Тип события - это всего лишь еще одно значение свойства, которое помещается в пакет.Основная причина, по которой я бы так поступил, заключается просто в том, что мне было бы неприятно поддерживать 60 производных классов чего бы то ни было.

Главный вопрос вот в чем...что ты должен сделать делай с событиями по мере их обработки.Вы форматируете их в отчет, организуете в таблицу базы данных, будите людей, если происходят определенные события?..что?

Предполагается ли, что это анализатор постфактум или обработчик событий в реальном времени?Я имею в виду, отслеживаете ли вы журнал по мере поступления событий или просто анализируете файлы журналов на следующий день?

Другие советы

Рассмотрим легковесную фабрику стратегических объектов, по одному на "класс" события.

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

Возможно Хэшированные Объекты Адаптера (если вы можете найти хорошее объяснение этому в Интернете - похоже, их не хватает.)

Только что с самого верха:

Мне нравится предложение в принятом ответе о наличии только одного класса с картой свойств.Я также думаю, что таким же образом можно собрать и behvavior:

class Event
{
    // maps property name to property value
    private Map<String, String> properties;

    // maps property name to model updater
    private Map<String, ModelUpdater> updaters; 

    public void update(Model modelToUpdate)
    {
        foreach(String key in this.properties.keys)
        {
            ModelUpdater updater = this.updaters[key];
            String propertyValue = this.properties[key];

            updaters.updateModelUsingValue(model, propertyValue);
        }
    }

}

Класс ModelUpdater не изображен.Он обновляет вашу модель на основе свойства.Я сам придумал эту петлю;это может быть, а может и не быть тем, чем на самом деле является ваш алгоритм.Я бы, вероятно, сделал ModelUpdater скорее интерфейсом.Каждый разработчик будет соответствовать каждому свойству и будет обновлять модель.

Тогда мой "основной цикл" был бы:

Model someModel;

foreach(line in logFile)
{
    Event e = EventFactory.createFrom(line);
    e.update(someModel);
}

EventFactory создает события из файла.Он заполняет две карты на основе свойств события.Это подразумевает, что существует какой-то способ сопоставить свойство с соответствующим средством обновления модели.

У меня нет для вас никаких причудливых названий шаблонов.Если у вас есть какие-то сложные правила, например, если событие имеет свойства A, B и C, то игнорируйте средство обновления модели для B, тогда этот подход должен быть каким-то образом расширен.Скорее всего, вам может потребоваться каким-то образом внедрить некоторые правила в EventFactory, используя шаблон объекта Rule.Вот тебе и название шаблона для тебя!

Я не уверен, что правильно понимаю проблему.Я предполагаю, что существует сложная "логика обновления модели".Не распределяйте это по 60 классам, храните в одном месте, уберите из классов событий (шаблон посредника, что-то вроде).

Ваш посредник будет работать с классами событий (я не понимаю, как вы могли бы использовать здесь предельный вес), события могут анализироваться сами по себе.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top