본문 바로가기

전체 글159

[SQS] 메세지 지연 시키기 (+ 15분을 넘어서) SQS 같은 경우 delay queues 라고하는 Consumer에게 메세지 노출을 지연시킬 수 있는 기능을 제공한다. 지연은 최대 15분까지 가능하다. (Visibility Timeout과는 다른 개념이기 때문에 명확하게 차이를 인지해야한다) 이 기능을 사용하면 메세지에 지연을 줄 수 있기 때문에 예약 실행 기능(정해진 시간 뒤에 특정 기능이 실행되어야하는 기능)을 개발할 때 사용될 수 있다. 예를 들어 '회원 가입 후 5분 뒤에 가입 축하 메세지를 보내기' 와 같은 기능이 있을 수 있는데, 회원 가입 도메인 이벤트에 대한 SQS 메세지 or 가입 축하 메세지 전송 SQS 메세지를 5분의 지연을 설정하고 enqueue 하면 5분 뒤에 메세지 핸들러에서 해당 메세지를 consume 하여 대상 유저에게 가.. 2023. 2. 4.
[SQS] Visibility Timeout Consumer가 Queue에서 메세지를 consume 하고 처리를 한 뒤, 해당 메세지를 acknowledge(delete)를 하기 전까지는 메세지는 Queue에 계속 남아있는다. 특정 Consumer가 메세지를 consume 하고 모든 처리가 끝날 때까지 다른 Consumer에서 동일 메세지를 consume하는 것을 막기위해서 SQS에서는 Visibility Timeout을 설정한다. 메세지가 consume 된 뒤에 다른 Consumer에게 다시 보여지기 위한 시간이라고 생각하면 될 것이다. (하지만 이는 메세지가 두 번 전달되는 것을 막기 위함은 아니다) 기본값은 30초이며, 0초~12시간 까지 설정 가능하다. 관련하여 메세지 수의 제한을 확인해야하는데, 제한을 확인하기 전에 짧게 메세지의 상태에 .. 2023. 2. 4.
방법론에 중독된 사회 요즘은 방법론들이 정말 많다. OKR, 애자일, TDD, DDD 같은 프로젝트, 제품 개발 방법론 뿐만 아니라 1일 1커밋, 미라클 모닝 과 같이 생활 속의 방법론들도 말이다. 그리고 그걸 따라하는 사람들도 많다. 대부분 "누가해서" 혹은 결과만을 보고 "이렇게하니까 저렇게 성공하더라"라는 이유로 많이들 따라하였지만, "어떤 사람이나 조직이 왜 그것을 하는지", "그것에서 나는 무엇을 적용할 수 있고 어떤 것을 취해야할지"는 빠져있는 경우가 많았다. 그리고 간혹 어떤 방법론을 따르면서 마치 정해진 답이 있는 것처럼 그 방법론을 자체를 연구하는 경우도 종종 있었다. 그 방법론이 잘 동작하지 않으면 "혹시 내가 방법론을 제대로 이해한게 아닌건가?" 하는 의심도 하면서 말이다. 클린 시리즈로 잘 알려져있는 R.. 2023. 1. 28.
[Spring Data JPA] @OneToMany Entity 연관 관계에 대하여 JPA는 RDBMS의 table 연관 관계를 Java object로 표현되는 DB model로 표현하기 위해 @OneToMany, @ManyToOne, @Embedded 와 같이 entity 간의 연관 관계를 설정하는 여러 기능을 제공한다. 이는 JPA를 사용하면서 POJO로 이뤄진 Entity와 DB model인 JPA Entity를 굳이 분리하지 않아도 표현력 있는 Entity 코드를 작성할 수 있게 해준다. 이번 포스팅에서는 JPA를 사용했을 때 상위 객체가 하위 객체를 포함하고 있음을 표현하기 위해 @OneToMany로 일대다 관계를 만드는 방식에 대한 얘기를 해보겠다. 여기서는 다대일 관계(many-to-one)에 대해서는 다루지 않겠다. 다대일 관계는 query 효율을 위해 사용할 수 있지만,.. 2023. 1. 20.
reified를 통해 generic type 정보 가져오기 generic을 사용하여 코드를 작성할 때, generic type의 정보를 사용하고 싶은 경우가 있을 것이다. 아래 코드는 generic을 사용하여 파라미터의 타입을 확인하는 함수이다. fun isInstanceOf(obj: Any): Boolean { println("check object(${obj::class}) is instance of ${T::class}") return obj is T } 하지만 generic은 compile 후 제거되기 때문에 위 코드와 같이 generic type을 직접적으로 사용하는 코드는 compile error를 낸다. 그래서 주로 아래와 같이 추가로 generic type과 같은 Class 타입의 파라미터를 받는 식으로 우회한다. fun isInstanceOf(o.. 2023. 1. 16.
Kafka Partition key를 사용하여 데이터 순서대로 처리하기 Kafka에서 하나의 Topic은 여러 Partition으로 파티셔닝 될 수 있다. 하나의 Partition은 동일한 Consumer Group 내에서 하나의 Consumer에 의해 처리되기 때문에, Partition의 개수를 늘려 Consumer Group에 대해 하나의 Topic에 대한 처리량을 늘릴 수 있다. (참고: Can multiple Kafka consumers read the same message from a partition?) (* 하지만 Partition을 무조건 늘리는건 좋지 않다 - 참고: How to Choose the Number of Topics/Partitions in a Kafka Cluster?) Topic의 어느 Partition에 적재될지는 publish 할 때 p.. 2023. 1. 12.