본문 바로가기
Ruby on Rails

[Ruby on rails] anycable로 채팅 개발하기 1. 개념 정리

by 혜리루 2020. 11. 22.

1. Anycable

rails5부터 web socket 통신을 위해 action cable이라는 feature가 새로 도입되었습니다.

action cable은 사용하기에 아주 편리하고 개발이 빠르다는 장점이 있는반면에 다른 websocket 서버들에 비해 속도가 느리다는 단점이 있었습니다.ruby 언어 자체가 여타 언어들에 비해서 느린축에 속한다는 것이 속도 저하의 이유중에 하나인데요, 

아래 그림은 golang, erlang, ruby(action cable) 웹소켓 서버의 메모리 사용량과 broadcasting 속도를 비교한 것입니다.

 

출처: https://evilmartians.com/chronicles/anycable-actioncable-on-steroids

 

출처: https://evilmartians.com/chronicles/anycable-actioncable-on-steroids

다른 부연설명 없이 한눈에 보기에도 actionCable이 너무 극명하게 느리네요.하핫

 

뭐 이런 이유로 anycable이 탄생하게 됐습니다.

anycable을 이용하면 rails app server와 함께 다른 언어로 구현된 websocket 서버를 사용할 수가 있습니다. anycable은 rails의 action cable과 같은 프로토콜을 사용하기 때문에 client에는 이에 관한 소스 코드를 수정하거나 추가할 필요 없습니다.

 

 

출처: https://evilmartians.com/chronicles/anycable-actioncable-on-steroids

위 그림은 anycable의 구조인데요, anycable의 구조와 작동을 설명하기 전에 이번 포스트에서는 각각의 개념들부터 하나씩 짚고 넘어가려고 합니다.

 

2. 웹소켓

웹소켓은 HTML5 표준기술로 하나의 TCP 접속에 전 이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다.
브라우저와 서버사이의 동적인 양방향 연결채널을 구성한다.

3) 특징

1. gmail처럼 실시간 특성을 중시하는 웹앱에 사용하면 좋다.
2. 웹소켓을 이용하면 http접속으로 양방향 메시지를 주고받을 수 있다.
3. 서버와 클라이언트가 특정 port를 통해서 연결을 성립하고 있다.
4. 서버와 클라이언트가 연결을 계속 유지한다.
5. 서버와 클라이언트 양쪽에 소켓이 있고 두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있다.

4) 서버소켓
서버소켓은 클라이언트로부터 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만든다.

5) 클라이언트소켓
클라이언트 소켓은 기다릴 필요가 없다. 바로 소켓을 생성한다. 서버에 연결을 요청, 데이터를 전송하는 일을 한다. 

6) tcp 소켓과의 차이점

a. 최초 접속이 HTTP 리퀘스트를 통해 handshaking 과정이 이루어진다는 것.
b. http request를 이용(80, 443 포트를 용할 수 있다.)

 

3. RPC

네트워크로부터 떨어져있는 컴퓨터에서 코드를 실행하는 방식(remote procedure call)
코드를 메인코드와 작업코드로 독립시킬 수 있다. 네트워크 연결하는 부분, 코드를 실행하는 부분 등 세부적으로 나눌 수 있다.
따라서 rpc를 이용한 네트워크 프로그램은 실행인자, 실행할 코드를 명확하게 해야한다.

* rpc를 사용하는 이유
1) 분산 네트워크 환경에서 프로그래밍을 쉽게 하려고.

2) 클라이언트, 서버간에 커뮤니케이션에 필요한 정보는 감추고 일반 메소드를 호출하는 것처럼 호출한다.

 

4. redis

key value 기반의 오픈소스 인메모리 데이터 저장소. 모든 데이터를 메모리에 저장하기 때문에 속도가 빠르다.

인메모리이면서도 데이터의 영속성을 보장한다.

db로 사용되기도 하고, cache나 message broker로도 사용된다.

문자열, array, set, 정렬된 set 등의 데이터 형식을 지원한다.

 

* pub / sub

 redis 에서는 message를 subscribe, publish 하는 기능도 제공된다.

(메시지를 받는)client와 server는 channel을 subscibe하고, publish한다. 따라서 client 입장에서는 channel 뒤에 어떤 server가 있는지 신경쓸 필요 없이 channel만 subcribe하면되고, server 역시 어떤 subscriber가 있는지 신경쓸 필요 없이 channel에 메시지를 publish하면 된다. 

유사한 기능을 제공하는 apache kafka등과 다른 점은 메시지를 보존하지않는다는 점이다. 메시지를 전송한 후에 따로 저장하지않고 삭제한다.  그리고 Publish 하는 시점에 이미 실행한 subscribe 명령으로 대기하고 있는 클라이언트들에게만 메시지가 전달된다.

따라서 client의 message 수신이 보장되지않는다.

 

 

출처: evilmartians.com/chronicles/anycable-actioncable-on-steroids

 

AnyCable: Action Cable on steroids — Martian Chronicles

This article tells the story of the AnyCable project that aims to increase Action Cable performance and capabilities.

evilmartians.com

redisgate.kr/redis/command/pubsub_intro.php

 

Pub/Sub Introduction Redis

pubsub_intro Pub/Sub Intro 소개 메시지 보내기, 받기 일반적인 데이터베이스와는 다르게 레디스는 메시지를 주고, 받는 기능을 제공합니다.   Publish 명령으로 보내고, Subscribe 명령으로 받습니다. 통로

redisgate.kr

brunch.co.kr/@springboot/374

댓글