studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 용도
  • 작동 방식
  • 생성
  • 연결 (Handshake)
  • 전송
  • 이벤트
  • 종료
  • 고려 사항
  • 웹소켓을 사용할 때 발생가능한 overhead
  • Long-live web socket connection을 위해 고려해야될 사항
  • 성능 체크리스트

Web Socket 정리

용도

  • 서버와 클라이언트 간 양방향 통신을 지원하기 위해 만들어짐

  • 기존 Real-time 통신에 사용하던 polling, long-polling, streaming 모두가 한계점을 가지고 있어 필요해짐

    • polling : real-time 통신에서는 언제 통신이 발생할지 예측이 불가능하여 불필요한 request와 connection을 만듬

    • long-polling : 용량이 큰 메세지를 주고받게 되면 polling에 비해 결국 개선점이 없음. 또한 많은 양의 메세지가 쏟아질 경우 제어가 불가능.

    • streaming : HTTP의 특징상, 방화벽이나 프록시 서버가 사이에 끼어들게 되면 불필요하게 response를 buffer하여 메세지 전송 시간이 길어지는 문제가 있음. TLS를 쓰면 이러한 문제는 해결할 수 있으나 각각의 커넥션에 드는 비용이 커지는 한계가 존재

    • 결과적으로 이 모든 방법이 HTTP를 통해 통신하기 때문에 Request, Response 둘다 Header가 불필요하게 큼.

작동 방식

생성

WebSocket(URL[, Protocols])

  • URL은 연결 대상 URL

  • Protocols는 String 내지는 Array으로 각각 element에 해당하는 subprotocol을 생성.

  • 실질적으로 connection 을 생성하는 것은 비동기적으로 진행

readyState

  • CONNECTING (0) - connection이 아직 성립되지 못함

  • OPEN (1) - connection이 성립됨. communication 가능.

  • CLOSING (2) - close() 메소드가 불려지거나 closing handshake 진행중

  • CLOSED (3) - connection이 닫혔거나 열리지 않았음.

연결 (Handshake)

Client Request

GET /{path} HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: {hostname}

Server Response

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade

전송

순서

  1. readyState === OPEN 체크.

  2. WebSocket Message 전송.

  3. 전송에 실패했는데 buffer가 꽉찬거면 WebSocket as full flag를 세우고 connection 닫기.

  4. 메세지 크기만큼 bufferedAmonut에 더하기.

Message, Frame

  • Message

    • 여러 frame이 모여서 구성하는 하나의 논리적 메세지 단위

  • Frame

    • communication에서 가장 작은 단위의 데이터.

    • 2 ~ 14 bytes header + payload

bufferedAmount

  • send()에 의해 호출되었으나 아직 네트워크로 전송되지 못한 데이터의 크기를 기록

binaryType

  • blob

    • 디스크에 저장

  • arrayBuffer

    • 메모리에 저장

이벤트

type

handler

open

onopen

message

onmessage

error

onerror

close

onclose

종료

  1. WebSocket closing handshake 시작. readyState CLOSING으로 변경

  2. 깨끗하게 종료되었으면 readyState CLOSED으로 변경

  3. 에러가 있었으면 error 이벤트 생성

  4. 문제가 없었다면 close 이벤트 생성

고려 사항

웹소켓을 사용할 때 발생가능한 overhead

웹소켓을 사용하면 데이터를 전송할 때 overhead를 최소화시키는게 가능

  • 그러나 브라우저 캐시를 이용할 수 없어서 경우에 따라 요청 빈도가 증가하여 오히려 더 큰 트래픽을 유발할 수 있음

구조에 CDN과 같은 중간 배포 단계들을 포함시키기 힘듬

Long-live web socket connection을 위해 고려해야될 사항

서버측 네트워크의 라우터, 로드밸런서, 프록시 등

  • 기본적으로 대부분의 웹서버와 로드밸런서 등은 HTTP에 최적화되어있고, 그에 따라 timeout이 아주 짧은 편

  • 데이터 흐름을 따라 내 제어하에 있는 모든 단계의 설정에서 timeout을 길게 수정

  • 물론, 각각 connection은 모든 단계의 자원을 추가로 소비하기 때문에 보안, 자원 절약, 예방적 차원에서 짧은 timeout이 옳을 수도 있음.

ISP, carrier 등 외부 네트워크 프록시

  • WSS TLS 사용

클라이언트측 라우터, 방화벽, 프록시 등

  • 경우에 따라선 web socket을 완전히 사용할 수 없는 때도 있으므로 fallback strategy 필요

성능 체크리스트

  • 신뢰성 있는 데이터 전달을 위해 Secure Websocket(WSS over TLS)을 사용하라

  • 가능한한 polyfill 성능을 위해 주의를 기울여라

  • application protocol을 만들 때, subprotocol negotiation을 활용하라

  • binary payload를 최적화하여 전송 크기를 최소화하라

  • UTF-8 데이터는 암호화하여 전송 크기를 최소화하라

  • 전달받은 binary payload에 올바른 binary type을 지정하라

  • 클라이언트에 buffer된 데이터 양을 모니터링하라

  • head-of-line blocking을 피하기 위해 큰 메세지는 분할하라

  • 적용가능한 전송 수단을 활용하라

PreviousFluentd 테스트NextAkka

Last updated 7 years ago