SlideShare a Scribd company logo
Как мы данные готовили
ORM и все-все-все в приложение Почта Mail.Ru
Кирилл Филимонов
Mail.Ru Group
Что должно уметь почтовое приложение?
Что должно уметь почтовое приложение?
● Написать письмо
Что должно уметь почтовое приложение?
● Написать письмо
● Отправить письмо
Что должно уметь почтовое приложение?
● Написать письмо
● Отправить письмо
● Получить письмо
Что должно уметь почтовое приложение?
● Написать письмо
● Отправить письмо
● Получить письмо
● Сохранить письмо
Что должно уметь почтовое приложение?
● Написать письмо
● Отправить письмо
● Получить письмо
● Сохранить письмо
Что должно уметь почтовое приложение?
● Написать письмо
● Отправить письмо
● Получить письмо
● Сохранить письмА
Domain Driven Slide
Domain Driven Slide
● Письмо
Domain Driven Slide
● Письмо
● Папка
Domain Driven Slide
● Письмо
● Папка
● Тред
Domain Driven Slide
● Письмо
● Папка
● Тред
● Аккаунт
● Фильтры
● Сессия
● Вложения
● Реклама
● Конфигурация
● ...
Domain Driven Slide
Domain Driven Slide
Thread
Presentation
Presentation
Presentation
Message
Message
Message
Domain Driven Slide
Domain Driven Slide
Domain Driven Slide
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл Филимонов (Mail.Ru Group)
Следствия
● Действие пользователя может порождать множество операций над
данными
● Операции над данными могут зависеть друг от друга
● Операции могут занимать значительное время
Что важно для пользователя
Что важно для пользователя
● Отзывчивый UI
Что важно для пользователя
● Отзывчивый UI
● Видеть результат операции, даже если она не успешна
Что важно для пользователя
● Отзывчивый UI
● Видеть результат операции, даже если она не успешна
● Скорость выполнения операции
Инструменты
● SQLite
● ORMLite
● Напильник
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл Филимонов (Mail.Ru Group)
Off-UI инструменты
● Thread
Off-UI инструменты
● Thread
● AsyncTask
Off-UI инструменты
● Thread
● AsyncTask
● Loader
Off-UI инструменты
● Thread
● AsyncTask
● Loader
● AsyncQueryHandler
● обработка отмены задач
Что может пойти не так
● обработка отмены задач
● orientation changes
Что может пойти не так
● обработка отмены задач
● orientation changes
● CursorAdapter
Что может пойти не так
● обработка отмены задач
● orientation changes
● CursorAdapter
● нотификация об изменениях
Что может пойти не так
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a
notification. Make sure the content of your adapter is not modified from a background thread, but only from
the UI thread.
Что выбрали мы
Операция над данными
● Асинхронная операция — шаблон Command
● Операция над сущностями БД:
Группа операций
● Шаблон Composer
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл Филимонов (Mail.Ru Group)
Команда для Database пула
SQLite и ORMLite: транзакции
● SQLite
SQLite и ORMLite: транзакции
● SQLite
● ORMLite
Реализация команды с транзакцией
● Entity — базовый класс сущности
● ID - тип идентификатора
● тело request() будет выполнено в рамках транзакции
Доступ к результам из UI
“Ближе — проще”, unknown
Доступ к результам из UI
“Ближе — проще”, unknown
● закэшированы в памяти
Доступ к результам из UI
“Ближе — проще”, unknown
● закэшированы в памяти
● доступны из UI
DAO cache && UI cache
DAO object cache flow
Операции, обновляющие кэш:
● dao.create(...)
● dao.query(...)
● dao.delete(...)
DAO object cache flow
Операции, НЕ обновляющие кэш:
● dao.update(...)
● dao.update(PreparedUpdate)
DAO object cache flow
DAO object cache flow
CustomDao поддерживает обновления в ObjectCache
Взаимодействие кэшей
● тип операции
● класс сущности
● объект
Кэш операция
Буферизация операций
Буферизация нотификаций
● EntityManager
Получение данных из кэша
● EntityManager
● getFromCache(...)
Получение данных из кэша
● EntityManager
● getFromCache(...)
● loadMore(...)
Получение данных из кэша
● EntityManager
● getFromCache(...)
● loadMore(...)
● refresh(...)
Получение данных из кэша
● построение поисковых индексов в фоне
● индекс строится при изменении данных в объектном кэше
● передача построенного индекса в UI поток
● быстрый поиск в UI
Поиск
До:
● результаты > 1 сек
● progress bar на экране
После:
● результаты ~20 мс
● дополняются серверными результами
Поиск
Контакты
mailto: k.filimonov@corp.mail.ru
twitter.com/ fallfromheight
Кирилл Филимонов

More Related Content

PDF
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
PPTX
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
PDF
Как не положить тысячи серверов с помощью системы централизованного управлени...
PPTX
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
PDF
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
PDF
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
PDF
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
PDF
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
Как не положить тысячи серверов с помощью системы централизованного управлени...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...

What's hot (20)

PPTX
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
PDF
"Новые возможности MySQL 5.7"
PDF
Javascript-фреймворки:
 должен остаться только один
PPTX
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
PDF
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
PDF
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
PPTX
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
PDF
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
PDF
Конструктор / Денис Паясь (Яндекс)
PDF
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
PDF
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
PDF
"Производительность MySQL: что нового?"
PPTX
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
PDF
Использование haproxy/iptables+etcd+confd для автоматического service discove...
PDF
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
PPTX
Организация надежного резервного копирования веб-проекта. Практика и подводны...
PDF
Андрей Ситник
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
"Новые возможности MySQL 5.7"
Javascript-фреймворки:
 должен остаться только один
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Конструктор / Денис Паясь (Яндекс)
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
"Производительность MySQL: что нового?"
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Использование haproxy/iptables+etcd+confd для автоматического service discove...
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Андрей Ситник
Ad

Viewers also liked (19)

PDF
Фёдор Строк - Базы данных - SQL, ORM, NoSQL
PPT
использование Hibernate java persistence.part 2.
PPTX
Data Access Layer как страховка на случай миграции СУБД
PDF
Продуктивная разработка Java EE-приложений с применением Oracle ADF
PDF
Android - 13 - Database
PDF
Лекция #2. Принцип организации World Wide Web
ODP
Работа с платежными системами в Django (Paypal, WebMoney)
PDF
Лекция #7. Django ORM
PDF
Лекция #6. Введение в Django web-framework
PDF
Лекция #3. Введение в языки разметки web-страниц
PDF
Лекция #4. Каскадные таблицы стилей
PPTX
django-and-postgresql
PDF
Лекция #1. Основы Web-технологий
PDF
ORM_Presentation (1)
PPTX
Управление Данными. Лекция 5
PDF
Лекция #5. Введение в язык программирования Python 3
PPTX
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
PDF
Лекция Android. БД SQLite, ContentProvider, Loader
PDF
Devclub 01/2017 - (Не)адекватное Java-интервью
Фёдор Строк - Базы данных - SQL, ORM, NoSQL
использование Hibernate java persistence.part 2.
Data Access Layer как страховка на случай миграции СУБД
Продуктивная разработка Java EE-приложений с применением Oracle ADF
Android - 13 - Database
Лекция #2. Принцип организации World Wide Web
Работа с платежными системами в Django (Paypal, WebMoney)
Лекция #7. Django ORM
Лекция #6. Введение в Django web-framework
Лекция #3. Введение в языки разметки web-страниц
Лекция #4. Каскадные таблицы стилей
django-and-postgresql
Лекция #1. Основы Web-технологий
ORM_Presentation (1)
Управление Данными. Лекция 5
Лекция #5. Введение в язык программирования Python 3
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Лекция Android. БД SQLite, ContentProvider, Loader
Devclub 01/2017 - (Не)адекватное Java-интервью
Ad

Similar to Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл Филимонов (Mail.Ru Group) (20)

PDF
Database (Lecture 14 – database)
PDF
Mobile Fest#spb 2012
PDF
Android Telegram S Optimizations
PDF
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
PPTX
Приложения для Windows Phone: как мы это делаем #codefest
PDF
Электронный архив
PDF
Разработка Enterprise-приложения на основе Spring Framework
PDF
CQRS на практике. В поиске точки масштабирования и новых метафор
PPTX
Асинхронный биллинг для службы такси - IzhDevCom November 2014
PDF
Как жить в согласии с SOLID?
PPTX
Ddd happy dev-2013-tsepkov
PDF
CompanyMedia-Next - Architecture (Vladimir Panov, 26.12.2011)
PPT
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
PDF
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
PPTX
Как 7 студентов и филолог делали сложный проект
PPTX
Как 7 студентов и филолог делали сложный проект
PDF
1С Документооборот
PDF
Java Persistence API (JPA) Basics
PPTX
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
PPTX
Разработка ПО. Введение в специальность 3. Требования
Database (Lecture 14 – database)
Mobile Fest#spb 2012
Android Telegram S Optimizations
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
Приложения для Windows Phone: как мы это делаем #codefest
Электронный архив
Разработка Enterprise-приложения на основе Spring Framework
CQRS на практике. В поиске точки масштабирования и новых метафор
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Как жить в согласии с SOLID?
Ddd happy dev-2013-tsepkov
CompanyMedia-Next - Architecture (Vladimir Panov, 26.12.2011)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Как 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проект
1С Документооборот
Java Persistence API (JPA) Basics
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Разработка ПО. Введение в специальность 3. Требования

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл Филимонов (Mail.Ru Group)