Let's discuss the following situation: chat server, written in erlang should properly work, being distributed on several computers. At least on of its components must be globally registered: it is resolver, that can tell pid of exact chat room by its name.
Issue on trapexit: A Framework for Clustering Generic Server Instances give us some good information about solution of this problem. I will repeat main points of that article:
Формат файлов mp4, он же QuickTime format в девичестве, он же после доработок ISO Media (ISO/IEC 14496-14) представляет из себя контейнерный формат для упаковки аудио, видео, текста и т.п. Поскольку сам по себе формат является достаточно обобщённым, то хранить в нём можно как всегда что угодно, так что вопрос не в его синтаксической интерпретации (она простая), а в его семантической интерпретации.
В эрланге есть такая синтаксическая форма как записи. Это ни в коем случае не семантическая структура, а просто syntax sugar.
-record(article, {
id,
user_id = 0,
body = <<>>,
published = false
}).
Хочу немного прояснить как они используются и что это вообще такое для тех, кто ещё только начинает знакомиться с эрлангом.
В erlyvideo есть одно неприятное место: в конфиге можно указать несколько виртуальных хостов и каждому из них будет соответствовать собственный сервер, хранящий ссылки на видеопотоки. Супервизор каждого сервера надо именовать, причём атомом, например для хоста default супервизор будет называться media_provider_sup_default. Генерация такого названия достаточно неприятно выглядит:
Name = binary_to_atom(<<"media_provider_sup_",
(atom_to_binary(Host, latin1))/binary>>, latin1).
Технические проблемы на этом заканчиваются, но мне захотелось попробовать, как сделать автокомпилирующийся
на каждой реконфигурации модуль, в котором все vhost-ы забиты в клозы функций. Такой трюк может понадобиться например если такое преобразование происходит очень часто.
В случае со склейкой строк, на каждом вызове функции будет создаваться два бинари. Если же скомпилировать это в модуль, получится многократно быстрее, потому
что не будет никаких лишних выделений памяти. Сделать это оказалось несложно:
Различные веб-фреймворки и языки по-разному подходят к вопросу, как хранить сессию пользователя, да и просто:
как её привязать к пользователю. Особые проблемы начинаются тогда, когда надо связывать разные технологии, например
сделать единую авторизацию для рельсового приложения, phpBB форума и стриминг-сервера.
Самый простой подход — немного доработанные рельсовые сессии.
Стриминговый сервер erlyvideo вырос из своих пелёнок и научился делать достаточно важную вещь:
транслировать видеокамеру в интернет с помощью Quicktime Broadcaster или Wirecast.
Начинаем с установки erlyvideo. Теперь настраиваем вещание.
Инструкция по установке и запуску erlyvideo:
В эрланге для выставления опций сокета есть функция inet:setopts(Sock, Opts). Одной из её опций является {active, Mode}.
Я хочу немного подетальнее разобрать как ей пользоваться, потому что в документации не очень хорошо это разобрано.
Поскольку RTMP сервер на эрланге erlyvideo теперь умеет
показывать mp4 файлы как для старых флеш-плееров (до 10.0.32.18), так и для новых, я решил про него тут написать.
Демка пока очень мало чего может, но вечерами доделываю.
Стоит RabbitMQ, обслуживает порядка 5-6 источников и 4-5 потребителей,
т.е. совсем немного.
Поток сообщений небольшой: несколько штук в секунду максимум.
Иногда потребители не успевают разгрести сообщения и очередь сообщенй
растет до 5000, но позже она тоже рассасывается.
В целом, всё не страшно, но иногда RabbitMQ начинает сходить с ума.
Выражается это в отжирании 20 гигабайт памяти из которых 5 в оперативке.
Зашел на консоль сервера, нашел крысу: ей оказался процесс,
зарегистрированный как error_logger.
Его статистика по process_info(Logger, memory) показала все утерянные
20 гигабайт: