목록 전체 글 (300)
배경나는 IoT 서비스 회사의 백엔드 개발자이다.약 260만 개의 기기에서 초당 6천 개에 달하는 기기 상태 이벤트가 발생하고 있다.나는 이를 수신하여 가공하고, 적재 또는 다음 서비스로 전달하는 파이프라인을 개발한다. 수많은 기기 상태 이벤트를 가공 없이 날것 그대로 저장하는 것은 매우 중요하다.적재된 데이터는 기기가 과거 특정 시점에 어떤 상태였는지 확인하는 히스토리가 되고,고객의 기기 동작 문의를 확인하거나 외부 플랫폼의 이벤트 처리 여부를 증명하는 중요한 증적이 된다. 데이터 저장소 비교1차 시도: CloudWatch처음에는 단순 로그로 취급하여 CloudWatch Logs에 모든 이벤트를 기록했고, 비용 문제를 만났다.CloudWatch Logs는 수집, 저장, 분석 세 가지 영역에서 비용이 발..
배경최근 국내 서비스들에 보안 이슈가 많았다.우리 회사도 보안 점검을 진행했고, 내가 맡고 있는 서비스의 인증 서버 역시 주요 대상이 되었다.요청 수 제한, 애플리케이션 키 관리, 로그 마스킹, 개인정보 보관 방법 등을 점검하고 개선했다.기능적으로는 '구글 연동 로그인'과 '2FA 강제'를 위한 추가 개발이 필요했다. 추가 기능을 개발하고 보안을 점검하기 위해선, OAuth 2.0으로 구현된 인증 서버를 먼저 이해해야 했다.아래는 그 과정에서 재밌었던 부분을 정리한다. OAuth 2.0 가 필요했던 이유지금까지의 경우와는 달리, 이번엔 내가 OAuth 서버를 운영하는 입장이 되었다.연동 서비스에서 OAuth 서버를 운영하는 이유부터 이해해야 했다. 우리 회사의 연동 서비스는 삼성, LG와 같은 외부 Io..
배경나는 IoT 서비스를 운영하는 백엔드 개발자이다.회사 기기는 삼성의 Smartthings, LG의 ThinQ, Naver Clova, KT, Kakao 등 국내 IoT 플랫폼 연동을 지원한다. 나는 플랫폼의 기기 제어 요청을 처리하고, 반대로 기기의 이벤트를 플랫폼으로 전달하는 중간 다리의 역할을 한다. 이벤트 파이프라인은 기기 상태 변화를 수신하고, 기기가 연동된 플랫폼으로 그 이벤트를 전달하는 역할을 한다. 화재 감지, 강제 문 열림 알림, 동작 감지 등, 이벤트는 단순히 앱 상 UI 변경만이 아닌, 사용자 안전 문제와 직결된다.그렇기에 지연 시간과 유실률은 서비스 신뢰도 문제이며, 안정적인 리소스 관리, 꼼꼼한 처리 증적 관리가 특히 더 중요했다. 처리량 증가서비스가 성장하며 이벤트가 크게 ..
배경알림 서비스 이야기이다.카프카로부터 메시지를 수신하고 이를 사용자에게 전달하는 서비스를 운영하고 있다.네트워크 통신 비용 절감을 위해 카프카에서 메시지를 배치 수신, 그룹 단위로 처리한다.그룹 단위 처리 중 예외가 발생하면 이미 처리한 내용을 잊기에 복구 시 메시지를 중복 수신하게 된다.이에 수신한 메시지 ID를 레디스에 기록하고, 처리 전 비교하는 것으로 이전에 수신했던 메시지 여부를 검증한다.간단한 메시지 ID 저장 구조 변경으로, 레디스 메모리 사용률을 33% 개선한 경험을 소개한다. String vs Hash 기존 구조는 수신한 각 메시지 ID를 레디스 String 타입으로 저장했다.양이 많고, 짧은 보관 기간의 데이터이기에, 각 메시지 ID를 레디스 Key로 하여 TTL을 명확하게 지정했다...
배경나는 아래의 상황에서 카프카를 생각한다.- 처리에 시간이 걸려서 메인 흐름 부에서 분리하고 싶을 때- 서비스 간 안전하고 순서가 보장된 이벤트 전달이 필요할 때 물론 비동기 처리와 이벤트 전달 방법은 많지만 방법마다 다른 제약이 존재한다.- Http : 이벤트를 전달받는 쪽의 상태에 의존적- Redis PS : Fire and Forget. 쏘기만 하고 잘 받았는지는 검증 않음- RabbitMQ : 여러 수신처에서 동일하게 수신하려면 여러 개 큐가 필요. 꼼꼼한 순서 보장을 위해선 단일 컨슈머 필요 카프카를 다루면서 고민해야 하는 포인트가 있다면 다음과 같다.- 브로커 측면 : 파티션 크기, 브로커 성능과 수 - 프로듀서 측면 : 메시지 키, 배치 크기, 배치 간격, 직렬화 방법- 컨슈머 측면 : ..
배경IoT 서비스 회사에서 백엔드 개발자로 일하고 있다.기기 사용 환경을 넓히기 위해, 자체 플랫폼 외 LG, 삼성, 네이버, 카카오, KT 등 다른 국내 IoT 플랫폼과의 연동 서비스를 지원한다.브라우저용 웹 대시보드도 그중 하나이다.나는 대시보드에서 발생한 제어 요청을 기기에 전달하고, 반대로 기기의 이벤트를 대시보드에 전달하는 중간 다리 역할을 맡는다.이 글에선 웹 소켓 서버의 관리 어려움과 이를 개선하기 위한 구조 변경 경험을 소개한다. 전통적인 웹 소켓 서버 아키텍처웹 소켓, SSE 같은 연결 유지가 필요한 서비스는 관리가 어렵다.자원 제한으로 서버의 수평 확장이 불가피하면서도,분산된 서버 환경에서 연결 정보가 있는 인스턴스를 찾을 수 있는 아키텍처가 필요하다. 1. 제한된 자원서버 한 대에서 ..
배경재밌는 일이 들어왔다. 회사의 카메라 기기를 외부 플랫폼에서 스트리밍 될 수 있도록 만들어야 했다. 회사에 DevOps가 따로 없다 보니 클라우드를 직접 만지고 비용을 관리한다. 특히나 우리 회사는 홈 카메라도 판매하기에 스트리밍을 위한 데이터 통신비가 얼마나 큰지 안다. WebRTC를 위한 모든 데이터가 서버를 거친다면, 그 속도도 문제지만 통신 비용도 클 것이다. 그래서 노드 간 직접 연결이 중요하다. 나는 여기가 재밌었다. 이 글 자체도 사실 이걸 얘기하고 싶었다.배포되지 않은 로컬 네트워크의 기기끼리 어떻게 서로를 찾아 직접 통신하는지 궁금했다. NAT 동작 과정P2P 통신의 원리를 이해하기 위해선, NAT의 동작 과정을 이해해야 한다.NAT 내부에서 외부에 요청을 보내면, NAT는 연결 정..
배경지난 글에서 논 블록킹을 구현하는 두 가지 방법을 확인했다.Netty는 커널의 I/O 멀티플렉싱 연산을 사용하고, DelayQueue는 커널 단의 스레드 제어 연산을 사용했다. 이번에는 CAS와 CountDownLatch가 궁금했다.사실 CAS와 CountDownLatch도 앞선 두 경우와 비슷할 것 같다는 생각에 파본 것인데, 그렇지 않았다.CAS는 전혀 다른 방법으로 동작했고, CountDownLatch는 짬뽕이었다. 나는 컴퓨터공학을 전공했다. 부끄럽지만 컴퓨터구조와 운영체제 수업을 가장 재밌게 수강했다.앞선 멀티 플렉싱이라는 키워드도, 앞으로 얘기할 커널 모드와 시스템 콜도, 다 공부한 개념인데 참 낯설다.오랜만에 복습할 겸, 운영체제와 자바 개발을 스르륵 녹일 수 있는 글이 되었으면 좋겠다..