perpet

몇일전 다른프로젝트 서버 파트에서 서로다른 디비끼리 트랜잭션을 걸면 부하가 심하다고 하여 게임서버가 이것을 직접 구현하기를 원한다는 요청이 들어왔다.
나도 최근까지 이 이슈를 직접 접하지 않았기 때문에 고민하지 않다가 언젠가는 나도 이문제를 해결해야할 솔루션을 찾아야해서 고민을 해봤다.

예를 들어 문제를 풀어보겠다.
유저끼리 아이템거래를 하려고 하고 a 유저가 b 유저에게 아이템을 주라는 명령어를 내렸다고 치자
이때 a 디비 테이블에  item 이    b 디비 테이블에 이동이 되야한다고 하고
 a디비와 b디비 는 서로 다른 회사라 디비안에서 스토어드 프로시저로 트랜잭션을 걸어 이동을 못시키고 프로그램으로
아이템을 옮겨야한다고 하자 억지스러워보이지만 하여간 중요한간 트랜잭션을 게임서버가 해결해줘야하는 이슈가 생긴다는 과정을 하는것이다.
이동중 서버가 다운이 되거나 오류가 있으면 롤백이 되거나 재부팅시 완료가 제대로 이뤄져야한다고 하자.

내가 생각한 방법은
1. a디비테이블에 아이템을 같은 디비에 sendTemp 테이블을 만들어 그곳에 이동시킨다.(트랜잭션이동)
2. b디비테이블에 receiveTemp테이블을 만들어서 아이템이 어느테이블에 들어갈지에대한 정보를 넣는다.
3. sendTemp 테이블에 이동할 그아이템을 지운다
4. b디비테이블에 receiveTemp 테이블을 해당유저테이블에 이동시킨다.(트랜잭션이동)

이과정을 거치면 중간에 다운이 되여도 다시 복구나 재실행이 가능하다고 본다.
게임서버가 다운이 되고 재실행되면 밑에 가,나 작업을 수행한다.

가.  a디비테이블에  sendTemp 에 이동할 아이템이 있는지 보고 있으면 위에 2번과정을 진행한다. receiveTemp에 이미 이동할 아이템정보가 있다해도 덮어버린후
      진행한다. (이경우는 위에서 1,2번이 작동한후 서버가 다운됬을때 끝나지 않은 작업을 마무리해줌)
나. b디비테이블에 receiveTemp 테이블에 이동해올 아이템정보가 있는지 본다. 있으면 위 4번과정을 진행한다. ( 이경우는 서버가 위에서 3번 과정을 거친후 다운되 였을때 작업을 마무리해줌)