SlideShare une entreprise Scribd logo
1  sur  25
Erlang и видеосервер


         Опыт разработки.
   Макс Лапшин, max@maxidoors.ru
Что такое
        видеосервер
• Камеры наблюдения (rtsp)

• Софт захвата (rtmp)

• Спутниковые грабберы (multicast)

• VLC/ffmpeg (mpegts)

• Файлы (адский набор вариантов)
Все это раздается на

• Десктопы (rtmp, hds)

• Приставки и айпады (hls)

• Архив для таймшифта
Протоколы и
         форматы
• Их много

• Все реализуются по своему

• Закрытые и глючные реализации

• Надо адаптироваться под всех

• Иногда кажется что надо обобщить (rtp/
  rtsp/sip)
Вытекающие
         проблемы
• Код запутан из-за того что стройные идеи
  пронизаны запилами

• Очень сложно юнит-тестировать. Лучше
  вообще не рассчитывать на тесты

• Ошибки возникают и это нормально

• Нельзя из-за них ронять рантайм, который
  живет долго
Какие еще
       особенности?
• Высокие требования по скорости

• Хочется слабую связанность компонент
  (конфликтует с п. 1)

• Утечки памяти - огромная проблема с
  которой не справляется джава
Что хочется?
• Высокоэффективная платформа для сетевых
  демонов

• Возможность горячей замены кода

• Автоматический контроль за ошибками
  рантайма, ограничивающий их воздействие

• Слабую связность отдельных компонент

• Дешевую многоядерность
Erlang
• Процессы - фантастически клевая идея

• Это объекты в которых данные и поток
  выполнения связаны вместе

• Больше такого нет нигде

• "Объекты обмениваются друг с другом
  различными сообщениями"
Что из этого
          следует?
• Автоматическая обработка ошибок
  изолирует их в одном процессе

• Бесплатная многоядерность

• Слабая связанность через сообщения

• Немутабельность упрощает все

• Софт-риалтайм сборка мусора. Никакого stop
  world
Процессы это
          объекты
• Данные инкапсулированы в них и только в них

• Имеют ограниченное время жизни

• Есть конструкторы и деструкторы

• Имеют бизнес-логику

• Могут вызывать методы друг на друге

• Даже есть указатели на объекты (сетевые!)
Чем же это не C++
• Value данные немутабельны

• Вызов метода эксплицитно происходит посылкой
  сообщения

• Все объекты - потоки выполнения

• Не реентерабельны и синхронизируются по mailbox

• Нет явного наследования, только руками

• Код не связан с данными
Неожиданные
          фишки
• Возможность горячей замены кода

• Отложенный ответ на вызов метода (!)

• Отсутствие race condition внутри одного
  объекта (да и вообще их мало)

• Можно сделать счетчик ссылок с
  таймаутом
Erlang - это не о том,
 как быть модным
     хипстером
Erlang - это о том, как
 делать работающие
         вещи
Pattern matching
• Труъ ООП

• Классификация аргументов через классы в
  дереве наследования работает плохо

• Мы классифицируем объекты ad-hoc, в
  каждом месте ветвления логики

• Pattern matching - это классификация объектов
  по их значению, актуальному здесь и сейчас
Обработка ошибок
• Изолированы внутри процесса

• По умолчанию завершают текущий
  объект с его ресурсами

• Можно подписаться на смерть объекта (!)

• Органичная часть рантайма

• Не надо писать код по обработке ошибок
Одного Erlang мало
    Нужен OTP
• Эмуляция вызовов методов через
  сообщения

• Слежение за деревом процессов

• Автоматическое журналирование событий

• Стандартизация стиля программ

• Код не по OTP это зло
Ложка дегтя
• Неудобные строки

• error_logger при известном стечении
  обстоятельств может уронить систему в
  oom

• Нет ORM типа ActiveRecord

• Не ценится в гей-сообществе
Пример Erlang в
         видео
• Поток кадров осуществляется посылкой
  сообщений подписчикам

• Никаких задержек источника: рантайм сам
  раскидает сообщения и зашедулит
  получателей

• Клиент падает и не должен явно отписываться

• В источнике счетчик подписчиков с
  таймаутом
Опыт erlyvideo

• Малыми силами

• Быстро

• Лучше чем на джаве

• Все круто
Опыт erlyvideo

• Несколько гигабит

• Без утечек памяти и файлов

• Работает месяцами без сбоев

• Приносит деньги
Структура ПО


• Java, C++ — это как марионетка с одной
  веревочкой

• Erlang — раздельные компоненты
Либы на C

• Событийные

• Можно в отдельных тредах

• Достаточно удобно

• Нет аналога FFI
Резюме

• Erlang оказался прекрасной платформой
  для разработки сложного, запутанного
  сетевого демона

• Потребовалось гораздо меньше
  ресурсов и сил чем на джаве и
  результаты тоже лучше
Вопросы?


 Макс Лапшин

max@maxidoors.ru

Contenu connexe

Tendances

Erlang railsclub - 1
Erlang   railsclub - 1Erlang   railsclub - 1
Erlang railsclub - 1Max Lapshin
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потерялиIvan Grishaev
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)Ontico
 
Erlyvideo — сервер потокового видео.
Erlyvideo — сервер потокового видео.Erlyvideo — сервер потокового видео.
Erlyvideo — сервер потокового видео.Max Lapshin
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4rit2011
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang productionAlina Dolgikh
 
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...it-people
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляютсяMax Lapshin
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Ontico
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Ontico
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Ontico
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPOleg Poludnenko
 

Tendances (19)

Erlang railsclub - 1
Erlang   railsclub - 1Erlang   railsclub - 1
Erlang railsclub - 1
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потеряли
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
 
Erlang ruby
Erlang rubyErlang ruby
Erlang ruby
 
Erlyvideo — сервер потокового видео.
Erlyvideo — сервер потокового видео.Erlyvideo — сервер потокового видео.
Erlyvideo — сервер потокового видео.
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Sivko
SivkoSivko
Sivko
 
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодня
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang production
 
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляются
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
 

Similaire à Erlang for Yandex

Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Daniel Podolsky
 
Real-time данные на фронтенде
Real-time данные на фронтендеReal-time данные на фронтенде
Real-time данные на фронтендеEXANTE
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Ontico
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Ontico
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Yury Bushmelev
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийАлександр Ежов
 
"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей КалинецFwdays
 
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...DevGAMM Conference
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
“Чем хорош Erlang вообще и для веб-разработки в частности?”

“Чем хорош Erlang вообще и для веб-разработки в частности?”
“Чем хорош Erlang вообще и для веб-разработки в частности?”

“Чем хорош Erlang вообще и для веб-разработки в частности?”
Olga Lavrentieva
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Andrew Mayorov
 
Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1guest092df8
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковDevGAMM Conference
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Ontico
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014Alex Chistyakov
 

Similaire à Erlang for Yandex (20)

Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
 
Real-time данные на фронтенде
Real-time данные на фронтендеReal-time данные на фронтенде
Real-time данные на фронтенде
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложений
 
Migrate!
Migrate!Migrate!
Migrate!
 
мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0
 
"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец
 
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
“Чем хорош Erlang вообще и для веб-разработки в частности?”

“Чем хорош Erlang вообще и для веб-разработки в частности?”
“Чем хорош Erlang вообще и для веб-разработки в частности?”

“Чем хорош Erlang вообще и для веб-разработки в частности?”

 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.
 
Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1Max Lapshin Erlyvideo V1
Max Lapshin Erlyvideo V1
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
 
Async Python
Async PythonAsync Python
Async Python
 

Plus de Max Lapshin

Flussonic IPTV OTT
Flussonic IPTV OTTFlussonic IPTV OTT
Flussonic IPTV OTTMax Lapshin
 
Pulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядовPulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядовMax Lapshin
 
Видеостриминг на 10 ГБит/с
Видеостриминг на 10 ГБит/сВидеостриминг на 10 ГБит/с
Видеостриминг на 10 ГБит/сMax Lapshin
 
Rails, Eventmachine, Erlang
Rails, Eventmachine, ErlangRails, Eventmachine, Erlang
Rails, Eventmachine, ErlangMax Lapshin
 
Code generation in Erlang
Code generation in ErlangCode generation in Erlang
Code generation in ErlangMax Lapshin
 
Актуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернетеАктуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернетеMax Lapshin
 
Devpoint2 video in internet
Devpoint2 video in internetDevpoint2 video in internet
Devpoint2 video in internetMax Lapshin
 
кеширование в бд
кеширование в бдкеширование в бд
кеширование в бдMax Lapshin
 

Plus de Max Lapshin (10)

Flussonic IPTV OTT
Flussonic IPTV OTTFlussonic IPTV OTT
Flussonic IPTV OTT
 
Pulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядовPulsedb — система хранения временных рядов
Pulsedb — система хранения временных рядов
 
Видеостриминг на 10 ГБит/с
Видеостриминг на 10 ГБит/сВидеостриминг на 10 ГБит/с
Видеостриминг на 10 ГБит/с
 
Rails, Eventmachine, Erlang
Rails, Eventmachine, ErlangRails, Eventmachine, Erlang
Rails, Eventmachine, Erlang
 
Code generation in Erlang
Code generation in ErlangCode generation in Erlang
Code generation in Erlang
 
Актуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернетеАктуальное состояние вещания видео в интернете
Актуальное состояние вещания видео в интернете
 
Http streaming
Http streamingHttp streaming
Http streaming
 
Devpoint2 video in internet
Devpoint2 video in internetDevpoint2 video in internet
Devpoint2 video in internet
 
Erlyvideo
ErlyvideoErlyvideo
Erlyvideo
 
кеширование в бд
кеширование в бдкеширование в бд
кеширование в бд
 

Erlang for Yandex

  • 1. Erlang и видеосервер Опыт разработки. Макс Лапшин, max@maxidoors.ru
  • 2. Что такое видеосервер • Камеры наблюдения (rtsp) • Софт захвата (rtmp) • Спутниковые грабберы (multicast) • VLC/ffmpeg (mpegts) • Файлы (адский набор вариантов)
  • 3. Все это раздается на • Десктопы (rtmp, hds) • Приставки и айпады (hls) • Архив для таймшифта
  • 4. Протоколы и форматы • Их много • Все реализуются по своему • Закрытые и глючные реализации • Надо адаптироваться под всех • Иногда кажется что надо обобщить (rtp/ rtsp/sip)
  • 5. Вытекающие проблемы • Код запутан из-за того что стройные идеи пронизаны запилами • Очень сложно юнит-тестировать. Лучше вообще не рассчитывать на тесты • Ошибки возникают и это нормально • Нельзя из-за них ронять рантайм, который живет долго
  • 6. Какие еще особенности? • Высокие требования по скорости • Хочется слабую связанность компонент (конфликтует с п. 1) • Утечки памяти - огромная проблема с которой не справляется джава
  • 7. Что хочется? • Высокоэффективная платформа для сетевых демонов • Возможность горячей замены кода • Автоматический контроль за ошибками рантайма, ограничивающий их воздействие • Слабую связность отдельных компонент • Дешевую многоядерность
  • 8. Erlang • Процессы - фантастически клевая идея • Это объекты в которых данные и поток выполнения связаны вместе • Больше такого нет нигде • "Объекты обмениваются друг с другом различными сообщениями"
  • 9. Что из этого следует? • Автоматическая обработка ошибок изолирует их в одном процессе • Бесплатная многоядерность • Слабая связанность через сообщения • Немутабельность упрощает все • Софт-риалтайм сборка мусора. Никакого stop world
  • 10. Процессы это объекты • Данные инкапсулированы в них и только в них • Имеют ограниченное время жизни • Есть конструкторы и деструкторы • Имеют бизнес-логику • Могут вызывать методы друг на друге • Даже есть указатели на объекты (сетевые!)
  • 11. Чем же это не C++ • Value данные немутабельны • Вызов метода эксплицитно происходит посылкой сообщения • Все объекты - потоки выполнения • Не реентерабельны и синхронизируются по mailbox • Нет явного наследования, только руками • Код не связан с данными
  • 12. Неожиданные фишки • Возможность горячей замены кода • Отложенный ответ на вызов метода (!) • Отсутствие race condition внутри одного объекта (да и вообще их мало) • Можно сделать счетчик ссылок с таймаутом
  • 13. Erlang - это не о том, как быть модным хипстером
  • 14. Erlang - это о том, как делать работающие вещи
  • 15. Pattern matching • Труъ ООП • Классификация аргументов через классы в дереве наследования работает плохо • Мы классифицируем объекты ad-hoc, в каждом месте ветвления логики • Pattern matching - это классификация объектов по их значению, актуальному здесь и сейчас
  • 16. Обработка ошибок • Изолированы внутри процесса • По умолчанию завершают текущий объект с его ресурсами • Можно подписаться на смерть объекта (!) • Органичная часть рантайма • Не надо писать код по обработке ошибок
  • 17. Одного Erlang мало Нужен OTP • Эмуляция вызовов методов через сообщения • Слежение за деревом процессов • Автоматическое журналирование событий • Стандартизация стиля программ • Код не по OTP это зло
  • 18. Ложка дегтя • Неудобные строки • error_logger при известном стечении обстоятельств может уронить систему в oom • Нет ORM типа ActiveRecord • Не ценится в гей-сообществе
  • 19. Пример Erlang в видео • Поток кадров осуществляется посылкой сообщений подписчикам • Никаких задержек источника: рантайм сам раскидает сообщения и зашедулит получателей • Клиент падает и не должен явно отписываться • В источнике счетчик подписчиков с таймаутом
  • 20. Опыт erlyvideo • Малыми силами • Быстро • Лучше чем на джаве • Все круто
  • 21. Опыт erlyvideo • Несколько гигабит • Без утечек памяти и файлов • Работает месяцами без сбоев • Приносит деньги
  • 22. Структура ПО • Java, C++ — это как марионетка с одной веревочкой • Erlang — раздельные компоненты
  • 23. Либы на C • Событийные • Можно в отдельных тредах • Достаточно удобно • Нет аналога FFI
  • 24. Резюме • Erlang оказался прекрасной платформой для разработки сложного, запутанного сетевого демона • Потребовалось гораздо меньше ресурсов и сил чем на джаве и результаты тоже лучше

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n