WebSocket 브로드캐스팅을 활용한 실시간 서버 구축

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 대상: Rust 언어 및 hyperlane 프레임워크를 사용하는 웹 서버 개발자
  • 난이도: 중간 (비동기 처리 및 WebSocket 프로토콜 이해 필요)

핵심 요약

  • hyperlaneWebSocket 프로토콜을 자동으로 처리하며, send_response_body 메서드를 통해 서버-클라이언트 간 메시지 전송 가능
  • 브로드캐스팅hyperlane-broadcast 라이브러리를 사용해 다중 클라이언트 간 실시간 메시지 공유 가능
  • 클라이언트는 WebSocket 객체를 통해 서버에 시간 정보 전송브로드캐스트 수신 가능 (JavaScript 예제 제공)

섹션별 세부 요약

1. `hyperlane`의 WebSocket 지원

  • hyperlaneWebSocket 프로토콜을 natively 지원하며, 프로토콜 업그레이드를 자동 처리
  • send_response 메서드 사용 시 WebSocket 형식에 맞지 않는 응답으로 인해 클라이언트 파싱 오류 발생 가능
  • 예시 코드:

```rust

pub async fn handle(ctx: Context) {

let request_body: Vec = ctx.get_request_body().await;

ctx.send_response_body(request_body).await;

}

```

2. 브로드캐스팅 구현

  • 브로드캐스팅hyperlane-broadcast 라이브러리를 사용해 구현
  • tokio::select를 통해 동시에 클라이언트 메시지 수신 및 브로드캐스트 채널 데이터 수신 가능
  • enable_inner_websocket_handle이 활성화되지 않은 경우, 클라이언트가 최소한의 메시지 전송 필요 (예: 빈 메시지)
  • 브로드캐스트 채널 초기화 예시:

```rust

static BROADCAST_CHANNEL: OnceLock> = OnceLock::new();

fn ensure_broadcast_channel() -> Broadcast {

BROADCAST_CHANNEL.get_or_init(|| Broadcast::default()).clone()

}

```

3. 클라이언트 예제 (JavaScript)

  • 클라이언트는 WebSocket 객체를 통해 서버에 1초 간격으로 시간 정보 전송
  • 서버에서 브로드캐스팅된 메시지 수신 시 onmessage 이벤트로 로깅
  • 예시 코드:

```javascript

const ws = new WebSocket('ws://localhost:60000/websocket');

ws.onopen = () => {

setInterval(() => {

ws.send(Now time: ${new Date().toISOString()});

}, 1000);

};

ws.onmessage = (event) => {

console.log('Receive: ', event.data);

};

```

결론

  • hyperlane을 사용하면 WebSocket 핸드셰이크 및 프로토콜 복잡성을 수동으로 관리할 필요 없이 실시간 서비스 개발이 간소화
  • 브로드캐스팅 구현 시 hyperlane-broadcast 라이브러리와 send_response_body 메서드 사용 필수
  • 클라이언트는 JavaScript 기반 WebSocket API를 통해 서버와 실시간 상호작용 가능