목록 분류 전체보기 (287)
배경회사 서비스 중 하나로, IoT 기기를 코드로 조회/제어할 수 있는 API를 제공하고 있다. 서비스가 커지면서 해당 서비스에 과금 정책을 도입하여, 서버 비용을 충당하고, 과하게 리소스를 사용하는 사용자를 제한하고자 한다. 나는 포인트 결제, 차감, 보상 처리를 맡아, 잔여 포인트를 확인하고 처리를 제한하거나, 포인트를 차감하는 트랜잭션 처리를 개발하고 있다. 개발 요구 사항은 아래와 같다.1. 사용자의 잔여 포인트를 조회하고 사용량만큼 차감되어야 한다.2. 잔여 포인트 부족 시, 비즈니스 로직이 수행되어선 안된다.3. 서버 문제로 비정상 응답을 반환할 경우, 포인트는 차감되어선 안된다. 문제 시나리오, 차감과 보상 사이의 포인트 부족 현상서버 이상으로 비정상 응답이 반환될 때는 포인트가 차감되어선..
처리량 개선이 필요하다.회사가 성장하며 기기 이벤트가 크게 늘었다. 8개월 전까지만 해도 초당 1500건이었던 기기 이벤트가, 이제는 3500건을 넘는다. 한 달 동안의 이벤트 수 변화량만 보더라도, 그 수위가 점점 높아지는 것을 볼 수 있다. 기존 인프라와 로직으로는 늘어난 유입량을 못 따라가고, 곧 지연과 유실로 이어진다. 이벤트 컨슘부터 Ack까지의 흐름 안에는 다양한 로직들이 있다. 그래서 '어떤 구간이 문제다!'라기보다는, 주변 영향을 최소화하면서도 효과적인 개선 방향을 고민한다. 물론 어떤 경우에는 단순히 인프라만 늘리면 해결되는 경우도 많다. 프로세스를 더 띄우고, 스레드 수를 늘리는 게 제일 빠를 수도 있겠지만, 최대한 주어진 자원 안에서 개선하는 방법을 고민하는 게 요즘 우리 팀의 방향..
이벤트 파이프라인우리 회사 기기는 삼성의 Smartthings, LG의 ThinQ, KT, Genie, Kakao, Clova 등 여러 IoT 플랫폼에서 연동되어 사용된다. 서버는 기기의 이벤트를 외부 서버에 전달하여 해당 플랫폼에서 상태 변화나 알림을 반영될 수 있도록 한다. 이벤트 파이프라인은 기기의 연동 정보를 확인하여 이벤트를 전달하거나, 필터링하는 역할을 한다. 만약 이벤트에 지연이 생기거나 유실이 발생한다면, 단순히 기기의 상태 변화가 앱에 반영되지 않는 것을 넘어, 혼자 있는 집에서의 도어락 강제 문 열림 감지, 영업을 종료한 가게에서 발생한 동작 감지, 아기 방에서의 비정상 온도 경보 등, 사용자의 안전과 직결된 문제로 이어질 수 있다. 그래서 기기 이벤트 지연과 유실은 팀에서 가장 유심하..
미들웨어미들웨어는 애플리케이션 사이에서 데이터 흐름을 중계하거나 처리하기 위한 소프트웨어를 말한다. 사실 단순히 큐나 메시지 브로커만을 말하는 줄 알았는데, 정의에 따르면 WAS, GW, MQ, DBMS 등 내가 기존에 생각하고 있던 것보다 더 넓은 범위의 키워드로 생각된다. 요즘 이벤트 서버 성능 개선에 머리를 쓰고 있고, 서버를 구성하는 각 요소들의 성능 개선을 위해선 지금 어떻게 통신하고 있는지부터 알아야겠다는 생각이었다. 특히 톰캣에 요청이 너무 많이 유입이 돼서 에러가 날 때, 에러를 읽고 튜닝할 수 있는 눈이 필요했다. 자주 사용하고 있는 미들웨어들의 기본 설정이나 통신 방식들을 정리한다. # 메시지 브로커와 큐1. Kafka2. RabbitMQ3. Redis pub/sub4. AWS SQS5..
미들웨어미들웨어는 애플리케이션 사이에서 데이터 흐름을 중계하거나 처리하기 위한 소프트웨어를 말한다. 사실 단순히 큐나 메시지 브로커만을 말하는 줄 알았는데, 정의에 따르면 WAS, GW, MQ, DBMS 등 내가 기존에 생각하고 있던 것보다 더 넓은 범위의 키워드로 생각된다. 요즘 이벤트 서버 성능 개선에 머리를 쓰고 있고, 서버를 구성하는 각 요소들의 성능 개선을 위해선 지금 어떻게 통신하고 있는지부터 알아야겠다는 생각이었다. 자주 사용하고 있는 미들웨어들의 기본 설정이나 통신 방식들을 정리한다.# 메시지 브로커와 큐1. Kafka2. RabbitMQ3. Redis pub/sub4. AWS SQS5. Mosquitto와 MQTT# 웹 서버6. Tomcat7. Nginx8. ALB# DBMS9. Mysq..
플랫폼 확장하기나는 IoT 서비스를 운영하는 회사에서 일하고 있다.개발자들이 인프라를 다루기 위해 AWS를 사용하듯, IoT 개발 역시 플랫폼을 사용하면 쉽게 기기를 관리할 수 있다.기기 제어와 이벤트 처리를 플랫폼에 맡겨, 서비스 개발에 집중할 수 있게 하는 것이다.대신 각 플랫폼마다 성향과 기능이 달라, 이에 서비스 방향이 의존되기도 한다. 지금까진 단일 플랫폼으로 운영되고 있었다.나는 이를 확장하여 다른 여러 플랫폼을 함께 사용할 수 있도록 하는 프로젝트에 채용되었고,지금은 세 개의 플랫폼을 지원할 수 있게 되었다. 그 결과로 회사에 중요한 사업을 런칭하는데 기여할 수 있었다.무엇보다, 이후로 더 많은 플랫폼을 추가할 수 있는, 확장 가능한 시스템의 기반을 만들었다고 자부심을 갖고 있다.이 글에선 ..
배경 소개 팀에서 새로 인프라 구조, 아키텍처를 구성해야 하는 일이 있었다. 우리 팀은 Container 기반으로 서버를 운영하여, AWS ECS + Fargate를 사용하여 배포하기로 결정했다. 이때 VPC, ECR, ECS의 배포 정책이나 오토 스케일링을 모두 Terraform으로 관리하여 인프라 구성을 코드로 작성할 수 있도록 작업하였다. 이 글에선 이런 구조를 선택한 근거와 함께, 테라폼을 사용해서 얻을 수 있었던 팀 시점의 이점을 소개하려고 한다. 테라폼과 IaC선정한 ECS의 구축을 위한 AWS 리소스들은 모두 테라폼으로 작성, 코드로 관리하였다. 처음에는 다소 러닝 커브가 있었지만, 기반 코드를 만들어 소개하고 직접 한, 두 개 애플리케이션을 배포해 보면서 다들 금방 손에 익어하셨다. 낯선..
정합성이 깨지는 문제아래 update()에선 id에 해당하는 person의 이름을 수정한다. DB에서 person을 조회하고, Transaction이 종료되며 업데이트 쿼리를 수행한 후 Cache를 업데이트하게 된다.@Transactional@CachePut(key = "#id", value = "person")public Person update(Long id, String newName) { var person = personRepository.findById(id).orElseThrow(); person.setName(newName); return person;} 만약 이 update를 감싼 트랜잭션이 실패하게 되면 어떻게 될까.@Transactionalpublic void upda..