본문 바로가기

[Python]/[Flask & Django]

[Celery] Side-Project(Ant Platform) - 5. Chat server, Socket.io

728x90

[ 일단 회고.. 데이터 언제 쌓아보냐고! ] 

    한국어 데이터 수집을 목표로 한 사이드 프로젝트를 계속 진행중이다. 지금까지는 간단한 notification-server와 함께, 비동기 처리를 위한 celery, 메세지 큐로 RabbitMQ와 Redis, 부하테스트 툴로 locust를 활용해 왔다. 이후로는 chatting server를 scale-out 가능한 형태로 만들려고 한다(유저 1만명 이상의 데이터를 수집 가능하도록...!!) 

 

[ 앞으로 방향 ]

  여러가지 참고할 문서들이 있다. 일단 GKE (google kubernetes engine)위에서 돌아가는 Cloud Run을 사용할 것이다. Serverless이고, 무엇보다 k8s에 대한 공부가 아직 부족해서 직접 쿠버네티스로 아키텍쳐를 구성하기 전까지 한번 사용해보고자 한다.    참고) 

 

[GCP]Serverless 서비스인 Cloud Run 알아보기 1부 — Cloud Run 개요

안녕하세요 이정운 입니다.

medium.com


    다음은 채팅서비스에 대한 아키텍쳐 구조인데, 우아한형제들 기술블로그를 구경하다가 잘 정리해놓은 포스팅을 발견했다. netty,spiring,kafka,redis기반으로 동작하는 구조이다. 물론 나는 서버 프레임웍은  python 기반 flask나 fastAPI를 사용하겠지만 전체적인 구조는 비슷할테니까. 다행히 설명이 워낙 친절해서 포스팅의 전체적인 내용을 간단하게 훑어보는데는 크게 어려움이 없었다(내가 이러려고 자바/스프링도 안졸고 들어두었지ㅎㅎ). 하지만 netty와 mqtt같은 메세징 프로토콜은 다시 확인해봐야겠다..

 

우리도 채팅있으면 좋을 것 같아요. - 우아한형제들 기술 블로그

이 글에서는 Netty를 이용해 채팅 서버 구축을 위한 기본 셋팅과 구조에 집중해 이야기를 전개합니다.실제 운영환경에서 서비스되는 시스템을 만드는 과정은 많은 고민과 트러블슈팅이 필요하기

woowabros.github.io

 

[ Socket vs HTTP(Rest) ]

    보통 Socket 통신을 이야기할때 Http 통신과 비교를 많이 한다. Http통신은 Client측에서 요청이 있는 경우, Server가 이에 대해 응답하고 곧바로 연결을 종료하는 방식을 말한다. 실시간으로 연결을 유지해 데이터를 주고받는 상황이 아니라, 필요한 경우 요청해서 사용하고자 할 때 유리하다. 반면, Socket통신은 Server와 Client가 특정 Port를 사용해 실시간으로 양방향 통신을 하도록 하는 것이다. 

    여기서 Socket이란, 네트워크상에서 동작하는 프로그램간 통신의 종착점(EndPoint)을 의미한다. 다르게는 프로토콜, IP, 포트번호로 이루어진 구조체라고 말할 수 있다. 이 Socket을 이용한 Socket통신은 Http통신과 반대로 연결상태를 유지하므로 동영상 스트리밍 등 실시간 통신에 유리하다. 자세한 내용은 다음 표를 참고하면 된다. (하단 관련 링크 첨부)

The basis Of Comparison  WebSocket REST
HTTP The use of HTTP occurs in the initial connection. HTTP is a common protocol in RESTful web services.
Communication Bi-directional in nature. Uni-directional in nature.
Nature Socket-based concept. Resources based concept, rather than commands.
Scenario Real-time chat application. Lots of getting request.
Dependency Rely on IP address and port number. Based on the HTTP protocol and uses HTTP methods to relay data.
Cost The cost of communication is lower. The cost of communication is comparatively higher than WebSocket.
Performance Better with high loads. Great for occasional communication.
State WebSocket is a stateful protocol. REST is based on HTTP, which is a stateless protocol.
 

WebSocket vs REST | Learn The 8 Important Differences

In this WebSocket vs REST article, we will look at their Meaning, Head To Head Comparison, Key differences and Conclusion in a simple and easy ways.

www.educba.com

 

[ chat server, socket.io 간단정리 ]

     앞서 얘기했듯이 Socket통신은 client와 server가 쌍방으로 통신을 주고 받는 형태이기 때문에 flask단에도 socket관련 코드가 들어가 있고, 프론트의 html코드에도 socket관련 자바스크립트 함수가 들어가 있다.

    일단은 간단한 chat-server를 만들었다. 구글링을 하며 여기저기 참고했다. 어짜피 화면단은 프론트에서 싹 뜯어고쳐줄 것이라 간단하게 만들었고, 내부에 간단한 소켓통신을 구현했다. 이후로 chat 데이터들을 Redis에 보내는 작업, cloud-run 붙이는 작업, 스케일 아웃이 가능하게끔 환경을 만들면 된다. 목표 유저수는 1만명이라 거기에 맞게끔 아키텍쳐를 잘 구성하는 것이 목표다!! 내부에 사용한 함수들은 flask-socketio에서 제공하는 함수들을 사용했다. 

 

Seungyeup/Study-DjangoFlask

장고,플라스크 복습. Contribute to Seungyeup/Study-DjangoFlask development by creating an account on GitHub.

github.com

     보면 socket프로그래밍을 위한 라이브러리를 사용하는데, Flask용이 있고, python용이 있다. 후자가 좀더 범용적으로 사용할 수 있는 것 같고, star는 전자가 더 많다. 

(flask-socket) -> https://flask-socketio.readthedocs.io/en/latest/api.html

 

API Reference — Flask-SocketIO documentation

Parameters: async_mode – The asynchronous model to use. See the Deployment section in the documentation for a description of the available options. Valid async modes are threading, eventlet, gevent and gevent_uwsgi. If this argument is not given, eventle

flask-socketio.readthedocs.io

(python-socket) -> https://python-socketio.readthedocs.io/en/latest/server.html#using-a-message-queue

 

The Socket.IO Server — python-socketio documentation

The Socket.IO Server This package contains two Socket.IO servers: The methods in the two servers are the same, with the only difference that in the asyncio server most methods are implemented as coroutines. Installation To install the Socket.IO server alon

python-socketio.readthedocs.io


크게 SocketIO, @socketio.on, join_room, emit, leave_room 이 있다. 관련 함수에 대한 내용은 코드에 주석 첨부하였다.

 

728x90