23 нояб. 2008 г.

Крэкс, фэкс, пэкс или архитектура приложений под Oracle

Хотел написать полноценную статью, но из-за загруженности решил, что лучше уж напишу заметку, чем вообще ничего. Итак...
Если у вас стоит задача написания нового приложения с использованием базы данных Oracle, то естественно возникает и вопрос: на чем его писать и, соответственно, какую архитектуру приложения выбрать.
Конечно, для некоторых команд этот вопрос может быть заведомо решен - пишем на Java, .Net, Forms... и так далее. Список огромный - каждый выбирает по вкусу, или точнее то, чем владеет. Относительно с недавних пор всё больше разработок ведется на Apex. Отличный инструмент, но и не лишен некоторых недостатков. Ну и совсем свежачок - Flex. Вот на счет последних двух и хотелось написать. Собственно, заклинание из заголовка статьи немного созвучно набору технологий Apex, Flex, Ajax.

Для начала Apex. Инструмент простой, но очень эффективный. В принципе, позволяет создавать web приложения любой сложности. При этом избавляет от значительной части рутинной работы. Архитектура Apex приложений по сути проста – база данных сама генерирует html контент. Т.е. никаких специфических средних звеньев не требуется, если не брать в расчет web сервер (встроенный либо нет). И само приложение всё хранится в таблицах базы данных. А дальше идут недостатки, обусловленные как раз такой архитектурой. Неудобство разработки внутри html приложения, отсутствие нормальной версионности файлов, сложность вклиниться во внутренние механизмы рендеринга страниц – особенно критично в случаях, когда вы строите приложение сильно отличающееся от стандартных шаблонов. Опять же рендеринг создаёт дополнительную нагрузку на базу, хотя я и не сталкивался пока с серьезными проблемами по этой части, но тем не менее.

А теперь Flex. Очень богатые интерфейсные возможности при минимуме усилий. Можно создавать полноценные десктоп приложения. Разработка ведется вполне классическим способом, с поддержкой всевозможных сопутствующих систем версионности и т.д. Короче, конфетка! Но есть и «но». Flex общается с базами данных посредством web или http сервисов. Еще вроде Adobe предлагает Data Services, middle tire компонент для взаимодействия с базами данных, но я этим вопросом вплотную не занимался, потому как мне не интересен вариант использования дополнительного звена между приложением и базой, да ещё и java based.

Но во Flex очень просто реализуется взаимодействие приложения с javascript страницы, в которую он встроен. Причем это взаимодействие работает в обе стороны: javascript может вызывать методы flex приложения, и flex может вызвать любую внешнюю javascript функцию. Собственно в этом вся и соль – встроить Flex приложение внутрь Apex. Сам Apex при этом выполняет функции доставки данных, контроля доступа, управления сессиями, а Flex в свою очередь выполняет функции клиентского приложения.

То есть получается приложение, интерфейс которого полностью сделан во Flex. Такие вещи как авторизация, жизненный цикл сессий и транзакций управляется Apex. Вся логика обработки данных лежит в базе. Apex перестаёт создавать дополнительную нагрузку, поскольку он уже не рендерит страницы (Flex приложение грузится разом).

Чем не идеальная архитектура? И главное, ничего лишнего и всё бесплатно :)
Подумайте, может оно того стоит! Я кстати уже опробовал - мне понравилось.

8 комментариев:

Анонимный комментирует...

а можно детальней? как именно интегрируется flex в apex?

Alp комментирует...

Закачиваете SWF файл в Shared Objects - Static Files.
Создаете на нужной странице область типа HTML и в неё встраиваете закачаный SWF с помощью тегов OBJECT и EMBED, где даете ссылку на файл с помощью префикса #WORKSPACE_IMAGES#.
Пишите OnDemand Application Processes, которые будут доставлять данные от базы данных к странице и обратно с помощью всяких htp и owa. Встраиваете в страницу javascript функциии, которые будут вызывать эти процессы и возвращать данные. Во Flex приложении в свою очередь вызываетt эти функции с помощью ExternalInterfaces. Ну и т.д...

Анонимный комментирует...

имхо, сложновато... а через веб-сервсы (WSDL) не пробовали?

Alp комментирует...

Использование web сервисов сопряжено с другими проблемами. И их будет не меньше, и даже предполагаю, что больше. Напомню, что одной из основных идей моей реализации - отсутсвие Application Server'а. Развернуть без него веб-сервисы на самой базе данных - задача тоже не из тривиальных и очень сильно зависящая от используемой версии БД. Native web services появились только в 11g, utl_dbws документирован просто никак, да и по имеющейся информации он слабо функционален, остальное всё требует iAS (поправьте если ошибаюсь). Опять же настроить аутентификацию и прочую секьюрность - это убьет немного нервов. А в моём решении все механизмы просты и чрезвычайно управляемы.

Анонимный комментирует...

Тоже мучаюсь выбором пути интрефейсостроительства. В оргнаизации все устанавливается админами. Работаем с Forms. Чтобы пользователь поставил галочку хотябы в workflow утверждения - ему надо ставить JInitiator. А таких пользоватлей сотни и компы им иногда меняют. Веселуха. Рассматриваю Apex, JDeveloper(но надо будет покупать ОAS). Flex, Silverlight - нет, бо требуют инсталяции. Мне понравился Web нтерфейс в OpenBravo (основан на Spring и Hibernate). Но вроде бы упрощен для enterprise application разработчиков.

Alp комментирует...

JInitiator - вещь не самая приятная, согласен. Хотя вроде можно его настроить чтобы ставился сам "втихую" при первом запуске приложения. Но сути это не менят.
JDeveloper с ADF - конечно вариант, и сторонники утверждают, что он не грамма не уступает в скорости разработки Апексу. Но мой скромный личный опыт с JDeveloper'ом не прибавляет этому варианту плюсов. Тем более если в комманде нет квалифицированных Java-спецов, желательно имеющих хороший опыт с JSF - то совсем не вариант.
Flex в вашем случае возможно и нет смысла использовать. А вот Apex - самое то. Web-интерфейс по идее можно сделать каким-угодно с апексом. Нужно приложеить естественно какие-то усилия, но нет ничего невозможного. Я уже давал ссылку на пример прикручивания сторонних фреймворков.

Apex комментирует...

JavaFX возможно станет (очень надеюсь) реальной альтернативе Flex. Основаная проблема Flex - необходимость ставить Flash-player. А оно до сих пор проприетарно.
А вообще, идея конечно интересная, Алекс, ты вообще сам пробовал где-нить это применять? Как оно?

Alp комментирует...

Да, я пробовал. Правда только flex. До JavaFX пока не добрался, но интуитивно чувствую, что это не очень хорошая весчь :)
В одном проекте я делал чистый flex компонент (об апексе там речи не шло). А еще в одном проекте разработанный flex компонент является собственно ядром Apex приложения.
Это приложение в скором времени увидит свет, я надеюсь к марту (в новогоднем посте я говорил именно о нем). Так что наберитесь терпения. Думаю это будет интересно :)