Игорь Магазиник, CTO @ Viber Media — «Просто ли сделать сервис на 100М пользователей»

Игорь раскрыл подробности и интересные моменты создания таких сервисов как Viber. В данный момент Viber использует 100 миллионов пользователей. В месяц пользователи Viber генерируют 2,5 миллиардов сообщений и 1,7 миллиардов минут разговоров. Все это, конечно-же, создают огромную нагрузку на сервера. Разработчики не используют своих физических серверов, они пользуются решениями от Amazon. Сервера хранят и обрабатывают огромное количество информации. В данный момент на серверах Viber хранятся 100 миллионов адресных книг. Также хранится «обратный индекс» для того, чтобы уведомлять пользователей, какие контакты из их адресных книг подключились к Viber. В данный момент «обратный индекс» имеет 3 миллиарда вхождений. Сервера обрабатывают 300,000 запросов в секунду. 15-20 миллионов пользователей постоянно держат подключение к Viber. В системе происходит 100,000 параллельных звонков. Сейчас используется 300 серверов. В качестве БД используются NoSQL решения, такие как Redis и MongoDB. Для регистраций используется MySQL.

Кирилл Лашкевич, iOS Solution Architect @ Viber Media — «Low-latency sound in iOS»

Кирилл рассказал о проблемах с которыми можно столкнуться при создании приложения, которое активно работает со звуком в iOS.

iOS предлагает разработчикам несколько API для работы со звуком — AVFoundation, OpenAL, AudioQueue, AudioUnit. Но наиболее широкими возможностями обладает AudioUnit.

Примерная схема работы с AudioUnit такая: нужно определиться с форматами звука (AudioStreamBasicDescription), который будет воспроизводиться и который будет получать AudioUnit. Так же нужно узнать формат, который будет получать аппаратная часть. AudioUnit’у нужно назначить два callback — в один будет приходить звук полученный с микрофона, другой должен отдавать звук на воспроизведение. Оба callback вызывается в одном потоке. В каждый callback приходит AudioTimeStamp в котором расположен timestamp для записанных/запрошенных фреймов звука.

Также, Кирилл затронул тему потери фреймов и изменения route звука. Фреймы звука могут теряться при большой нагрузке на CPU, либо при неправильной синхронизации потоков. Учитывая тот факт, что оба callback выполняются в одном потоке — не следует нагружать callback большими вычислениями.

Узнать количество потерянных фреймов можно путем анализа структуры AudioTimeStamp, которая приходит в записывающий callback. При переключении между Headset/Speaker/Headphones может потеряться около 600 мс звука, а при переключении на Bluetooth теряется около 3000 мс звука.

Загрузить презентацию Кирилла можно по этой ссылке.

Владимир Пузанов — Преимущества использования современных динамических языков для написания iOS приложений

Владимир рассказал о разработке под iOS на Ruby c помощью RubyMotion. В RubyMotion создание проекта, запуск в симуляторе, загрузка на девайс и создание IPA происходит через консоль. Также через консоль доступна отладка и отправка билда в Testflight. В данном случае необязательно использовать XCode, можно использовать любой другой редактор.

Благодаря тесной интеграции, Ruby может взаимодействовать с классами iOS SDK, можете подключать библиотеки. Приложения написанные с помощью RubyMotion успешно проходят модерацию в AppStore.

Загрузить презентацию можно по этой ссылке.

Vladimir Kirillov — Mobile TCP

Владимир рассказал немного о протоколе TCP и о том как оптимизировать его работу на iOS. На iOS можно использовать функцию setsockopt. С ее помощью можно изменить размеры буферов и размеры скользящего окна. Так же можно поэксперементировать с TCP_NODELAY (что дает возможность отправлять данные без задержек, не склеивая маленькие пакеты, если они отправляются отдельно).

Не стоит забывать и о мониторинге данных. Получить текущие параметры можно с помощью функции getsockopt. Можно и нужно использовать утилиту tcpdump. Также, мониторинг и изменение параметров стоит проводить на сервере с которым связывается приложение.

Загрузить презентацию можно по этой ссылке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *