Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Иван Пономарёв, Николай Поташников — Скрытая сл...

Moscow JUG
September 21, 2017

Иван Пономарёв, Николай Поташников — Скрытая сложность Celesta и Flute: Создание ad hoc бизнес-логики в Java-экосистеме

Мы расскажем о новой открытой платформе для создания бизнес-логики… Как, ещё одной? — Да! Потому что мы убеждены: ряд вещей, стандартных для подобного рода систем, реализован здесь интереснее, чем у других. Ключевые возможности:
- Можно использовать просто как Maven dependency.
- Пишете код один раз, запускаете на любой из поддерживаемых РСУБД (PostgreSQL, Oracle, MSSQL, H2).
- Идемпотентный DDL и автоматическое обновление структуры базы данных.
- Простое модульное тестирование процедур работы с данными без DbUnit и контейнеров.

Moscow JUG

September 21, 2017
Tweet

More Decks by Moscow JUG

Other Decks in Programming

Transcript

  1. 1

  2. Основные возможности Celesta • Леговесная (use as Maven dependecy) •

    Write once, run on any supported RDBMS – PostgreSQL, Oracle, MSSQL, H2 – RDBMS-agnostic-code • Автоматическое обновление структуры через идемпотентный DDL • CelestaUnit: модульное тестирование данных без DbUnit и контейнеров 3
  3. Что ещё умеет Celesta • Лёгкое обновление кода на «живой»

    системе • Модульность решений • Security: – Распределение прав доступа – Логирование изменений в таблицах – Аудит входов 4
  4. Зачем независимость от типа СУБД? • Выбор типа РСУБД —

    вопрос не технологический, а политический! • Переиспользование стандартной библиотеки • Тесты на H2 in-memory! (не нужен DbUnit, контейнеры…) 5
  5. — За счёт чего достигается то, что заявлено? Собственный слой

    работы с СУБД — кодогенерация классов доступа к данным — генерация DDL/SQL кода 6
  6. 7

  7. Сопоставление типов Integer (32-bit) Floating point (64-bit) String (Unicode) Long

    string (Unicode) Binary Date/Time Boolean CELESTA INT REAL VARCHAR(n) TEXT BLOB DATETIME BIT Microsoft SQL Server INT FLOAT(53) NVARCHAR(n ) NVARCHAR(MA X) VARBINARY(M AX) DATETIME BIT Oracle NUMBER REAL NVARCHAR2( n) NCLOB BLOB TIMESTAMP NUMBER [check in (0, 1)] PostgreSQL INT4 DOUBLE PRECISION VARCHAR(n) TEXT BYTEA TIMESTAMP BOOL H2 INTEGER DOUBLE VARCHAR(n) CLOB VARBINARY(M AX) TIMESTAMP BOOLEAN 8
  8. Подход №1. Database change log На самом деле, не совсем

    «рефакторинг» и не совсем «source control»! 11 Накапливаемые changesets: «рефакторинг и source control» для БД
  9. Модификация структуры БД Подход №2. “Configuration management”: идемпотентный DDL не

    «создай таблицу» а «приведи таблицу к желаемой структуре» 13
  10. • топологическая сортировка по зависимостям, • сверка контрольных сумм, •

    генерация CREATE и ALTER-команд Синхронизация структуры 15
  11. — Да. Например, создание FK или нового NOT NULL-поля без

    DEFAULT-значения. Но ничего страшного! — Но это не всегда работает? 16
  12. Гранула это… • С точки зрения файловой системы/VCS: – папка

    /score/foo, – где находится CelestaSQL файл: _foo.sql, – начинающийся с CREATE GRAIN foo VERSION '1.32'; • С точки зрения базы данных: SCHEMA foo • С точки зрения Python: foo package 18
  13. Live demo! - Создание структуры БД - Создание проекта на

    Celesta - Создание и модификация гранулы (таблицы, внешние ключи, обычные представления) 19
  14. Написание бизнес-логики • Точка входа: • Идентификатор функции: [имя гранулы].[имя

    модуля].[имя функции] def run(context, name): print u'Привет, %s' % name 21 Произвольные параметры
  15. Написание бизнес-логики def run(context, comment): orderHeader = OrderHeaderCursor(self.context) orderHeader.setRange('city', 'MSK')

    orderHeader.tryFirst() orderHeader.comment = (orderHeader.comment + comment) orderHeader.update() Транзакция начинается при входе и фиксируется после выхода. Возможен явный commit. Если возникнет lost update, то будет исключение Создание курсора. Поля курсора = поля таблицы! Выход по необработанному исключению —rollback 23
  16. Live demo! - Создание модульных тестов, - Разработка двух процедур

    через тестирование, - Изменение View на Materialized View 24
  17. Как связать с внешним миром? Flute! • Работает как сервис

    на Windows и Linux • REST-сервисы • Подхват задач из очереди (Redis) • Расписание (CRON) • Циклическое выполнение 25
  18. Конфигурация Flute <config> <dbconnstring>jdbc:postgresql://127.0.0.1:5432/celesta</dbconnstring> <dbuser>postgres</dbuser> <dbpassword>123</dbpassword> <redishost>localhost</redishost> <redisport>6379</redisport> <scorepath>D:/score2</scorepath> <restport>8888</restport>

    ... <redisqueue> <queuename>q1</queuename> </redisqueue> <scheduledtask> <schedule>5 * * * *</schedule> <script>foo.module.script</script> </scheduledtask> ... </config> Общие параметры (подключение к БД, порты и т. п.) Источники задач (очереди, расписания и т. п.) 27
  19. Ссылки • «Celesta и Flute: Создание бизнес- логики в Java-экосистеме»

    https://habrahabr.ru/post/335966/ • «Идемпотентность и конвергентность для DDL-скриптов» https://habrahabr.ru/post/337816/ • https://corchestra.ru/wiki/ 28