-
[채팅 백엔드 보안] WebSocket은 무엇으로 지키고, 셀프호스팅한 메시지 큐는 누가 들여다보나
WebSocket 채팅을 무엇으로 인증·격리하는지(JWT HS256 + TLS + 테넌트 네임스페이싱), 메시지 큐로 RabbitMQ를 고른 이유와 PV 구성, 그 큐를 headless ClusterIP로 바깥에 안 여는 접근…
-
[인프라 자동화] Provider 계층만 교체한다 — 인프라에 적용한 Hexagonal과 ‘무료가 기본값’인 스킬 설계
GKE에서 OKE로 갈아탔는데 ArgoCD·Traefik·배포 스크립트는 한 줄도 안 바꿨다. 인프라 자동화 스킬을 Hexagonal 포트/어댑터로 설계해 클라우드 provider 계층만 교체하는 법, 실수로 과금되지 않도록 ‘무료를 기본값’으로…
-
[Flutter × 채팅] 낙관적 UI와 clientMsgId — 서버 멱등키가 클라이언트에서 중복 제거로 완성되는 지점
이중 쓰기(WS 릴레이 + REST 영속화)를 하면 내가 보낸 메시지가 WS로 되돌아와 중복된다. Flutter 앱 Bibleana가 clientMsgId 하나로 낙관적 UI와 에코 dedupe를 잇는 방법, single-flight…
-
[채팅 백엔드 설계] 방이 두 pod에 흩어졌을 때 — RabbitMQ fan-out과 app_key 멀티테넌시
게이트웨이를 여러 pod로 늘리면 같은 방의 두 사용자가 서로 다른 인스턴스에 붙는다. RabbitMQ topic exchange에 인스턴스별 ephemeral 큐를 바인딩하고 origin 태그로 중복을 막는 fan-out, 그리고…
-
[채팅 백엔드 설계] 게이트웨이를 일부러 멍청하게 — 실시간 릴레이와 영속화를 분리한 이유
채팅 백엔드에서 실시간 전달과 메시지 영속화를 한 서비스에 묶으면 DB 장애가 실시간을 죽이고 스케일링이 어려워진다. room-gateway를 DB도 비즈니스 로직도 없는 ‘dumb pipe’로 두고, 클라이언트가 WS…
-
[OKE 인프라 학습 시리즈] arm64 노드에 실제 서비스 얹기 — 무료 OKE 배포에서 부딪힌 함정들
무료 A1(arm64) 단일 노드에 Go 채팅 백엔드 8개 pod를 얹으며 실제로 부딪힌 것들. cri-o의 short-name 거부, RabbitMQ의 deprecated env로 인한 부팅 실패, WebSocket을 위한 sessionAffinity·graceful…
-
[OKE 인프라 학습 시리즈] 무료 클러스터에 https:// 붙이기 — Traefik LoadBalancer + 도메인 + cert-manager
OKE 클러스터는 떴지만 바깥에서 접근할 수 없다. Traefik를 Service type=LoadBalancer로 붙여 OCI 무료 10Mbps LB 공인 IP를 받고, 도메인을 A 레코드로 연결한 뒤, cert-manager와 Let’s…
-
[OKE 인프라 학습 시리즈] 관리비 $0로 쿠버네티스 띄우기 — OCI Always Free로 OKE 클러스터 구축
OCI Always Free 한도 안에서 관리형 쿠버네티스(OKE)를 월 $0로 띄운다. Basic 클러스터 + A1.Flex(arm64) + 4 OCPU/24GB 무료 조건, 세션 토큰 대신 API 키 인증,…
-
[OKE 인프라 학습 시리즈] 클라우드 런에서 오라클 쿠버네티스(OKE)로 — 왜 다시 상시 가동 환경으로 옮기나
GKE 인프라 학습 시리즈에서 GKE에 직접 서비스를 띄우고 비용을 줄이는 이야기까지 왔었다. 그 뒤 개인 앱은 비용 문제로 Cloud Run으로 한 번 옮겼는데, 이번엔 방향을…
-
애드센스는 어떻게 내 사이트를 평가할까 — Googlebot 자동 크롤과 Search Console로 그 근거 확인하기
오늘 내 블로그의 색인 상태를 Google Search Console에서 직접 뜯어보다가, 그동안 막연하던 그림 하나가 또렷해졌다. 애드센스 심사는 누가 사람이 앉아서 페이지를 넘겨보는 게 아니라, 구글이…