These are chat archives for synrc/n2o

28th
Feb 2016
Namdak Tonpa
@5HT
Feb 28 2016 09:07
поступил запрос делать экспайринг кешей и сессий как в редисе
у нас впринципе все готов
надо только по таймеру запускать и делать вычитку всех ключей wf:cache(Key).
там оно само удалит записи если они проэкспайреные
Andy
@m-2k
Feb 28 2016 09:08
и
по таймеру дрочить каждые 100мс ets и все
Namdak Tonpa
@5HT
Feb 28 2016 09:08
just saying
не, раз в 5 минут (настраиваемо) делать полный траверсал
это нада чтобы таблицы самоочищались, она не может за 5 минут резко вырости
Andy
@m-2k
Feb 28 2016 09:10
почему полный? сразу вспоминается ява с замиранием мира на сбор мусора
Namdak Tonpa
@5HT
Feb 28 2016 09:11
ну так это ж в оффлайне делается отдельным процессом
ничего замирать не будет )
Namdak Tonpa
@5HT
Feb 28 2016 09:17
уже вижу как улучшить
надо сделать чтобы cache и session более похожими были
Andy
@m-2k
Feb 28 2016 09:19
я не про зависания как таковые а про мгновенную нагрузку на проц, так то мне похуй :smile:
Namdak Tonpa
@5HT
Feb 28 2016 10:32
закомитил
ну ее можно размазать
проверять 10 записей и засыпать на секундочку )
с шагом
Andy
@m-2k
Feb 28 2016 10:35
тогда можно выйти за рамки 10 мин )
Namdak Tonpa
@5HT
Feb 28 2016 10:35
ну устанавливаешь рамки волны
и потом размазываешь ее нормальным распределением
Andy
@m-2k
Feb 28 2016 10:36
да это всё ебля какая-то
Namdak Tonpa
@5HT
Feb 28 2016 10:36
так отож
Andy
@m-2k
Feb 28 2016 10:36
мой вариант даже конфигурировать и думать ни над чем не надо
Namdak Tonpa
@5HT
Feb 28 2016 10:36
какой твой вариант?
Andy
@m-2k
Feb 28 2016 10:36
100 мс лаг потом чек одной записи ets
по циклу нонстоп
Namdak Tonpa
@5HT
Feb 28 2016 10:37
нон стоп точно не нужен
то что я написал будет отлично работать даже если в онлайне 50 000 000 клиентов
проход 50 лимонов за 1 минуту
но даже тогда не будет 100% загрузки
посмотри
раз в 10 минут будет включатся свайп
Andy
@m-2k
Feb 28 2016 10:41
я к тому что в редисе ничего конфигурировать на этот счет не нужно, лишняя ебля. это же системная логика. нах о ней еще думать. опять явамирок вспоминается где надо решать скок оперативы под кучу выделить чтобы приложение не тормозило как паскуда тварь
Namdak Tonpa
@5HT
Feb 28 2016 10:41
у меня нихуя не конфигурируется
если хочешь только
вытащил n2o — все будет самоочищаться
Andy
@m-2k
Feb 28 2016 10:42
а если под DoS'ом?
Namdak Tonpa
@5HT
Feb 28 2016 10:42
похуй это ETS траверсалы
не юзеры их включают, а таймер, один на систему
Andy
@m-2k
Feb 28 2016 10:44
что будет если траверсал еще не отработал а время новой проверки уже настало
Namdak Tonpa
@5HT
Feb 28 2016 10:44
такого не будет
Andy
@m-2k
Feb 28 2016 10:45
вангуешь?
Namdak Tonpa
@5HT
Feb 28 2016 10:45
могу переписать так чтобы такого 100% не было
Andy
@m-2k
Feb 28 2016 10:45
ну это ж эрланг вэй
предотвращать всякую такую хуетень
Namdak Tonpa
@5HT
Feb 28 2016 10:45
а не, такого не будет
написано так что 100% такого не будет
Andy
@m-2k
Feb 28 2016 10:45
то что ты там отвечаешь в натуре без базара - никого не впечатлит
Namdak Tonpa
@5HT
Feb 28 2016 10:46
ну сделай ревью хули
proc(X,#handler{state=Timer}=Async) ->
    case Timer of undefined -> skip; _ -> erlang:cancel_timer(Timer) end,
    wf:info(?MODULE,"N2O Timer: ~p~n",[X]),
    n2o_session:invalidate_sessions(),
    wf:invalidate_cache(),
    {reply,ok,Async#handler{state=timer_restart(ping())}}.
Andy
@m-2k
Feb 28 2016 10:48
ну и чо, это и так понятно
Namdak Tonpa
@5HT
Feb 28 2016 10:48
ну вот тут написано что следующее событие не настанет пока не свипнется
а перед свипом выключается таймер
Andy
@m-2k
Feb 28 2016 10:50
а, ну понял
типа как setInterval и setTimeout в js )
Namdak Tonpa
@5HT
Feb 28 2016 10:51
expire redis на 5 строчек
через n2o_async
Andy
@m-2k
Feb 28 2016 10:54
помню тут чувак год назад пришел и ныл что у него ets может переполниться )
ты его нахуй послал :smile:
Namdak Tonpa
@5HT
Feb 28 2016 10:55
я ему сказал сам напиши
я помню
Andy
@m-2k
Feb 28 2016 10:55
ага, я помню
Namdak Tonpa
@5HT
Feb 28 2016 10:56
просто тогда n2o_async небыло
пришлось бы богомерзкий gen_server вставлять копипастой
Andy
@m-2k
Feb 28 2016 10:56
ага
Namdak Tonpa
@5HT
Feb 28 2016 10:56
поэтому я оттягивал до file transfer, именно тогда n2o_async и всплыл
Andy
@m-2k
Feb 28 2016 10:56
почанковый аплоад на клиента в планах, нет?
Namdak Tonpa
@5HT
Feb 28 2016 10:57
так аплоад и так почанковый
а, даунлоад
ну пока нет
Andy
@m-2k
Feb 28 2016 10:57
ок
Namdak Tonpa
@5HT
Feb 28 2016 10:57
да FTP пока в коммерческих целях вроде не используют
или я незнаю об этом
если б использовали пришли бы спросили наверно )
Namdak Tonpa
@5HT
Feb 28 2016 11:04
как вам N2O на Хаскеле:
handle state entry [AtomTerm "LOGON", BinaryTerm name]
    | invalidName $ lazyDecodeUtf8 name = alert entry "Name cannot contain punctuation or whitespace, and cannot be empty"
    | otherwise = do
        let dname = T.unpack $ lazyDecodeUtf8 name
        print $ "login: " <> dname
        ce <- clientExists state dname
        if ce 
            then alert entry "User already exists"
            else do
                send entry $ call "joinSession" ""
                setState state (eSocketId entry) $ Just dname
                clients <- loggedOn state
                let foo = concatMap ((\x -> "<li>" <> x <> "</li>") . fromJust . eUser) clients
                broadcast (call "$('#users').html" (fromString foo) <> call "log" ((fromString dname) <> " joined")) clients

handle state _entry [AtomTerm "MSG", BinaryTerm text]
    = do
        clients <- loggedOn state
        sendMessage text clients

handle state entry [AtomTerm "N2O_DISCONNECT"]
    = do
        clients <- loggedOn state
        let foo = concatMap ((\x -> "<li>" <> x <> "</li>") . fromJust . eUser) clients
        broadcast (call "$('#users').html" (fromString foo) <> call "log" (fromMaybe "Someone" (fromString <$> eUser entry) <> " disconnected")) clients
eval x = encode $ TupleTerm [AtomTerm "io", NilTerm, showBERT x]
receiveN2O connection = do
    message    <- WS.receiveDataMessage connection
    case message of
        WS.Text "N2O," -> return ()
        WS.Binary _ -> putStrLn "Protocol violation 4"
        WS.Text x -> putStrLn "Protocol violation 3" >> print x

receiveMessage connection = do
    let loop = receiveMessage connection
    message    <- WS.receiveDataMessage connection
    putStrLn "message"
    print message
    case message of
         WS.Binary x -> print "Decoding" >> case decode x of
            TupleTerm x -> print "Decoded" >> return x
            _ -> print "haha" >> error "Protocol violation"

         WS.Text x
             | x == "PING" -> putStrLn "PING" >> loop
             | otherwise  -> do
                print x
                error "protocol violation 2"
Andy
@m-2k
Feb 28 2016 14:03
Я хацкель не учил никогда
Namdak Tonpa
@5HT
Feb 28 2016 14:08
тут есть что то непонятное?