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

Артем Титаренко (АО Тинькофф-Банк), Scala – общ...

CodeFest
January 25, 2018

Артем Титаренко (АО Тинькофф-Банк), Scala – общие подходы, tips and tricks при реализации API, CodeFest 2017

https://2017.codefest.ru/lecture/1210

Поговорим про то, как мы используем язык Scala для написания API личного кабинета юридических лиц. Какие грабли удалось найти и к каким решениям в итоге пришли.

● Почему Scala? Как на ней вообще можно писать продакшн-код?
● Библиотеки для REST API, работы с БД, транзакциями и др.
● Как мы интегрируемся с другими системами банка
● Прочие tips and tricks

CodeFest

January 25, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Коротко о проекте • Личный кабинет юридических лиц Тинькофф.ру •

    Относительно молодой проект (с середины 2014 года) • ~15 разработчиков API бэка • >50K активных пользователей, активный рост • SOA: 5 основных сервисов и еще несколько мелких • 3 команды • Scrumban
  2. Организационные вещи • Прежде всего - командная работа • Коллективное

    владение кодом • Каждый имеет право вносить изменения в любое место • Повышенные требования к понятности кода и к юнит-тестам ◦ Одно и то же выражение можно написать десятью разными способами ◦ Кодстайл и единый подход
  3. Функциональный подход • Берем плюсы: ◦ Нет состояния ◦ Нет

    сайд-эффектов ◦ Указание “что нужно”, а не “как нужно” • Без фанатизма. Не берем минусы: ◦ Все-таки нет состояния ◦ Write-only ◦ Сложное обучение
  4. Микросервисы • Плюсы: ◦ Изолированность (arch, dev, test, deploy, operate)

    ◦ Переиспользуемость ◦ Масштабируемость • Минусы: ◦ Множество сущностей (arch, deploy, operate) и интерфейсов • Естественный цикл развития проектов: o → 0 → 8 → oo • SSO - естественная необходимость
  5. SBT: [not so] Simple Build Tool • Очень большая гибкость

    • Использует конструкции языков Scala/Java • Рекомендую прочитать доку и немного попрактиковаться. Это не так страшно. • Долгие импорты и билды в IDEA. Микросервисы здесь очень помогают.
  6. RESTful API + JSON • Смесь RESTful API + Pure

    JSON API • Почему? ◦ Простота и наглядность ◦ Много инструментов • Spray HTTP Server => Akka HTTP { "requestId": "015c129dad1e", "success": true, "result": {...} } { "requestId": "b9c522e159d0", "success": false, "errorId": "4db89328", "errorCode": "INVALID_INN", "errorDescription": "Указан неверный ИНН" }
  7. Документация API Swagger API. Автогенерация документации Плюсы: • Стандарт •

    UI с поддержкой авторизации • Документация в коде и “всегда” актуальна • Экспорт в PostMan etc Минусы: • Ограничения на скачивание файлов • Недостаточный type safety из-за ограничений аннотаций • Нет поддержки Spray-роутов
  8. Работа с БД. Slick • ORM: ◦ Persisted object graph

    ◦ Скрытые походы в БД за дополнительными зависимостями • Slick: ◦ Functional-relational mapping (работа с БД как с коллекциями) ◦ Работает только с тем, что нужно сейчас • Plain text SQL для сложных запросов
  9. Интеграция. Дальний бэк • SOAP, MQ, REST. Никогда через БД

    (каждый проект имеет свою схему). • Транзакции (Atomikos): ◦ Раньше: распредтранзаки везде. ◦ Сейчас: только там, где это действительно необходимо. At least once, идемпотентность. Внутри транзак никуда не ходим. • Пул тредов: ◦ Раньше: единый пул тредов. ◦ Сейчас: под каждую систему свой пул. Защита от проблем у других. • XML: ◦ Раньше: стандартная работа с XML в Scala. ◦ Сейчас: Scalaxb.
  10. Мелочи 1. Scala Worksheet (IDEA), REPL 2. Alt+= (Ctrl+Shift+P на

    маке) подсказывает тип выражения 3. Options: Используем где необходимо. Option.apply() как защита от null-ов. 4. В методе, который возвращает Future, нельзя кидать исключение вне фьючи 5. catch NonFatal(e), фатальные исключения выбрасываем дальше 6. Преждевременная оптимизация