Одно постоянное соединение на все вкладки сайта (Глеб...

50
Одно постоянное соединение на все вкладки сайта Глеб Арестов, веб-технолог, Мамба

Transcript of Одно постоянное соединение на все вкладки сайта (Глеб...

Page 1: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Одно постоянное соединение на все вкладки сайтаГлеб Арестов,

веб-технолог, Мамба

Page 2: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Одно соединение — это хорошо

– Comet использует постоянное соединение

– Нагрузка на сетевое оборудование

– Мобильные устройства

– Ограничения браузеров

Page 3: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Одно соединение — это хорошо

– Comet использует постоянное соединение

– Нагрузка на сетевое оборудование

– Мобильные устройства

– Ограничения браузеров

Page 4: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

http://b23.ru/y5o5browserscope.org/?category=network&v=top

Firefox 14 6IE 8 6Opera 12 6Android 2.3 9iPhone 4 4IE 7.0 2

Page 5: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Решения для обхода ограничений

– shared web worker

– localStorage c onstorage

– flash

– когда совсем ничего нет – субдомены

Page 6: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Решения для обхода ограничений

– shared web worker

– localStorage c onstorage

– flash

– когда совсем ничего нет – субдомены

Page 7: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

localStorage.setItem(‘name’, ‘Gleb’);

Page 8: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

window.onstorage(function(event){

event.key //”name”

event.newValue // “Gleb“

});

Page 9: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

window.onstorage(function(event){

event.key //”name”

event.newValue// “Gleb“

});

Срабатывает только если вкладка активна

Page 10: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Как оставить одно соединение

– системно разделять данные

– знать, есть ли уже соединение или нет

– уметь передавать данные между вкладками

Page 11: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Как оставить одно соединение

– системно разделять данные

– знать, есть ли уже соединение или нет

– уметь передавать данные между вкладками

Page 12: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Система разделения данных

– Оперативные данные отправляются в каналы

– Каждый канал служит для своей задачи

Page 13: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

публикация в канал

total_users_counter

CometPublish/Subscribe

подписка на канал

total_users_counter

Page 14: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

PHP Comet

подписка

публикация

Page 15: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

PHP Comet

«5 новых»3

Page 16: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

PHP Comet

«5 новых»3

Page 17: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

{ “jsonrpc”: “2.0”, “id”: 1, “result”: [{ “channel”: “mamba.messenger.counter.173963799”, “action”: “replace”, “limit”: 1, “lifetime”: 600, “cursor”: 1350389631154392, “identity”: “173963799”, “key”: 173963799, “content”: { “count_all”: 2999, “count_unread”: 5 } }]}

Page 18: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Как оставить одно соединение

– системно разделять данные

– знать, есть ли уже соединение или нет

– уметь передавать данные между вкладками

Page 19: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Есть ли уже соединение или нет?

– Cоглашение — только “главная” вкладка занимается соединением

– Остальные вкладки следят, чтобы “главной” кто-то был

Page 20: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

– Вкладка может осознавать себя главной

– Главная вкладка общается с сервером

– Главная общается с другими вкладками

– Любая вкладка стремиться стать главной

интернеты

Page 21: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Какая вкладка главная – У вкладок есть id

– “я главная” каждые 300 мс и когда открывается новая вкладка

– Последний отчёт не старше секунды

– Допускается, что главная может перестать быть главной

Page 22: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

“главная” подтверждает своё существование

– localStorage.setItem(‘xd-master’, ...);

– каждые 300 мс

– при изменении ячейки “xd-master-pretendent”

– новые вкладки:

...setItem(‘xd-master-pretendent’, my_id);

Page 23: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

.setItem(‘xd-master’, my_id + ‘ ‘ + now());

Page 24: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

window.onstorage = function(e){

if (e.key == ‘xd-master‘){

...

}

};

Page 25: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

Главная Второстепенная

0 onstoragesetTimeout()

Page 26: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300

onstoragesetTimeout()

onstoragesetTimeout()

Page 27: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300453

onstoragesetTimeout()

onstoragesetTimeout()

Page 28: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300453600

onstoragesetTimeout()

onstoragesetTimeout()

Page 29: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300453600

900

onstoragesetTimeout()

onstoragesetTimeout()

Page 30: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300453600

900

1200

onstoragesetTimeout()

onstoragesetTimeout()

Page 31: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

Главная Второстепенная

0

300453600

900

12001300

1 sec

onstoragesetTimeout()

onstoragesetTimeout()

Page 32: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная Второстепеннаяms

setItem

setItem

проверка, setItem()

Главная Второстепенная

0

300453600

900

12001300

1 sec

onstoragesetTimeout()

onstoragesetTimeout()

Page 33: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная может перестать быть главной

– Главная может быть занята, а не закрыта

– Главная должна смириться с тем, что она больше не главная

Page 34: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Как оставить одно соединение

– системно разделять данные

– знать, есть ли уже соединение или нет

– уметь передавать данные между вкладками

Page 35: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Обмен данными между вкладками

– Все должны получить данные, полученные от сервера

– “Главная” должна знать, что нужно другим

Page 36: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Обмен данными между вкладками

– Все должны получить данные, полученные от сервера

– “Главная” должна знать, что нужно другим

Page 37: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

.setItem(‘xd-message’, {data: “...”})

Page 38: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

window.onstorage = function(e){ if (e.key == ‘xd-message’){ ... }};

Page 39: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Обмен данными между вкладками

– Все должны получить данные, полученные от сервера

– “Главная” должна знать, что нужно другим

Page 40: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage

.setItem(‘xd-message’, {data: “...”})

Page 41: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

window.onstorage = function(e){ if (e.key == ‘xd-message’){ ... }};

Page 42: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Обмен данными между вкладками

– Все должны получить данные, полученные от сервера

– “Главная” должна знать, что нужно другим

Page 43: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Главная не знает что не нужно другим

– Вкладки запрашивают каналы

– Вкладки закрываются - список каналов накапливается

– Отказываемся от получения ненужного

– При закрытии “главной” восстанавливаем поток необходимых каналов (xd-message)

Page 44: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Как оставить одно соединение

– системно разделять данные

– знать - есть ли уже соединение или нет

– уметь передавать данные между вкладками

Page 45: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

localStorage без события onstorage

– нужно получать изменения

– как можно скорее

– все (ничего не потерять)

– производительно

– и не хранить лишнего

Page 46: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

saveToLS(‘xd-message’, {message: ‘alerta’})

xd-message-wrap: “22=1min“

id-wrap-22: {message: ‘alerta’}

Page 47: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

saveToLS(‘xd-message’, {message: ‘notify’})

xd-message-wrap: “22=1min&23=1.01min“

id-wrap-22: {message: ‘alerta’}

id-wrap-23: {message: ‘notify’}

Page 48: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

saveToLS(‘xd-message’, {message: ‘warning’})

xd-message-wrap: “22=1min&23=1.01min&24=1.02min“

id-wrap-22: {message: ‘alerta’}

id-wrap-23: {message: ‘notify’}

id-wrap-24: {message: ‘warning’}

Page 49: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

– Мгновенные уведомления — это хорошо

– Одно соединение — тоже хорошо

– Реализация для сирых (IE) — субдомены

– comet/localStorage/onstorage — сегодня

– comet/shared WebWorker — завтра

Одно постоянное соединение

Page 50: Одно постоянное соединение на все вкладки сайта (Глеб Арестов)

Вопросы

Глеб Арестов,

[email protected]