🔸 Node.js
현재 개인 과제에 대한 ERD이다. 이중 Post를 보게되면 likewho 라는 필드가 존재한다. 이 필드는 배열 형태의 텍스트를 저장해두는 필드로 지정을 해둔 상태인데, 팀 과제 발표 당시 튜터님의 질문에 대한 답을 적어보려 한다.
❗️ 좋아요를 누르려는 사람이 동시다발적으로 발생할 경우 어떻게 해결을 할것인가?
👉 DB에서 ' 공유락 ' 과 ' 배타락 ' 에 대해서 먼저 알아야할 필요가 있다.
공유락은 SELECT 구문에서 ' FOR SHARE ' 을 붙임으로서 사용할 수 있다. 데이터에 한해 LOCK을 걸어주지만 읽는것에 한해서는 가능하게끔 해주는 것이다.
배타락은 ' FOR UPDATE ' 를 붙이는데, 이것의 경우 테이블 전체가 LOCK이 걸리기 때문에 특정 사용자가 배타락을 걸 경우 다른 사용자는 그 테이블에 한해서 어떠한 작업도 진행할 수가 없는 상태가 이루어지게 된다.
✨ 데드락
데드락의 발생은 A 와 B 유저가 있고, A유저는 먼저 1번 구문으로 Post 테이블을 배타락을 걸어 작업을 걸고 Comment 테이블에 작업을 진행하려 했고 반대로 B 유저는 Comment 테이블에 배타락을 걸고 Post 테이블에 작업을 시도하려 했다 생각을 해보자.
상황을 정리해서 이해를 해보자
1. A 유저는 Post를 점유한채 Comment에 접근하려 했으나 B 유저가 점유중
2. B 유저도 마찬가지로 Comment를 점유한채 Post에 접근 시도 했으나 A 유저가 점유중
최종적으론 A,B 유저 둘다 서로의 테이블이 점유가 끝나기만을 기다리는 상태, 이것을 데드락 이라고 한다.
🔥 해결 방안
- 나의 생각
앞서 말했다시피 likewho 라는 필드는 배열 형태의 문자열로 저장했다 했다. 동시 다발적인 처리를 위해서는 서버 내에 또 다른 하나의 저장 객체, 배열을 만들어 두어서 관리를 해야겠다 생각을 했다. 그 이유로는 DB는 설정을 건드리기 전엔 한번에 하나의 처리를 하게끔 되는데 그러기 위해선 배열에 요청들을 저장을 해두고 0번 인덱스부터 차례대로 빼내어와 업데이트를 진행해주는 식으로 하면 어떨까? 라는 생각을 하게 되었지만 최종적으로 내가 생각한 부분은 ' 사람들은 자신의 데이터가 즉각적으로 반응되서 보여지길 원할텐데, 순번이 뒤에 있어서 처리가 늦어지게 된다면 노출이 늦어지지 않을까? ' 였다.
-튜터님의 해결방안
먼저 튜터님의 제시책으로는 '메세지 큐' 였다. First In, First Out 의 형태를 띄고 있는 큐는 순서대로 들어온 요청에 대해 처리하기 적합한 자료구조 형태를 띄고 있기에 이 형태를 추천해주셨고, 나중에 내가 걱정되었던 부분에 대한 해결책으로는 ' 눈속임 ' 을 설명해주셨다.
💥 눈속임 이란?
유저 ( 클라이언트 ) 는 서버 내에서 어떻게 처리가 이루어지는지 관심이 없다. 그저 나의 요청이 제대로 이루어 졌는지 에대한 부분만 관심이 있을뿐, 그렇다면 서버는 요청에 대한 응답만을 전달 해주고 서버 내에선 요청에 대한 처리를 순서대로 처리해주는 방식으로 한다면?
'좋아요' 를 동시다발적으로 1000명이 눌러서 요청이 밀려있는 상태라 가정을 해보자. 하나의 테이블에 동시다발적으로 접근할경우 락이 걸리기 때문에 메시지 큐를 활용하여 순차적 처리를 해주게 되면 내가 누른 좋아요가 제대로 된건지 아닌지를 확인할 방법이 없다.
현재 좋아요 수가 100이라 가정을 해보자.
실제로는 내가 좋아요를 누른 순간 수많은 인터넷 공간에서 동시에 좋아요를 누른 사람이 10명이 더 존재해 보여줘야 할 데이터 값은 111이 되어야 할테지만 유저 입장에서 고려를 해보면, 내가 누른 좋아요가 정상적으로 이루어 졌는지에 대한 여부만 보여주면 되기 때문에 101로 보여도 상관이 없다. 서버 로직 내에서는 순차적 처리가 이루어져 있는 상태이지만, 응답으로 ' 너의 좋아요 처리가 잘 되었어~' 를 먼저 해줌으로써 유저는 다른쪽으로 눈을 돌리게끔 하는것이다.
'회고 > TIL' 카테고리의 다른 글
Sequelize - Scope (0) | 2023.08.02 |
---|---|
Typescript - Generic (0) | 2023.07.28 |
2023 - 07 - 04 TIL (0) | 2023.07.04 |
2023-06-20 TIL (0) | 2023.06.20 |
2023-06-19 TIL (0) | 2023.06.20 |