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

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

Jun 15, 2015

Download

За последнее время очень сильное развитие получили мобильные приложения. Многие из нас используют свои любимые приложения каждый день. Push-уведомления являются очень важным инструментом для мобильных приложений. Рассылка push-уведомлений большому количеству пользователей является непростой задачей. В своем докладе расскажу о:
том, как устроены пуш-уведомления;
кейсах рассылки уведомлений в проектах mail.ru;
сложностях, которые возникают при рассылке push-уведомлений;
архитектуре сервиса рассылки;
асинхронных сервисах;
статистике и нагрузке на примере «живого» сервиса.
Доклад будет интересен всем, кто занимается разработкой сервисов для мобильных приложений.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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]