Читайте также:
|
|
В большом количестве корпоративных приложений, часто, одно событие приводит к запуску целого ряда последовательных (или параллельных) процессов, каждый из которых выполняет вполне определённое действие. Так например, компонент, получающий сообщение должен получив сообщение, расшифровать его, записать какую-то информацию в журнал, выполнить преобразование сообщение из одного формата в другой, выполнить какое-то бизнес-действие и отправить сообщение далее другому компоненту.
Для достижения такой функциональности часто прибегают к инкапсуляции её полностью внутри одного компонента, что очень часто приводит к резкому усложнению компонента, затрудняет (а как правило делает вообще невозможным) его повторное использование, затрудняет отладку и тестирование, а так же снижает возможность параллельной работы нескольких разработчиков.
Выходом из описанной ситуации может послужить применение шаблона Цепочка ответственности (Chain of Responsibility), который применительно к системам обмена сообщениями и в соответствующих архитектурах носит названия Каналы и Фильтры (Pipes and Filters). В соответствии с этим шаблоном, функциональность разбивается на отдельные компоненты, которые называются Фильтрами. Фильтры имеют как минимум один входной и один выходной интерфейс (например, метод, который принимает один параметр и возвращает одно значение). Этот интерфейс должен быть одинаковый для всех фильтров, т.е. фильтры являются взаимозаменяемыми по интерфейсу. Фильтры объединяются в цепочки при помощи каналов (Pipe) в нужном порядке. Таким образом, в результате получается необходимая суммарная функциональность чётко декомпозированная по группам в виде отдельных фильтров.
Положительными особенностями такого подхода является следующее:
Однако такой подход не лишён недостатков. Среди них наиболее значительными являются:
Самым очевидной реализацией канала (Pipe) является канал передачи сообщений (Message Channel) предоставляемый инфраструктурой обмена сообщениями (Messaging Subsystem). Однако, такой подход, в случае если фильтры находятся в рамках одного адресного пространства (в рамках одного процесса) может быть заменён на более эффективный способ обмена данными. Поэтому хорошее архитектурное решение не должно делать предположение о нижележащей реализации каналов. Это позволит в случае простых однопроцессных конфигураций существенно повысить эффективность использования системных ресурсов, а так же повысить производительность.
В самом простом случае фильтр имеет один входной и один выходной интерфейс, однако, фильтры могут иметь так же и несколько входных и несколько выходных интерфейсов (например, в случае с фильтрами-маршрутизаторами сообщений, Message Router).
Цепочки фильтров могут быть организованы двумя способами:
Параллельная обработка (если она принципиально возможна) способна сократить время прохождения запроса (или обработки сообщения) по цепочки фильтров, а так же повысить пропускную способность. Более того, в некоторых случаях фильтры могут представлять собой некоторую функциональность, которая может быть выполнена только на определённом компьютере (например, запрос к какому либо централизованному серверу). Соответственно, если удаётся сделать несколько запросов параллельно – то это может благотворно сказаться на общей производительности решения. Параллельность, однако, возможна лишь в том случае если входные параметры фильтров выполняющихся параллельно не зависят от выходных значений друг-друга (в указанно примере входные параметры фильтров B и C завысят от выходных значений фильтра A, но они не зависят друг от друга, поэтому они в принципе могут выполняться параллельно).
Дата добавления: 2015-10-24; просмотров: 125 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Интеграция с помощью разделяемой базы данных | | | Уровни преобразования данных |