아키텍처를 완성하곤 ERD와 API 명세서를 빠르게 완성했다

나는 여기서 팔로우 기능을 맡았다.
맛집 추천 피드 시스템 특성상 특정 시간에는 트래픽이 몰릴 수 있고, 특히 좋아요나 팔로우는 대량의 요청이 들어올 수 있어서 이를 안정적으로 처리하기 위해 sqs와 lambda로 비동기적으로 처리하기로 했다. 로직은 다음과 같다.

로직 자체는 저장 로직만 있어 단순해 람다 함수로 사용하기 적합하다고 생각했다.
간단한 로직임에도 사용하는 인프라가 많아서 고민점이 많았다.
Lambda는 콜드 스타트라는 고질적인 문제가 있다. 함수가 처음 호출되거나 오랫동안 호출되지 않으면 Lambda는 이 런타임 환경을 새로 생성해야 하므로 스크립트 언어는 이 과정이 컴파일 언어에 비해 길어질 수 있다. 특히 자바는 JVM 환경에서 실행되기 때문에 Lambda 가 호출될 때마다 JVM이 초기화되는 무거운 과정을 거치므로 콜드 스타트에 취약하다. 또 코드 편집기에서 바로 작성이 불가능하고 애플리케이션 전체를 빌드해 S3를 통해 업로드 해야되는데 가벼운 람다의 특성과는 잘 맞지 않다고 느꼈다.
그럼에도 불구하고 숙련도가 낮은 파이썬이나 노드로 작성하는 것보다는 하나의 언어로 통일하는게 낫다고 생각했지만, 전자와 같은 이유로 레퍼런스조차 찾기 힘들어 구현하는데 수많은 문제를 만났고 이를 해결하는데 오랜 시간이 걸렸다.
모든 로직과 인프라 설정을 마치고 테스트를 돌리는데 Redis 쪽에서 문제가 터졌다.
Redis에 저장이 되는 것까지 CLI 로 확인했는데 문제는 읽어오는게 안됨 ..

migrateDB 로직은 다음과 같다. Redis의 데이터를 모두 읽어와 RDBMS를 비운 뒤 저장하는 간단한 로직이다.

getFollows 는 레디스에 저장된 key와 value를 읽어와 캐스팅해준 뒤 Follow 객체로 만들어 List로 반환하는 메소드다. 근데 여기서
List<Object> userIds = redisTemplate.opsForList().range(key, 0, -1);
데이터를 읽어오는 opsForList 메소드에서 자꾸 캐스팅 오류가 났다.
private final RedisTemplate<String, Object> redisTemplate;
분명 redisTemplate은 String 타입의 key와 Object 타입의 value로 저장하고 있는데, Object로 읽어오려 해도 읽어와지지가 않았다. 이 이슈가 터진게 새벽 5시쯤이라 너무 졸려서 제정신이 아니라 이성적으로 문제를 해결하기 너무 어려웠다. 따라서 follow api는 구현을 못한 채 제출하게 되었다. 🥲 해커톤은 끝났지만 좀 더 알아보고 수정한 뒤 스스로 완성본을 만들어볼 생각이다.
Lambda의 ColdStart는 Snapstart로 성능 개선의 여지가 있다. 시간이 없어서 적용을 못했는데 리팩토링 할 때 적용해볼 생각이다.
SQS 코드를 너무 간략하게 작성해서 아쉽다 !

사실상 로그와 전송 로직 밖에 없다. TimeOut이나 중복 필터링을 적용하지 못했다. DLQ (처리 실패 메시지 큐) 에 대한 로직도 작성하지 못했다. 이에 대한 코드를 추후 작성하여 더욱 안정성 있는 로직으로 개선하고 싶다.