log 2021-11-17
project
epis
간단하게나마 두 개 이상의 데이터가 연동된 서비스를 구성하려 하는데, db를 어떻게 할 지 고민이다. 예를 들어, 유저 서비스가 있고, 투두 서비스가 있다면, 외래키 참조 관계가 생기게 된다.
관련하여 검색하니, 서비스별 api를 이용해서 정보를 노출하고, 데이터베이스 및 트랜잭션은 완전히 따로 관리하는 database-per-service 패턴을 사용하라고 한다.
https://microservices.io/patterns/data/database-per-service.html
또한 zero-payload에 대한 글도 있다.
즉, 데이터 변경시 변경된 엔티티의 id에 대한 정보만 pub/sub로 전파하고, sub측에서는 필요할 때 api로 호출해서 자기들에게 필요한 최신 정보들을 가져오는 식으로 하는 것이다. 그렇게 하여 다른 서비스의 최신 정보를 기반으로 자기 데이터의 변경을 체크하고, 변경이 있다면 또 전파하는 방식일 것이다. 이런 방식으로 하면 생각해보니 멱등성도 가지게 된다.
현재 counter 서비스는 tally_count라는 이벤트를 제공하는데, 이는 카운트 값을 +1 더하는 이벤트이고, 잘못하여 두 번 호출되거나 하면 결과또한 잘못되게 된다. 이렇게 하지 않고, 멱등성을 가지게 설계하려면 어떻게 해야 할까? 먼저 현재 값을 서비스로부터 읽은 다음, +1한 값으로 set하라는 메시지로 보낸다면? 더 증가하는 일은 없겠지만, +1 set 되기 전에 다른 호출이 일어나면 덜 증가할 수 있을 것 같다. 그런데 이 서비스는, 결국 외부 입력으로부터 받아서 누적되어야 하므로 멱등성을 가지게 하기는 어려울 듯하다.
msa로 모든 실행 시점에 서비스가 죽어도 안전하도록 설계하는게 가능한가??
https://happycloud-lee.tistory.com/154
일단 nest 기본 tcp로 한 번에 여러 번 호출하면 어떻게 되나 테스트해봤는데, send로 한 결과 한 번만 호출된다.
wait를 아예 없애보니 10개 이상이면 아래와 같이 nest에서 사용하는 이벤트 리스너 수를 초과했다는 경고가 뜬다.
그리고, 이렇게 호출하면 개수가 제대로 늘지도 않는다.
수신자 서비스측의 로그는 호출이 되는데, 그 서비스에서 제대로 카운트가 누적되지 않는 듯하다.
확인 결과, 내부 서비스 코드가 한 번에 호출되면서 발생한 것이었다. 이를 해결하려면 내부에서 큐를 사용하거나 해야 할 듯하다. 어쨌든 당장 필요하지는 않을 듯하다.
https://docs.nestjs.com/techniques/queues
일단 메시지 큐는 사용하지 않고 유저 및 투두 서비스를 어떻게 구현할 지 생각해보자. 생각할 점
-
메시지 구조
-
엔티티 구조
-
어떻게 연계
-
트랜잭션
-
cqrs
-
event sourcing
-
등..
-
요구사항:
- 유저 서비스
- pk 유저 아이디
- 유저 CRUD
- (추후) 로그인 기능 필요
- /api/user/create
- 필요 속성
- 생성일,수정일,유저명,(소유투두?)
- 투두 서비스
- fk 유저 아이디
- pk 투두 아이디
- 투두 CRUD
- /api/todo/create
- 투두 생성시 해당 유저 확인 어떻게?
- 로그인 부터 구현해야 하나?
- 유저명으로 투두 검색?
- 유저 삭제시 관련 투두 전부 삭제
- (추후 고려사항) 프론트엔드 추가할 경우: 유저명 업데이트시 투두에도 반영되어야한다.
- 필요 표시사항:
- 생성일,마감일,수정일,(생성 유저),타이틀,내용,완료여부,완료시각,카테고리,태그,…
- 유저 서비스
nosql기반으로 할까 싶기도 하다. 일단은 기본적인 것 부터 구현하자.
Comments