redis 공부 했습니다. 진짜 좋네요
이때까지 go 로 떡을 치면서 만들던 것들이 redis 하나로 다 되네요
redis cache, streams 위주로 쓸 것 같습니다
redis cache 는 go 애플리케이션과 postgresql 중간에서 in memory db 로서 사용할거고
데이터 영속성을 위해서 프론트엔드 PWA 웹브라우저 localstorage, indexedDB 와 백엔드 postgresql DB 그리고 redis streams(메세지, 이벤트 로그 1000개까지만) 에 분산저장할겁니다
redis streams 이거 물건이네요. pub/sub 필요없고 막바로 streams으로 갑니다
메시지 허브(물론 대규모 분산시스템에서의 rabbitMQ, kafka에 비할 것은 아니지만)
이걸 go 애플리케이션으로 만들면 메세지가 publish 될때마다 websocket 접속 goroutine 들을 for 문으로 돌려서 subscribe 하는 goroutine한테 브로드케스팅해줘야 되는데 (제 수준에는 이 정도부터 생각나네요) redis streams 같은 메시지 허브가 있으면 뭔가가 발행되면 알아서 컨슈머그룹에게 queue로서 브로드케스팅 해주네요. pending 걸어놓고 실패하면 다시 부여하는 기능과 로그 기능까지
작업 큐
이걸 go 애플리케이션으로 구현하자면 go channel이 FIFO 로 처리되기 때문에 queue로서 활용할 수 있는데 코드량도 많고 복잡하고 실패시 재부여도 하기 어렵고 기록도 안남고 서버나 go프로그램 중단되면 다 날라가버리고. redis streams 쓰면 코드 몇줄이면 go worker들을 컨슈머그룹에 넣으면 알아서 정합성,일관성 다 되네요
postgre가 좋은 점도 공부 했습니다
ansi sql 잘되고 json/jsonb(jsonb가 좋은거였네요) nosql-like도 잘되고
postgis 같은 위치기반 그리고 timescaleDB 같은 시계열기반도 지원하고
sql에 timestamp 넣어서 분석하는 것보다 대규모 시계열정보에서 timescleDB가 좋은 것이 시계열정보를 chunk로 분리해서 따로 관리하기 때문에 쉽게 search & retrieval 이 된다는거네요
실시간 서비스는
client web browser - websocket - go - redis streams - postgresql
그리고 SSE(server sent event 알림), webRTC 이 3가지 동시에 쓰면 좋을 것 같고
auth는 홈서버 백엔드1(cloudflared tunnel - nginx - go gin)에 authentik 설치해서 쓰려다가
authentik이 docker compose (3개로 구성)로 실행되기 때문에 램을 도커가 300mb 애플리케이션이 500mb 총 1GB 가까이 잡아 먹는 점과
python djang 애플리케이션이라는 점(python 별로 안 좋아합니다)
그리고 결정적으로 authentik이 인증 단계에서 인증 웹페이지를 띄우게 되는데 백엔드에서는 정적이든 동적이든 웹페이지 띄우는 것은 보안이든 기능이든 구조든 그런 원칙에서 벗어나는 것이라
(웹페이지는 무조건 cloud dns, pages, cdn 에 sveltekit 빌드로 배포해서 서빙하는걸로)
결국 authentik 직접 설치하는 것은 포기하고
cloudflare access (zero trust) 이거 사용하기로 했네요. https, wss 같은 접근 인증은 이용자 제한없는 무료입니다
tunnel 통해서 내부망 ssh 접근 인증은 150명 이용자 제한 있고요
그러니까 프론트엔드 cloudflare pages 및 access에서 웹정적파일 서빙과 인증까지 다 해서 백엔드는 html header 로 로그인 정보만 받아서 이용하는 겁니다. 백엔드 서버는 더 이상 자체적인 세션 관리(세션 저장, 쿠키 발행 등)를 할 필요가 없습니다. cloudflare access에서 대신해 주는거죠
N100 16GB RAM 미니PC 2대로 안 그래도 버거운데 docker니 자체auth니 다 필요없어요. 헝그리 하게 가렵니다
대신 naver, kakao, toss 같은 한국형 인증/로그인은 어렵습니다 google, apple 정도가 일반인 대상으로 쓸만할 것 같네요
뭐 redis, postgre, cloudflare access 보다 더 좋은 것 있나요?