secon'2014 - Дмитрий Швеенков - Рассылка push-уведомлений...
DESCRIPTION
За последнее время очень сильное развитие получили мобильные приложения. Многие из нас используют свои любимые приложения каждый день. Push-уведомления являются очень важным инструментом для мобильных приложений. Рассылка push-уведомлений большому количеству пользователей является непростой задачей. В своем докладе расскажу о: том, как устроены пуш-уведомления; кейсах рассылки уведомлений в проектах mail.ru; сложностях, которые возникают при рассылке push-уведомлений; архитектуре сервиса рассылки; асинхронных сервисах; статистике и нагрузке на примере «живого» сервиса. Доклад будет интересен всем, кто занимается разработкой сервисов для мобильных приложений.TRANSCRIPT
Рассылка push-уведомленийдля мобильных платформ
Дмитрий Швеёнков
• сообщить пользователю важную информацию
• привлечь внимание пользователя
Зачем нужны push-уведомления?
• функционально мощный механизм• дешевле sms• эффективнее email• увеличивают возврат пользователя в
приложение
Почему пользуются популярностью?
Как устроены push-уведомления
Mobile app
App backend
get push token
send push token
send push
send push
1
2
3
4
Platform Notification Service
Сложности рассылки уведомлений
• различия между GCM, APNS, MPNS, WNS• TCP, HTTP, Json, Xml, Jabber - зоопарк
протоколов• различия в client-возможностях мобильной
платформы, бейджи, плитки• персонализация по часовым поясам,
custom-фильтры, локализация• массовая своевременная рассылка
Кейсы рассылки уведомлений
• приложение «Новости»несколько уведомлений в сутки для рассылки по большим группам
• приложение «Спорт»небольшое количество уведомлений по пересечению множеств маленьких групп
• приложение «Гороскопы»массовая рассылка по часовым поясам
• приложение «Почта»большой трафик приватных уведомлений
Архитектура сервиса
w3w2
w1
Queue workersTarantool Queue
HTTP daemon
(json)
TCP daemon(iproto)
queue.put queue.take storage.store
Tarantoolstorage
push node
Полезные ссылки
• 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
Http daemon
• nginx• uwsgi (workers=2, gevent=500)• python2.7• webapp2• распределение http-запросов через dns• для загрузки CPU – workers++
Queue, TCP daemon, workers
• tarantool queue instance = 2• python 2.7• gevent• tcp workers = 8• queue workers=16
Нагрузка, статистика
более 100 млн. уведомлений в сутки2500 уведомлений в секундуболее 2000 tcp сообщений в секунду400 http запросов в секунду15K событий в секунду для tarantool queue50% CPU load
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)
Coro style +/-
• эффективное использование CPU• для coro нужно меньше памяти чем для процессов• меньшее количество открытых коннектов к СУБД /
noSQL• требуется реализация connection pool-ов• сложная отладка и профилирование• сложность кода, async еще сложнее• отсутствуют драйверы к mysql, postgresql• не всегда работают сторонние модули
Мониторинг
Используем смартфоны и планшеты
Важно!
• начальное количество серверов – 2, горизонтальное масштабирование, надежность
• хранить не только push-token, но и информацию о мобильном устройстве
• статистика по рассылкам• анализ отписок