secon'2014 - Дмитрий Швеенков - Рассылка push-уведомлений...

16
Рассылка push-уведомлений для мобильных платформ Дмитрий Швеёнков

Upload: -secon2014

Post on 15-Jun-2015

548 views

Category:

Presentations & Public Speaking


6 download

DESCRIPTION

За последнее время очень сильное развитие получили мобильные приложения. Многие из нас используют свои любимые приложения каждый день. Push-уведомления являются очень важным инструментом для мобильных приложений. Рассылка push-уведомлений большому количеству пользователей является непростой задачей. В своем докладе расскажу о: том, как устроены пуш-уведомления; кейсах рассылки уведомлений в проектах mail.ru; сложностях, которые возникают при рассылке push-уведомлений; архитектуре сервиса рассылки; асинхронных сервисах; статистике и нагрузке на примере «живого» сервиса. Доклад будет интересен всем, кто занимается разработкой сервисов для мобильных приложений.

TRANSCRIPT

Page 1: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Рассылка push-уведомленийдля мобильных платформ

Дмитрий Швеёнков

Page 2: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

• сообщить пользователю важную информацию

• привлечь внимание пользователя

Зачем нужны push-уведомления?

Page 3: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

• функционально мощный механизм• дешевле sms• эффективнее email• увеличивают возврат пользователя в

приложение

Почему пользуются популярностью?

Page 4: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Как устроены push-уведомления

Mobile app

App backend

get push token

send push token

send push

send push

1

2

3

4

Platform Notification Service

Page 5: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Сложности рассылки уведомлений

• различия между GCM, APNS, MPNS, WNS• TCP, HTTP, Json, Xml, Jabber - зоопарк

протоколов• различия в client-возможностях мобильной

платформы, бейджи, плитки• персонализация по часовым поясам,

custom-фильтры, локализация• массовая своевременная рассылка

Page 6: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Кейсы рассылки уведомлений

• приложение «Новости»несколько уведомлений в сутки для рассылки по большим группам

• приложение «Спорт»небольшое количество уведомлений по пересечению множеств маленьких групп

• приложение «Гороскопы»массовая рассылка по часовым поясам

• приложение «Почта»большой трафик приватных уведомлений

Page 7: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Архитектура сервиса

w3w2

w1

Queue workersTarantool Queue

HTTP daemon

(json)

TCP daemon(iproto)

queue.put queue.take storage.store

Tarantoolstorage

push node

Page 8: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Полезные ссылки

• tarantool.org• github.com/tarantool/queue• www.gevent.org• github.com/mailru/tarantool-python• github.com/shveenkov/gevent_tarantool• docs.python-requests.org• webapp-improved.appspot.com• graphite.readthedocs.org

Page 9: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Http daemon

• nginx• uwsgi (workers=2, gevent=500)• python2.7• webapp2• распределение http-запросов через dns• для загрузки CPU – workers++

Page 10: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Queue, TCP daemon, workers

• tarantool queue instance = 2• python 2.7• gevent• tcp workers = 8• queue workers=16

Page 11: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Нагрузка, статистика

более 100 млн. уведомлений в сутки2500 уведомлений в секундуболее 2000 tcp сообщений в секунду400 http запросов в секунду15K событий в секунду для tarantool queue50% CPU load

Page 12: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Tarantool turbo mode

import geventimport gevent_tarantool as tarantool

def insert_worker(tnt, idx):    for i in range(1000):        tnt.store(1, (idx + i, idx + i))

tnt = tarantool.connect("127.0.0.1", 33013)

jobs = [gevent.spawn(insert_worker, tnt, idx) for idx in range(10)]

gevent.joinall(jobs)

Page 13: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Coro style +/-

• эффективное использование CPU• для coro нужно меньше памяти чем для процессов• меньшее количество открытых коннектов к СУБД /

noSQL• требуется реализация connection pool-ов• сложная отладка и профилирование• сложность кода, async еще сложнее• отсутствуют драйверы к mysql, postgresql• не всегда работают сторонние модули

Page 14: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Мониторинг

Используем смартфоны и планшеты

Page 15: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Важно!

• начальное количество серверов – 2, горизонтальное масштабирование, надежность

• хранить не только push-token, но и информацию о мобильном устройстве

• статистика по рассылкам• анализ отписок

Page 16: SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ

Всем спасибо!

Вопросы?

Дмитрий ШвеёнковMail.Ru Group

[email protected]