SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
Есть ли жизнь в
оффлайне?
Кеш, транзакционный лог
и проблемы
синхронизации
Русанов Петр
LinguaLeo
http://lingualeo.com
Зачем нам оффлайн если
интернет есть везде?
В городах полно Wi-Fi спотов
На улице есть 3G
Интернет есть даже в
транспорте
И в самых неожиданных
местах
• На Северном полюсе
• На вершине горы Эверест
• В пустынях ОАЭ
• На МКС
Вроде бы все прекрасно,
все счастливы и можно
не париться
К сожалению, реальность
такова:
• 3G доступен только в больших городах, покрытие не 100%
• 3G не везде безлимитный, порой очень дорогой
• В роуминге цены на 3G достигают безумных цифр
• Интернет в самолетах стоит примерно ~$20 за 10 Mб, средняя
скорость ~0.05 Мбит/сек
• В метро связь доступна только на станциях и то не на всех
• Даже домашний интернет могут отключить, если забыл оплатить :)
История из жизни
Лечу в Новосибирск на
CodeFest
Лететь долго, заняться
нечем
Выучу пожалуй
пару фраз на
испанском
WHUUUT??
Итого
• Пользователю все равно: находится он в
онлайне или нет, доступна сейчас сеть или
пропала
• Пользователи расстраиваются если
приложение перестает функционировать в
отсутствии интернета
• При дальних перелетах/поездках/в метро у
людей полно свободного времени, но нет
интернета — это НУЖНО использовать,
особенно в образовательных приложениях, где
львиную долю функций можно реализовать без
необходиомости постоянного доступа к сети
Есть решение!
• Кеширование медиа-файлов
• Хранение всех пользовательских
данных в локальной БД
• Сохранение действий пользователя,
произведенных в оффлайне
• Синхронизация с сервером при
появлении доступа к сети
Кеширование
Кеши бывают разные
Требования
1. Возможность хранения данных
не только в памяти, но и на
диске
2. Поддержка политик
(изменяемое поведение для
разных типов запросов)
3. Строгое следование заголовкам
HTTP, обозначающим правила
кеширования и перевалидации
(Cache-Control, Expires, Last-
Modified)
4. Возможность отправки
conditional GET
HTTP code: 200
Age: 0
Via: 1.1 varnish
X-Varnish: 1103200550
Accept-Ranges: bytes, bytes
Last-Modified: Tue, 11 Sep 2012 14:01:07 GMT
Content-Type: audio/mpeg
Connection: keep-alive
Expires: Tue, 26 Mar 2013 18:32:41 GMT
Server: nginx/1.2.7
Content-Length: 4752
Date: Tue, 19 Mar 2013 18:32:41 GMT
Cache-Control: max-age=604800
Что кешировать?
• НЕ нужно кешировать всё - долго и
занимает много места на диске
• Данные, без которых оффлайн работа
будет невозможна
• Опциональные наборы данных лучше
кешировать по запросу пользователя
Политики кеширования
•Политика определяет поведение при наличии закешированных данных
и при ошибке
•Оффлайн режим для разработчика по сути представляет собой
выполнение всех запросов с ошибкой
•Для запросов данных, которые предполагается кешировать для
оффлайн работы, важно указать именно политику при ошибке (напр. в
ASIHTTPRequest для iOS это ASIFallbackToCacheIfLoadFailsCachePolicy)
•В оффлайне лучше показать устаревшие данные, чем ошибку
Итого
• Выбираем правильную библиотеку для
кеширования, соответствующую
описанным требованиям
• Выставляем правильные политики для
кешируемых запросов
• Реализуем выборочное кеширование и
по запросу пользователя
Сохраняем историю
действий пользователя
Я знаю, что вы сделали
прошлым летом
Пока пользователь находится
вне зоны доступа, кроме
использования закешированных
данных важно хранить историю
его действий для последующей
синхронизации с сервером
Для этого нужно понятное,
автоматизированное и
прозрачное решение, которое не
требует значительных
изменений в коде
Не нужно изобретать
велосипед
Можно использовать принцип, аналогичный триггерам в
транзакционных SQL или хукам вVCS (post commit):
Пользователь
совершил
действие
Изменился
объект в БД
Произошел
commit в базу
Сработал
post-commit
hook
Изменение
сохранилось в лог
• Доступ к данным осуществляется исключительно через Data Access
Objects (DAO), полностью инкапсулирующих в себе работу с БД
• Через proxy-классы перехватываются методы DAO для добавления/
удаления/изменения объектов и устанавливаются transaction
listener-ы в качестве post-commit хуков (триггеров)
• Сразу после коммита в БД вызываются transaction listener-ы и
сохраняют изменения в БД в виде записей транзакционного лога,
содержащие тип операции (добавление/удаление/изменение),
таймштамп, сам измененный объект и вспомогательные данные
• Взаимоисключающие и дополняющие операции объединяются для
компактности данных
Реализация: как это сделано
в LinguaLeo
Реализация: DAO и
вложенные транзакции
В каждом объекте DAO имеется экземпляр объекта транзакции
В основе объекта транзакции лежит счетчик открытых и закрытых
транзакций (аналогично счетчику ссылок retainCount у NSObject в
Objective-C)
При выполнении [transaction begin] счетчик увеличивается
При выполнении [transaction commit] счетчик уменьшается
Как только счетчик стал равен нулю, выполняется реальный commit в
базу данных и сразу после выполняется метод didCommitTransaction у
всех transaction listener-ов
Пример: transaction listener
и DAO
@implementation LLLoggingOfAddingBonusTransactionListener
- (void)didCommittedTransaction {
LLTransactionLogRecord *record = [LLTransactionLogRecord bonusLog];
record.operation = @(LLOperationTypeInsert);
record.loggedEntity = self.bonus;
[self.transactionLogDAO insertRecord:record];
}
@end
@protocol LLQuestDAO <LLDAO>
- (void)deleteAllBonuses;
- (NSArray *)bonusesForType:(LLQuestType)type;
- (void)insertBonus:(LLBonus *)bonus;
- (void)udpateBonus:(LLBonus *)bonus;
- (LLQuest *)currentQuestStateForType:(LLQuestType)type;
- (void)updateCurrentQuestState:(LLQuest *)questState forType:(LLQuestType)type;
@end
Пример: proxy-класс для
DAO
@implementation LLAOPLoggingDAOProxy
+ (id)newProxyForWordDAO:(id <LLWordDAO>)wordDAO {
id result = [[[LLAOPLoggingDAOProxy alloc] initWithInstance:wordDAO] autorelease];
[result interceptMethodEndForSelector:@selector(insertWordsToUserDictionary:)
interceptorSelector:@selector(logAddingNewWords:)];
[result interceptMethodEndForSelector:@selector(insertWordsFromGlossaryToUserDictionary:)
interceptorSelector:@selector(logAddingNewWordFromSimpleWords:)];
[result interceptMethodStartForSelector:@selector(updateWord:)
interceptorSelector:@selector(logUpdatingWord:)];
[result interceptMethodStartForSelector:@selector(updateWords:)
interceptorSelector:@selector(logUpdatingWords:)];
[result interceptMethodStartForSelector:@selector(deleteWordsFromUserDictionary:)
interceptorSelector:@selector(logDeletingWords:)];
[result interceptMethodStartForSelector:@selector(updateSimpleWords:asKnown:)
interceptorSelector:@selector(logUpdatingSimpleWord:)];
return result;
}
@end
Пример: транзакционный лог
В итоге лог выглядит примерно так:
[
{
'data': { ... },//поля объекта класса LLBonus
'entity_type':1,//тип сущности (LLBonus)
'operation':0,//тип операции (0 - вставка, 1 - обновление, 2 - удаление)
'timestamp':'2013-02-20T10:33:46+0200'//таймштамп
},
{
'data': { ... },
'entity_type':0,//LLWord
'operation':1,//обновить
'timestamp':'2013-02-21T11:25:40+0200'
}
...
]
Итого
• Всю работу с БД осуществляем в
DAO
• Сохраняем все действия
пользователя в лог не смотря на
наличие/отсутствие сети
• Стараемся сделать лог компактным,
объединяя записи
Синхронизация
Да будет сеть!
Как только появляется доступ к сети,
нужно синхронизовать данные с
сервером:
• отправить на сервер сохраненные
операции
• принять операции от сервера,
совершенные на сайте и других
устройствах
• данных могло накопиться много -
нужно упаковать данные, чтобы
синхронизация прошла быстро и не
"съела" много траффика
Проблемы синхронизации	

У пользователя может быть несколько
устройств
Какие-то из них могут находиться в
оффлайне
В них будет накапливаться история
операций на основе устаревших
данных
При выходе этих устройств в сеть
могут возникать конфликты
Ничего не напоминает?
Принцип VCS для
синхронизации	

Это самый обычный кейс для систем
контроля версий вроде SVN или Git
Все решается вводом численного
обозначения ревизии данных (или хеша),
которое контролирует сервер
При синхронизации:
Если на устройстве устаревшая версия
данных, сначала накатываются и мержатся
изменения с сервера (svn up/git pull) и
только затем делается аплоад накопившихся
операций на сервер (svn commit/git push)
Синхронизация: схема VCS
rev 0
register
rev 0
login
rev 0
добавить ‘get up’
с переводом ‘вставать’
добавить ‘get up’
с переводом ‘дорожать’
sync
push
rev 1
sync
push
client
revison
is old!
sync
pull
MERGE
with
rev 1
sync
push
rev 2
sync
pull
rev 2
обновить ‘get up’:
перевод ‘дорожать’
rev 2
Итого
• Регулярно делаем синхронизацию,
чтобы минимизировать объем
отправляемых данных за раз
• Применяем методы синхронизации
из систем контроля версий
• При неудачной синхронизации
делаем rollback
Русанов Петр,
LinguaLeo
http://lingualeo.com
prusanov@lingualeo.com
+7 (920) 0269579
я
Вопросы?

Weitere ähnliche Inhalte

Was ist angesagt?

AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...Ontico
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksRoman Pavlushko
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Lenvendo
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеAlexandr Krasheninnikov
 
Anton Turetckii "What does it take to build a host?"
Anton Turetckii "What does it take to build a host?"Anton Turetckii "What does it take to build a host?"
Anton Turetckii "What does it take to build a host?"Fwdays
 
Что нам стоит REST Client построить
Что нам стоит REST Client построитьЧто нам стоит REST Client построить
Что нам стоит REST Client построитьMatvey Malkov
 
Блокчейн, консенсус - как и зачем? #spblockchain
Блокчейн, консенсус - как и зачем? #spblockchainБлокчейн, консенсус - как и зачем? #spblockchain
Блокчейн, консенсус - как и зачем? #spblockchainДмитрий Плахов
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Ontico
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковFuenteovejuna
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
 

Was ist angesagt? (15)

Avito Stachka 2012
Avito Stachka 2012Avito Stachka 2012
Avito Stachka 2012
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Anton Turetckii "What does it take to build a host?"
Anton Turetckii "What does it take to build a host?"Anton Turetckii "What does it take to build a host?"
Anton Turetckii "What does it take to build a host?"
 
Что нам стоит REST Client построить
Что нам стоит REST Client построитьЧто нам стоит REST Client построить
Что нам стоит REST Client построить
 
JSON-RPC
JSON-RPCJSON-RPC
JSON-RPC
 
Блокчейн, консенсус - как и зачем? #spblockchain
Блокчейн, консенсус - как и зачем? #spblockchainБлокчейн, консенсус - как и зачем? #spblockchain
Блокчейн, консенсус - как и зачем? #spblockchain
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 

Andere mochten auch

CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest
 
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузкиCodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузкиCodeFest
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest
 
Keynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayKeynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayCodeFest
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest
 
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...CodeFest
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest
 
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest
 
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest
 
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest
 
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest
 

Andere mochten auch (20)

CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомления
 
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузкиCodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
 
Keynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development TodayKeynote: Challenges, Pains and Points of Software Development Today
Keynote: Challenges, Pains and Points of Software Development Today
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
 
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...
CodeFest 2011. Токарев О — Конструирование кода: «Думай верно!» (или 5 Правил...
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
 
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
 
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
 
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
 
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
 

Ähnlich wie CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог и проблемы синхронизации

Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Fwdays
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Yandex Lego олег оболенский
Yandex Lego   олег оболенскийYandex Lego   олег оболенский
Yandex Lego олег оболенскийMedia Gorod
 
Павел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыПавел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыUA Mobile
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основыAlex Chistyakov
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Ivan Fedorov
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Ontico
 
Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Nikolay Sivko
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияBadoo Development
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into BadooAnton Turetsky
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияNicolay Velizhanin
 
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...Ontico
 

Ähnlich wie CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог и проблемы синхронизации (20)

Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
Sivko
SivkoSivko
Sivko
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Yandex Lego олег оболенский
Yandex Lego   олег оболенскийYandex Lego   олег оболенский
Yandex Lego олег оболенский
 
Павел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузерыПавел Юрийчук - Разработка приложений под мобильные браузеры
Павел Юрийчук - Разработка приложений под мобильные браузеры
 
Информационная безопасность в веб - основы
Информационная безопасность в веб - основыИнформационная безопасность в веб - основы
Информационная безопасность в веб - основы
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
 
Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрация
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
 
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
Хранилище данных Avito: аналитика для микросервисной архитектуры / Артем Дани...
 

Mehr von CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Mehr von CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог и проблемы синхронизации

  • 1. Есть ли жизнь в оффлайне? Кеш, транзакционный лог и проблемы синхронизации Русанов Петр LinguaLeo http://lingualeo.com
  • 2. Зачем нам оффлайн если интернет есть везде?
  • 3. В городах полно Wi-Fi спотов
  • 5. Интернет есть даже в транспорте
  • 6. И в самых неожиданных местах • На Северном полюсе • На вершине горы Эверест • В пустынях ОАЭ • На МКС
  • 7. Вроде бы все прекрасно, все счастливы и можно не париться
  • 8. К сожалению, реальность такова: • 3G доступен только в больших городах, покрытие не 100% • 3G не везде безлимитный, порой очень дорогой • В роуминге цены на 3G достигают безумных цифр • Интернет в самолетах стоит примерно ~$20 за 10 Mб, средняя скорость ~0.05 Мбит/сек • В метро связь доступна только на станциях и то не на всех • Даже домашний интернет могут отключить, если забыл оплатить :)
  • 11. Лететь долго, заняться нечем Выучу пожалуй пару фраз на испанском
  • 12.
  • 14. Итого • Пользователю все равно: находится он в онлайне или нет, доступна сейчас сеть или пропала • Пользователи расстраиваются если приложение перестает функционировать в отсутствии интернета • При дальних перелетах/поездках/в метро у людей полно свободного времени, но нет интернета — это НУЖНО использовать, особенно в образовательных приложениях, где львиную долю функций можно реализовать без необходиомости постоянного доступа к сети
  • 15. Есть решение! • Кеширование медиа-файлов • Хранение всех пользовательских данных в локальной БД • Сохранение действий пользователя, произведенных в оффлайне • Синхронизация с сервером при появлении доступа к сети
  • 17. Кеши бывают разные Требования 1. Возможность хранения данных не только в памяти, но и на диске 2. Поддержка политик (изменяемое поведение для разных типов запросов) 3. Строгое следование заголовкам HTTP, обозначающим правила кеширования и перевалидации (Cache-Control, Expires, Last- Modified) 4. Возможность отправки conditional GET HTTP code: 200 Age: 0 Via: 1.1 varnish X-Varnish: 1103200550 Accept-Ranges: bytes, bytes Last-Modified: Tue, 11 Sep 2012 14:01:07 GMT Content-Type: audio/mpeg Connection: keep-alive Expires: Tue, 26 Mar 2013 18:32:41 GMT Server: nginx/1.2.7 Content-Length: 4752 Date: Tue, 19 Mar 2013 18:32:41 GMT Cache-Control: max-age=604800
  • 18. Что кешировать? • НЕ нужно кешировать всё - долго и занимает много места на диске • Данные, без которых оффлайн работа будет невозможна • Опциональные наборы данных лучше кешировать по запросу пользователя
  • 19. Политики кеширования •Политика определяет поведение при наличии закешированных данных и при ошибке •Оффлайн режим для разработчика по сути представляет собой выполнение всех запросов с ошибкой •Для запросов данных, которые предполагается кешировать для оффлайн работы, важно указать именно политику при ошибке (напр. в ASIHTTPRequest для iOS это ASIFallbackToCacheIfLoadFailsCachePolicy) •В оффлайне лучше показать устаревшие данные, чем ошибку
  • 20. Итого • Выбираем правильную библиотеку для кеширования, соответствующую описанным требованиям • Выставляем правильные политики для кешируемых запросов • Реализуем выборочное кеширование и по запросу пользователя
  • 22. Я знаю, что вы сделали прошлым летом Пока пользователь находится вне зоны доступа, кроме использования закешированных данных важно хранить историю его действий для последующей синхронизации с сервером Для этого нужно понятное, автоматизированное и прозрачное решение, которое не требует значительных изменений в коде
  • 23. Не нужно изобретать велосипед Можно использовать принцип, аналогичный триггерам в транзакционных SQL или хукам вVCS (post commit): Пользователь совершил действие Изменился объект в БД Произошел commit в базу Сработал post-commit hook Изменение сохранилось в лог
  • 24. • Доступ к данным осуществляется исключительно через Data Access Objects (DAO), полностью инкапсулирующих в себе работу с БД • Через proxy-классы перехватываются методы DAO для добавления/ удаления/изменения объектов и устанавливаются transaction listener-ы в качестве post-commit хуков (триггеров) • Сразу после коммита в БД вызываются transaction listener-ы и сохраняют изменения в БД в виде записей транзакционного лога, содержащие тип операции (добавление/удаление/изменение), таймштамп, сам измененный объект и вспомогательные данные • Взаимоисключающие и дополняющие операции объединяются для компактности данных Реализация: как это сделано в LinguaLeo
  • 25. Реализация: DAO и вложенные транзакции В каждом объекте DAO имеется экземпляр объекта транзакции В основе объекта транзакции лежит счетчик открытых и закрытых транзакций (аналогично счетчику ссылок retainCount у NSObject в Objective-C) При выполнении [transaction begin] счетчик увеличивается При выполнении [transaction commit] счетчик уменьшается Как только счетчик стал равен нулю, выполняется реальный commit в базу данных и сразу после выполняется метод didCommitTransaction у всех transaction listener-ов
  • 26. Пример: transaction listener и DAO @implementation LLLoggingOfAddingBonusTransactionListener - (void)didCommittedTransaction { LLTransactionLogRecord *record = [LLTransactionLogRecord bonusLog]; record.operation = @(LLOperationTypeInsert); record.loggedEntity = self.bonus; [self.transactionLogDAO insertRecord:record]; } @end @protocol LLQuestDAO <LLDAO> - (void)deleteAllBonuses; - (NSArray *)bonusesForType:(LLQuestType)type; - (void)insertBonus:(LLBonus *)bonus; - (void)udpateBonus:(LLBonus *)bonus; - (LLQuest *)currentQuestStateForType:(LLQuestType)type; - (void)updateCurrentQuestState:(LLQuest *)questState forType:(LLQuestType)type; @end
  • 27. Пример: proxy-класс для DAO @implementation LLAOPLoggingDAOProxy + (id)newProxyForWordDAO:(id <LLWordDAO>)wordDAO { id result = [[[LLAOPLoggingDAOProxy alloc] initWithInstance:wordDAO] autorelease]; [result interceptMethodEndForSelector:@selector(insertWordsToUserDictionary:) interceptorSelector:@selector(logAddingNewWords:)]; [result interceptMethodEndForSelector:@selector(insertWordsFromGlossaryToUserDictionary:) interceptorSelector:@selector(logAddingNewWordFromSimpleWords:)]; [result interceptMethodStartForSelector:@selector(updateWord:) interceptorSelector:@selector(logUpdatingWord:)]; [result interceptMethodStartForSelector:@selector(updateWords:) interceptorSelector:@selector(logUpdatingWords:)]; [result interceptMethodStartForSelector:@selector(deleteWordsFromUserDictionary:) interceptorSelector:@selector(logDeletingWords:)]; [result interceptMethodStartForSelector:@selector(updateSimpleWords:asKnown:) interceptorSelector:@selector(logUpdatingSimpleWord:)]; return result; } @end
  • 28. Пример: транзакционный лог В итоге лог выглядит примерно так: [ { 'data': { ... },//поля объекта класса LLBonus 'entity_type':1,//тип сущности (LLBonus) 'operation':0,//тип операции (0 - вставка, 1 - обновление, 2 - удаление) 'timestamp':'2013-02-20T10:33:46+0200'//таймштамп }, { 'data': { ... }, 'entity_type':0,//LLWord 'operation':1,//обновить 'timestamp':'2013-02-21T11:25:40+0200' } ... ]
  • 29. Итого • Всю работу с БД осуществляем в DAO • Сохраняем все действия пользователя в лог не смотря на наличие/отсутствие сети • Стараемся сделать лог компактным, объединяя записи
  • 31. Да будет сеть! Как только появляется доступ к сети, нужно синхронизовать данные с сервером: • отправить на сервер сохраненные операции • принять операции от сервера, совершенные на сайте и других устройствах • данных могло накопиться много - нужно упаковать данные, чтобы синхронизация прошла быстро и не "съела" много траффика
  • 32. Проблемы синхронизации У пользователя может быть несколько устройств Какие-то из них могут находиться в оффлайне В них будет накапливаться история операций на основе устаревших данных При выходе этих устройств в сеть могут возникать конфликты
  • 34. Принцип VCS для синхронизации Это самый обычный кейс для систем контроля версий вроде SVN или Git Все решается вводом численного обозначения ревизии данных (или хеша), которое контролирует сервер При синхронизации: Если на устройстве устаревшая версия данных, сначала накатываются и мержатся изменения с сервера (svn up/git pull) и только затем делается аплоад накопившихся операций на сервер (svn commit/git push)
  • 35. Синхронизация: схема VCS rev 0 register rev 0 login rev 0 добавить ‘get up’ с переводом ‘вставать’ добавить ‘get up’ с переводом ‘дорожать’ sync push rev 1 sync push client revison is old! sync pull MERGE with rev 1 sync push rev 2 sync pull rev 2 обновить ‘get up’: перевод ‘дорожать’ rev 2
  • 36. Итого • Регулярно делаем синхронизацию, чтобы минимизировать объем отправляемых данных за раз • Применяем методы синхронизации из систем контроля версий • При неудачной синхронизации делаем rollback