-
-
Save otakijae/5fe0f2bcff794622695ecd8dde231a49 to your computer and use it in GitHub Desktop.
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 | |
} |
Clova CIC server to server 연동 작업
https://developers.naver.com/console/clova/client/Develop/Guides/Interact_with_CIC.md#SendEvent
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 데이터를 두 번째 메시지 파트에는 사용자의 음성이 담긴 바이너리 데이터를 담아서 보낼 수 있습니다.
HTTP/2 프로토콜 협상
issue
use of closed network connection
발생함.ALPN based connection for https:// URIs
ALPN stands for Application Layer Protocol Negotiation, and is a TLS extension that allows a client to negotiate the next protocol to use after the TLS handshake is complete. If either the client or the server does not support ALPN, then it will be ignored, and HTTP/1.1 will be used instead.
HTTPS 통신에서의 HTTP/2 연결