Skip to content

Instantly share code, notes, and snippets.

@otakijae
Last active October 10, 2022 14:06
Show Gist options
  • Save otakijae/5fe0f2bcff794622695ecd8dde231a49 to your computer and use it in GitHub Desktop.
Save otakijae/5fe0f2bcff794622695ecd8dde231a49 to your computer and use it in GitHub Desktop.
send http2 ping frame
func (w *HttpBo)Ping(network, address string) error {
if transport, ok := w.Client.Transport.(*http2.Transport); !ok {
return errors.New("Getting HTTP2 Client Transport failed")
} else {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
conn, err := tls.Dial(network, address, &tls.Config{NextProtos: []string{http2.NextProtoTLS}})
if err != nil {
return err
}
cc, err := transport.NewClientConn(conn)
if err != nil {
return err
}
if err := cc.Ping(ctx); err != nil {
return err
} else if err := cc.Shutdown(ctx); err != nil {
return err
}
}
return nil
}
@otakijae
Copy link
Author

polling

long polling

  • 메시지를 보내는 클라이언트와 수신하는 클라이언트가 같은 채팅 서버에 접속되지 않을 수도 있다. http 서버들은 보통 stateless 서버다. 로드밸런싱을 위해 라운드로빈을 사용하는 경우, 메시지를 받은 서버는 해당 메시지를 수신할 클라이언트와의 롱 폴링 연결을 가지고 있지 않은 서버일 수도 있다.
  • load balancing & sticky session ?
  • Persistence: 부하분산 장치의 중요한 기능 중 하나. 애플리케이션이 사용중인 세션을 같은 서버에 지속적으로 할당하는 기능

web socket

  • 서버와 클라이언트 간에 socket connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록
  • 일반 HTTP Request를 통해 handshaking 과정을 거쳐 최초 접속이 이루어진다.
  • 최초 handshake ask & ack
  • 서버 측 연결 관리 필요. http port 그대로 활용

http2

downchannel 구성 & 연결 유지 http2 ping

  • 시간 지나면 끊어짐. 계속 유지해야하는 경우 http2 ping check 필요

  • handshake GET & access token 으로 수행

  • 클라이언트가 CIC와 최초 연결 시 수행되어야 하는 작업은 downchannel을 구성하는 것입니다. Downchannel은 CIC로부터 지시 메시지를 받을 때 사용됩니다. 이때, 전달받는 지시 메시지는 클라이언트의 이벤트 메시지에 대한 응답으로 전달되는 지시 메시지가 아닌 특정 조건이나 필요에 의해 CIC가 주도(Cloud-initiated)하여 클라이언트에 보내는 지시 메시지입니다. 예를 들면, 새로운 알림(push)이 도착했다면 downchannel을 통해 지시 메시지가 전달될 것입니다.

  • Downchannel 연결이 종료되거나 끊어지면 클라이언트는 즉시 새로운 downchannel을 구성하여, CIC로부터 전달되는 지시 메시지를 받지 못하는 일이 없도록 해야합니다.

  • CIC와 연결이 유지되고 있는지 파악하기 위해 클라이언트는 1 분 간격으로 HTTP/2 PING 프레임을 CIC로 전송해야 합니다. CIC로부터 HTTP/2 PING ACK 응답을 받지 못하면 클라이언트는 즉시 새로운 연결을 구성해 클라이언트와 CIC간의 연결이 지속될 수 있도록 해야합니다. HTTP/2 PING 프레임에 대한 자세한 설명은 HTTP/2 PING Payload Format을 참조합니다.

multipart message 음성 파일 전송/수신 (push)

  • 사용자 음성 데이터를 전송 혹은 음성 답변 데이터를 받는데 사용
  • 예를 들면, 사용자의 음성 입력을 CIC로 전달하려면 SpeechRecognizer.Recognize 이벤트 메시지와 함께 녹음한 사용자의 음성 데이터를 함께 전송해야 합니다.
    클라이언트는 Content-Type을 multipart/form-data로 설정하고 첫 번째 메시지 파트에는 이벤트 메시지 정보가 담긴 JSON 데이터를 두 번째 메시지 파트에는 사용자의 음성이 담긴 바이너리 데이터를 담아서 보낼 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment