Size: a a a

2020 July 22

p

pragus in Go-go!
Alexander Emelin
Centrifugo не позволяет отлавливать события дисконнекта. Основная причина - их нереально отправить надежно. Например, если сервер вырубят с kill -9, или просто машина потеряется - приложение не получит событий о дисконнектах. Если на них заложить бизнес логику то останутся stale данные. В случае работы с постоянными долгими соединениями единственный способ надежно что-то делать - это полагаться на периодический пинг с клиента или сервера пока соединение живет. Второй момент - так как дизайн предполагает работу с миллионами соединений, то честно говоря шквал дисконнектов например при релоаде балансера вряд ли кому нужен. Лучше уж с долей аппроксимации размазать нагрузку от редких периодических пингов с клиента. Возможно через очереди это можно было бы смягчить - но смотри пункт 1. В библиотеке есть OnDisconnect обработчик - но на нем примерно такой же коммент написан,
все логично же. такие события должны генерироваться клиентом(точнее, библиотечным кодом на к клиенте) и либо им же обрабатываться, либо выбрасываться на уровень выше и обрабатываться там.

потому что невозможно изолироваться от реальности.
источник

AA

Andrey Ashurko in Go-go!
Alexander Emelin
Centrifugo не позволяет отлавливать события дисконнекта. Основная причина - их нереально отправить надежно. Например, если сервер вырубят с kill -9, или просто машина потеряется - приложение не получит событий о дисконнектах. Если на них заложить бизнес логику то останутся stale данные. В случае работы с постоянными долгими соединениями единственный способ надежно что-то делать - это полагаться на периодический пинг с клиента или сервера пока соединение живет. Второй момент - так как дизайн предполагает работу с миллионами соединений, то честно говоря шквал дисконнектов например при релоаде балансера вряд ли кому нужен. Лучше уж с долей аппроксимации размазать нагрузку от редких периодических пингов с клиента. Возможно через очереди это можно было бы смягчить - но смотри пункт 1. В библиотеке есть OnDisconnect обработчик - но на нем примерно такой же коммент написан,
понял, то есть единственный вариант брать библиотеку и писать свой edge правильно? логику скейла самому писать и тп
источник

p

pragus in Go-go!
Alexander Emelin
Centrifugo не позволяет отлавливать события дисконнекта. Основная причина - их нереально отправить надежно. Например, если сервер вырубят с kill -9, или просто машина потеряется - приложение не получит событий о дисконнектах. Если на них заложить бизнес логику то останутся stale данные. В случае работы с постоянными долгими соединениями единственный способ надежно что-то делать - это полагаться на периодический пинг с клиента или сервера пока соединение живет. Второй момент - так как дизайн предполагает работу с миллионами соединений, то честно говоря шквал дисконнектов например при релоаде балансера вряд ли кому нужен. Лучше уж с долей аппроксимации размазать нагрузку от редких периодических пингов с клиента. Возможно через очереди это можно было бы смягчить - но смотри пункт 1. В библиотеке есть OnDisconnect обработчик - но на нем примерно такой же коммент написан,
а еще 10к-100к переподключившихся клиентов клиентов создают довольно интересную ситуацию.
источник

ГП

Георгий Папаскири... in Go-go!
День добрый.
более менее разобрался вчера как коннектиться на telnet, ждать определенного ответа и отправлять команду.
func (t *Telnet) Read() {
 buf := make([]byte, 4096)
 for {
   _, err := t.Conn.Read(buf)
   if err != nil {
     panic(err)
   }
   t.Result = append(t.Result, string(buf))
   if strings.Contains(string(buf), t.WaitPrompt) {
     return
   }
 }
 return
}
Но не могу никак получить на печать нормальный вывод того что коммутатор отвечает, грубо говоря я хочу напечатать все то что в консоль выводится. Но получается вот так:
ecure protocol, and it is recommended to use Stelnet. inmsername:uthentication

ecure protocol, and it is recommended to use Stelnet.
Password:uthentication

ecure protocol, and it is recommended to use Stelnet.
Info: The max number of VTY users is 5, and the number
     of current VTY users on line is 1.
<SUKHUM_LAKOBA_114>r of VTY users is 5, and the number
     of current VTY users on line is 1. s y s
Enter system view, return user view with Ctrl+Z.
источник

DM

Dmitry M in Go-go!
Alexander Emelin
Centrifugo не позволяет отлавливать события дисконнекта. Основная причина - их нереально отправить надежно. Например, если сервер вырубят с kill -9, или просто машина потеряется - приложение не получит событий о дисконнектах. Если на них заложить бизнес логику то останутся stale данные. В случае работы с постоянными долгими соединениями единственный способ надежно что-то делать - это полагаться на периодический пинг с клиента или сервера пока соединение живет. Второй момент - так как дизайн предполагает работу с миллионами соединений, то честно говоря шквал дисконнектов например при релоаде балансера вряд ли кому нужен. Лучше уж с долей аппроксимации размазать нагрузку от редких периодических пингов с клиента. Возможно через очереди это можно было бы смягчить - но смотри пункт 1. В библиотеке есть OnDisconnect обработчик - но на нем примерно такой же коммент написан,
тротлинг?
источник

AE

Alexander Emelin in Go-go!
Andrey Ashurko
понял, то есть единственный вариант брать библиотеку и писать свой edge правильно? логику скейла самому писать и тп
ну возможно... Если устраивает то, что однажды дисконнект не отработает - в таком случае предусмотрите хотя бы фоллбек с каким-то кроном вычичающим stale состояние и освобождайте комнату. Логику скейла писать с либой не придется - она внутри такая же как в Centrifugo
источник

AE

Alexander Emelin in Go-go!
Dmitry M
тротлинг?
вроде я об этом написал когда упомянул очереди? Опять же пока эта очередь рассосется - клиент уже вернется - кому нужны такие рейсы
источник

DP

Daniel Podolsky in Go-go!
Георгий Папаскири
День добрый.
более менее разобрался вчера как коннектиться на telnet, ждать определенного ответа и отправлять команду.
func (t *Telnet) Read() {
 buf := make([]byte, 4096)
 for {
   _, err := t.Conn.Read(buf)
   if err != nil {
     panic(err)
   }
   t.Result = append(t.Result, string(buf))
   if strings.Contains(string(buf), t.WaitPrompt) {
     return
   }
 }
 return
}
Но не могу никак получить на печать нормальный вывод того что коммутатор отвечает, грубо говоря я хочу напечатать все то что в консоль выводится. Но получается вот так:
ecure protocol, and it is recommended to use Stelnet. inmsername:uthentication

ecure protocol, and it is recommended to use Stelnet.
Password:uthentication

ecure protocol, and it is recommended to use Stelnet.
Info: The max number of VTY users is 5, and the number
     of current VTY users on line is 1.
<SUKHUM_LAKOBA_114>r of VTY users is 5, and the number
     of current VTY users on line is 1. s y s
Enter system view, return user view with Ctrl+Z.
Так а вопрос в чем?
источник

ГП

Георгий Папаскири... in Go-go!
не могу никак получить на печать нормальный вывод того что коммутатор отвечает, как его получить? Вывод в консоль выглядит так:
Warning: Telnet is not a secure protocol, and it is recommended to use Stelnet.

Login authentication


Username:admin
Password:
Info: The max number of VTY users is 5, and the number
     of current VTY users on line is 1.
<SUKHUM_LAKOBA_114>dis ver
Huawei Versatile Routing Platform Software
VRP (R) software, Version 5.70 (S2300 V100R006C05)
Copyright (C) 2003-2013 HUAWEI TECH CO., LTD
Quidway S2328P-EI-AC Routing Switch uptime is 1 week, 2 days, 17 hours, 26 minutes

ES2D1T28S000 0(Master) : uptime is 1 week, 2 days, 17 hours, 26 minutes
64M bytes DDR Memory
32M bytes FLASH
Pcb      Version :  VER B
Basic  BOOTROM  Version :  149 Compiled at Mar 15 2013, 11:02:25
Software Version : VRP (R) Software, Version 5.70 (V100R006C05)
<SUKHUM_LAKOBA_114>

А у меня получается как я указал выше
источник

ВС

Владимир Столяров... in Go-go!
Георгий Папаскири
День добрый.
более менее разобрался вчера как коннектиться на telnet, ждать определенного ответа и отправлять команду.
func (t *Telnet) Read() {
 buf := make([]byte, 4096)
 for {
   _, err := t.Conn.Read(buf)
   if err != nil {
     panic(err)
   }
   t.Result = append(t.Result, string(buf))
   if strings.Contains(string(buf), t.WaitPrompt) {
     return
   }
 }
 return
}
Но не могу никак получить на печать нормальный вывод того что коммутатор отвечает, грубо говоря я хочу напечатать все то что в консоль выводится. Но получается вот так:
ecure protocol, and it is recommended to use Stelnet. inmsername:uthentication

ecure protocol, and it is recommended to use Stelnet.
Password:uthentication

ecure protocol, and it is recommended to use Stelnet.
Info: The max number of VTY users is 5, and the number
     of current VTY users on line is 1.
<SUKHUM_LAKOBA_114>r of VTY users is 5, and the number
     of current VTY users on line is 1. s y s
Enter system view, return user view with Ctrl+Z.
может вам проще будет вот таким пакетом https://github.com/google/goexpect воспользоваться
источник

DP

Daniel Podolsky in Go-go!
Георгий Папаскири
не могу никак получить на печать нормальный вывод того что коммутатор отвечает, как его получить? Вывод в консоль выглядит так:
Warning: Telnet is not a secure protocol, and it is recommended to use Stelnet.

Login authentication


Username:admin
Password:
Info: The max number of VTY users is 5, and the number
     of current VTY users on line is 1.
<SUKHUM_LAKOBA_114>dis ver
Huawei Versatile Routing Platform Software
VRP (R) software, Version 5.70 (S2300 V100R006C05)
Copyright (C) 2003-2013 HUAWEI TECH CO., LTD
Quidway S2328P-EI-AC Routing Switch uptime is 1 week, 2 days, 17 hours, 26 minutes

ES2D1T28S000 0(Master) : uptime is 1 week, 2 days, 17 hours, 26 minutes
64M bytes DDR Memory
32M bytes FLASH
Pcb      Version :  VER B
Basic  BOOTROM  Version :  149 Compiled at Mar 15 2013, 11:02:25
Software Version : VRP (R) Software, Version 5.70 (V100R006C05)
<SUKHUM_LAKOBA_114>

А у меня получается как я указал выше
коллега, ну вы же не читаете ни доку, ни советы 🙂
источник

DP

Daniel Podolsky in Go-go!
Владимир Столяров
главное еще не игнорировать число действительно считанных байт, которое вернул Read
@GeorgePapaskiri , вот, например
источник

ГП

Георгий Папаскири... in Go-go!
Daniel Podolsky
@GeorgePapaskiri , вот, например
а можно чуть подробнее? что именно надо проверять, что число считанных байт равно тому что я указал в buf := make([]byte, 4096), то есть 4096?
источник

DP

Daniel Podolsky in Go-go!
func (t *Telnet) Read() {
buf := make([]byte, 4096)
for {
 n, err := t.Conn.Read(buf)
 if err != nil {
  panic(err)
 }
 t.Result = append(t.Result, string(buf[:n]))
 if strings.Contains(string(buf[:n]), t.WaitPrompt) {
  return
 }
}
return
}
источник

АП

Александр Попов... in Go-go!
Daniel Podolsky
func (t *Telnet) Read() {
buf := make([]byte, 4096)
for {
 n, err := t.Conn.Read(buf)
 if err != nil {
  panic(err)
 }
 t.Result = append(t.Result, string(buf[:n]))
 if strings.Contains(string(buf[:n]), t.WaitPrompt) {
  return
 }
}
return
}
а что у нас Read не в состоянии вернуть сразу нормально?
источник

АП

Александр Попов... in Go-go!
какие то обрезки слайса, зачем
источник

ВС

Владимир Столяров... in Go-go!
если возвращать "сразу нормально" это эпически увеличит число аллокаций
источник

АП

Александр Попов... in Go-go!
да пофиг на аллокации, у человека почему то вывод резало
источник

ВС

Владимир Столяров... in Go-go!
а, я думал, что речь про conn.Read
источник

DP

Daniel Podolsky in Go-go!
Александр Попов
какие то обрезки слайса, зачем
коллега, вы как-то эпически недообразованы 🙁
источник