0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf ·...

45
Данные на фронтенде Никита Прокопов @nikitonsky

Upload: others

Post on 23-May-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Данные на фронтенде

Никита Прокопов@nikitonsky

Page 2: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

I · Вкус будущего

Page 3: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Сервер

Клиентданные

данные

Page 4: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Сервер

Клиент

Page 5: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Приложение 2

Приложение 1

Page 6: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Приложение 2

Приложение 1данные

данные

данные

Page 7: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

× Совместное редактирование× Обновления в реальном времени× Редактирование без интернета

«Опыт присутствия»

Page 8: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some
Page 9: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some
Page 10: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

× Корректность× Сходимость× Полнота× Экономность× Производительность

Page 11: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Эти проблемы

× нетривиальны× заметны людям× даже на простых случаях× даже в простых приложениях

Page 12: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Google

iPhone Macintosh

iCloud

Page 13: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

II · Поиск опоры

Page 14: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

БД Подписки Доступ Доставка МодельРендер

Оптими-стичныйкэш

Page 15: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Серверная БД

Реактивная

Прямое API

RethinkDB, Datomic, Mongo oplog, ...

Page 16: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Роутинг подписок

«Обратный» SQL

Лучше чем O(N×M)

Динамическая конфигурация

Уборка мусора

Page 17: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Контроль доступа

Гибкость

Декларативность

Производительность

Page 18: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Канал доставки

Реального времени

Переподключения

Мониторинг

Page 19: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Клиентская БД

Реактивная

Фоновая синхронизация

Локальное хранение

Minimongo, PouchDB, DataScript

Page 20: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Оптимистичный кэш

Локальные чтения/запись

Откатываемый

Локальное хранение

Page 21: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Синхронизация

Фоновая

Надежная

Инкрементальная

Page 22: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Операции (REST, RPC, ф-ии) — Модель данных —

API синхронизации

Page 23: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Таб браузера

localStorage

Сервер Сервер

Реплика БД Реплика БД

Availabilityzone

Еще таб

Мобильноеприложение

Page 24: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Конфликты

Нормальная ситуация

Удобная модель работы:

× обнаружение

× разрешение

Page 25: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Разрешение конфликтов

Last write wins

Optimistic concurency

Ручной merge на клиенте

Автоматический merge

Page 26: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

БД Подписки Доступ Доставка МодельРендер

Оптими-стичныйкэш

Page 27: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

III · Положение дел

Page 28: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some
Page 29: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Meteor

Реактивные подписки

Оффлайн-режим

Модель безопасности

Протокол синхронизации

Page 30: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Meteor

Last write wins

Медленные подписки

Большой footprint живых клиентов

Нет локального хранения

Page 31: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Firebase

Page 32: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Firebase

Реактивные подписки

Оффлайн-режим

Optional asserts before write

Server acks

Page 33: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Firebase

Last write wins

Нет локального хранения

Page 34: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

pouchdb

Page 35: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

PouchDB

Оффлайн-режим

CAS updates

Eventual conflict resolution

Есть документ про конфликты

Page 36: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

PouchDB

Some write wins

Решение конфликтов необязательно

Очень низкоуровневое API

Page 37: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Relay

Page 38: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Relay + GraphQL

Нет оффлайна

Last write wins

Нет реактивных подписок

Проблемы кеша: растет и протухает

Page 39: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

horizon

Page 40: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

RethinkDB + Horizon

Реляционная модель

Богатые SQL-like подписки

Эффективные подписки

Page 41: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

CRDTs

Можно безопасно мержить

Ограниченная применимость

Как правило, только растут

Отдельно проверять полноту

Page 42: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Синхронизация текста

Отдельная дисциплина специальнойолимпиады

Готовые решения не валяются

Operational transformation, CRDT

Page 43: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

IV. Эпилог

Page 44: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

Web 1.0

HTTP

Web 2.0

XHRWebSocket

Ожидания

Сегодняшнийдоклад

Page 45: 0 @nikitonskypublic.jugru.org/holyjs/2016/spb/day_1/track_1/prokopov.pdf · PouchDB!""#$%& -'()*+ CAS updates Eventual conßict resolution,-./ 0123+(&. 4'1 21&"#*2.5. PouchDB Some

@nikitonskytonsky.metonsky.livejournal.com HolyJS 2016