기술/정리

마스토돈 기술 스택

함나현 2022. 12. 7. 14:04

나는 꽤나 마스토돈을 애정하는 편이다. 2020년부터 사용하였으니 그럭저럭 오래 사용도 한 것 같고, 항상 트위터에 이슈가 생길 때마다 마스토돈에 계정을 만드는 사람들이 늘어나는데 나는 그런 이유는 아니고, 애정하는 사람이 소개 시켜주어 시작하게 되었다.

마스토돈은 분산형 SNS로 이메일과 매우 유사한 측면이 있는 소셜미디어이다. 그래서 자기 서버에 직접 올려서 운영할 수도 있는데, 필요한 프로그램은 React, Redis, Ruby, Postgresql, Nginx 가 있다. (+ 추가적으로 검색기능이 필요하다면 Elastic Search를 붙이기도 하는 것 같다, 물론 그렇다고 모든 것들이 검색하는 건 아니고 내가 관심글로 지정하였거나 멘션이나 부스트를 하는 등의 나와 연관이 있어야 검색이 된다.) 물론 이메일 발송을 위한 SMTP 관련 서비스도 필요한데 보통 이건 서버에 설치하기 보다는 Mailgun 같은 서비스를 사용하는 것이 꽤나 편리하다.

해당 프로그램이 웹서비스임을 안다면 필요한 프로그램도 이해가 빠르다. Nginx는 웹서버, Postgresql은 DB, React는 프론트 구성, 그리고 Ruby로 프로그래밍된 웹어플리케이션을 사용할 것이다. 근데 Redis는 왜 쓰는거지

레디스는 시스템 메모리를 사용하는 키-값 데이터 DB 정도로 알고 있었다. 보통 캐싱 용도로 쓰는 것으로 알고 있는데, mastodon을 처음으로 만든 Eugen 가 운영하는 mastodon.social 정도 규모는 충분히 필요해보이지만(활성사용자 44 K) 필수 스택으로 넣은 것은 분명 이유가 있을 거라고 생각했다. 그래서 찾아보던 중 사이드킥이라는 걸 알게 되었다.

루비 온 레일즈는 사이드킥(Sidekiq) 이라는 비동기 라이브러리를 주로 사용하는 것 같았다. 찾아보니 루비의 멀티 스레드 성능 한계 때문에 레일즈는 싱글 스레드로 동작했고, 웹이라는게 어쩔 수 없이 비동기 작업이 필요하기 때문에(A의 웹페이지 요청이 끝나고 B의 웹페이지 요청이 들어가면 꽤나 문제가 크다) 사이드킥을 쓰는것 같았다. 그리고 그 사이드킥이 레디스를 요구한다.

https://github.com/mperham/sidekiq

해당 문서에 따르면 꼭 레일즈를 필요로 하지는 않는다고 되어 있지만 레일즈에서 사용하면 꽤나 편할거라고 하고 있다. 사용 자체는 으레 루비가 그렇듯 bundle이나 gem 에 추가하여 사용하면 되는 것 같다.(https://sidekiq.org/ 검색해보다가 알게된 사실이나 PRO 와 ENTERPRISE 버전도 구독형태로 판매하는 것 같았고, 구독하면 비공개 GEM 서버를 통해 파일을 내려받게 할 수 있는 것 같다)

그렇다면 사이드킥은 레디스에 해야할 일들을 큐 형태로 저장하고 워커를 통해 큐에 쌓인 일들을 가져가는 형태로 프로그래밍 되어 있다고 보는 것이 자연스럽다. 그리고 그동안 모더레이터 및 서버 관리자들의 말로 알게된 사이드킥의 역할은 다음과 같다.

알림 전송, 툿 저장-읽기, 타임라인 구성, 유저 생성, 삭제 가 있고, 서버 이전(마스토돈은 A 서버에서 B서버로 연결하여 팔로워 팔로잉 이동이 가능한데 그 작업이 사이드킥에 들어가는 것 같다), 툿 자동삭제(일정 기한 후 자동으로 정규화된 조건에 따라 툿을 삭제해주는 기능) 등 핵심 기능이 사이드킥과 워커, 레디스를 통해 이루어지는 것 같았다. 그리고 마스토돈 구조상 다른 서버에서 릴레이되어 본 서버에서 작업해야할 것들도 꽤 많기 때문에(A 서버에서 누군가 계정을 날리면 계정을 날렸다고 다른 서버에도 릴레이 되어 정보 삭제를 요청한다) 한번에 사용자가 많이 오면 워커 요청량이 많아 느리거나, 다운되는 것 같다.

반은 공식 문서를, 반은 내가 그동안 들었던 것들을 정리한 글이다. 아마 모든 것이 맞다고 말할 수는 없겠지만, 지금까지 찾아보고 정리한 것들을 쓴 내용이기에 혹시라도 수정이나 지적은 언제나 환영해요! 꽤나 찾아보고 정리하는 과정이 재밌어서 이런 글들을 좀 더 정리해서 올려볼까 싶다!

+ 왜 레일즈일까 고민해봤는데, 아무래도 제작자가 가장 익숙한 언어가 아닐까 싶다. Rails가 독일에서 꽤 수요가 있는 것 같기도 하고