Чат на Erlang и Web Sockets

Apr 16, 2010 19:22

Данный чат в первую очередь задумывался как демонстрационный пример для моего доклада про веб сокеты на РИТ-2010. То есть в первую очередь он создавался чтобы протестировать веб сокеты, проверить как будет работать event-driven система, состоящая из брауера, сервера и среды передачи данных. То, что это все хорошо работает по отдельности - уже давно ( Read more... )

event-driven, чат, эрланг, erlang, chat, web sockets

Leave a comment

elisitsky April 17 2010, 08:10:21 UTC
Огромное спасибо, Лев!

> Этих вот unicode:XYZ функций не надо вовсе. Смысла в них ноль.
Я попробую по вашей рекомендации все перенести на бинари. Здесь у меня просто часть операций делалась со списками, а часть с бинари, поэтому приходилось конвертировать.

> Conn_Manager = spawn(fun() -> conn_manager() end),
> Conn_manager = spawn(fun conn_manager/0),
В первом случае мы забиваем память анонимной функцией?

> erl -man gen_server, уверяю, это просто для головы, и лучше для дела.
Что-то он у меня не лезет в голову :)
Непонятен вот такой момент - у меня будет некое глобальное состояние сервера (State), которое будут получать мои callback`и. То есть, все, что сейчас раскидано и хранится в отдельных процессах будет храниться в единой переменной. Не станет ли от этого программа хуже работать? По идее должна испортиться асинхронность - т.к. все запросы должны будут работать с этой переменно и они будут вынуждены выстраиваться в очередь. Параллельно тоже будет обрабатваться один запрос?
Можно ли эту переменную разобраться на отдельные состояния? Например, если я добавлю поддержку нескольких комнат в чат, то мне нужно будет заводить несколько таких менеджеров клиентов. Мне как-то хочется держать их состояния отдельно, пусть в gen_server, но не в общей куче.
Почему-то я жду жутких тормозов, когда все процессы начнут копаться в этой куче ради изменения пары полей.

> continue_work() ->
> receive
Это чудовищный хак - мне нужно было как-то демонизировать процесс, иначе он постоянно завершался. Я это сделал загнав его в вечный цикл с выходом по сигналу.
как это делается по человечески?

> Гораздо корректнее использовать erlang:monitor, и ловить 'DOWN', чем ловить 'EXIT' после выставления trap_exit. Так как erlang:monitor внизу и делается, рекомендую выбросить process_flag(trap_exit, true) вовсе из кода.
Ясно. идея была в том, чтобы при ошибке в нижележащих процессах conn_manager не упал. В принципе link не используется, поэтому действительно trap_exit стоит выкинуть.

> Дикая позиционщина. Что за "2"? Я бы весь блок внизу переписал так:
Согласен, потом вспоминать все индексы и править их по всей проге станет ужасом. От этого необходимо избавляться.
Скажите, а насколько быстр будет этот код? почему-то я жду, что он будет пробегать по всему списку проверять все элементы - O(N), а значит жду тормозов при больших списках.
Вот здесь мне как-то очень хочется использовать хеш или аналог, чтобы обратиться адресно к нужному элементу и получитить трудоемкость O(1).

> Не люблю эрланговский if, но здесь явно просится:.....
Ясно

> ...воспользоваться erl -man queue....
Изучу.

P.S.
После ваших комментариев я понял одну простую вещь и смешную вещь - я упорно пытаюсь писать на Эрланге императивно. "взять элемент" - "сделать то" - "положить на место".

Вобщем это все надо перепродумать и переписать с чистого листа.

Reply

cy6erbr4in April 19 2010, 21:39:02 UTC
я форкнул проект на гитхабе, поковыряю на предмет "включения" otp :) как будет что интересного, дам знать...

Reply

elisitsky April 20 2010, 08:21:53 UTC
Обязательно расскажите.
Я тоже решил двигаться в сторону OTP, пока некоторые детали не ясны, но будем разбираться.

Reply

ext_3009843 December 15 2016, 10:13:57 UTC
А как нужно изменить скрипт, чтобы сделать возможным одключение БД на postgreSQL? Вы все еще занимаетесь Erlangом? как успехи с OTP?

Reply

elisitsky May 28 2017, 15:09:48 UTC
Добрый день!
Поздно заметил ваш комментарий - сейчас вообще не бываю в ЖЖ.
Нет, сейчас не занимаюсь Erlang - все же слишком узкая и специфичная ниша. Лично мне сейчас Golang видится более перспективным.

Reply


Leave a comment

Up