django 프로젝트에 비동기 도입하기 - 작성중
발단
업무 외적으로 동아리 팀원들과 서비스를 개발하여 서비스 중이다.
간단하게 소개하자면 보통 크롬 브라우저를 사용할 때 자주 접속할 사이트를 브라우저 상단에 북마크를 사용하여 관리하곤 할 것이다.
하지만 그러한 북마크의 접근성과 가시성 등 여러 가지 불편함에 팀내에서 의견이 모여 방문기록을 효율적으로 관리할 수 있는
크롬 확장 프로그램 UrLink를 개발하였다.
사용자에게 저장하고 싶은 URL을 받아서 해당 사이트의 메타 정보(title, description, image url) 등을
크롤링하여 저장하고 보여주는 비즈니스 로직이 들어가 있다. Python & Django 기반으로 구현하여 서비스를 출시하고
퇴근 후에 시간을 내어 신규 기능 개발, 유지 보수 등의 작업을 하고 있던 중 회사의 팀 내에서 개발하고 있는 서비스에
Spring WebFlux를 도입하기로 하여 개인적으로 스터디를 진행하게 되었다.
간단하게 Spring WebFlux란 Blocking I/O로 작동하는 기존 Spring MVC는 리퀘스트 1개당 1개의 Thread가 생성되어 일을 하였다. 이러한 스레드는 해당 요청을 완료하고 리턴하기까지 다른 일은 하지 못하게 묶이게 되는 낭비가 일어나게 된다. 이러한 문제를 적은 양의 Thread로 많은 양의 요청을 처리할 수 있도록 Non-Blocking 방식의 이벤트 기반 reactive 프로그래밍을 지원하는 모듈이다. 자세한 설명은 별도의 포스팅으로 작성할 예정이다.
Spring WebFlux 를 공부하다가 문득 사용자의 대량의 URL 등록 요청을 동기식으로 처리하는 UrLink 서비스에 비동기를 도입하면 성능에 개선이 있지 않을까? 라는 생각이 들게 되었다. 파이썬으로 비동기 프로그래밍을 해보는 것은 처음이었지만 서비스 및 개인적으로 발전이 있을 것 같아 도입해보기로 하였다.
동기와 비동기
동기식 프로그래밍(Synchronous Programming)은 직렬적으로 task를 수행한다.
즉 task는 순차적으로 실행되며 어떤 작업이 수행 중이면 다음 작업은 대기하게 된다.
예를 들어 서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때, 서버에 데이터를 요청하고
데이터가 응답될 때까지 이후 태스크들은 블로킹(blocking), 진행이 막혀있게 된다.
def first():
print("first")
def second():
print("second")
def third():
print("third")
if __name__ == "__main__":
first()
second()
third()
Comments