먼저 지식이 부족한 감자대가리라 도게자 박고 들어가겠습니다.. 


"이새끼 지식 ㅈ도 모르고 이딴 질문하는거 개패고싶지만 한번 참고 알려준다 ㅋㅋ " 라는 마인드로 말해주시면 감사하겠습니다.. 모든 훈수에 대해 공부 후 흡수하겠습니다..(패드립만 ㄴㄴ)



현재 수강신청 웹사이트를 운영중인데, 제가 생각한 가장 중요한 요구사항이 실시간 + 원자성을 보장해야된다. 입니다.


처음에 설계했을 때의 계획은 이렇습니다.


1. 현재 단일 웹서버를 사용중이고, 추후 웹서버를 추가로 스케일 아웃 할 계획이 있다.(아주 먼 미래긴함..)
2. 수강신청의 로직은 RDB를 사용하지 않고 오직 Redis만 사용한다.


리팩토링 전에 사용했던 방식은 지식도 없이 그냥 기술블로그보고 set + transaction 사용해서 수강신청 로직을 사용했는데, 탑다운 방식으로 공부하니깐 어플리케이션 코드(if 조건문)으로 인해 원자성 보장이 안되더라구요. (부하테스트 해봤는데 동시성 이슈는 안터져서 냅두는 중입니다. 이거 진짜 개발자 자격 박탈, 반성하고 리팩토링 하려고 하고있습니다..)

 

이로 인해 제가 생각했을 때의 동시성 관련된 기술들을 나름의 방구석 분석을 통해 생각해보았습니다.


1. synchronized 사용

- synchronized 키워드를 사용하여 특정 코드 블록 한 번에 하나의 스레드만 접근 시키기

- 만약 서버 증설할 경우 원자성 보장이 안됨. 


2. ression 분산락

- 추후 서버를 확장할 경우 분산제어를 위해 사용

- 하지만 추후 서버 증설은 너무 먼 미래고, 원자성은 보장되지만 최소 4RTT(lock - scard - sadd - unlock)를 사용한다.


3. lua 스크립트

- 1 RTT로 원자성 보장

- 현재 수강신청 로직에 DB는 사용하지 않아 가장 괜찮아보임

위 3개의 기술을 생각했을 때, 3번을 사용하는 것이 가장 괜찮아 보이는데,, 아무리 기술블로그를 뒤져봐도 시니어 개발자들은 루아스크립트는 잘 사용하지 않더라구요. 이거는 제 구글링 부족으로 인한 근거없는 판단입니다..


아마도 제 뇌피셜로는 실무에서 중요하게 생각하는 유지비용 및 가독성(기술 친화적)으로 인해 트레이드 오프를 포기한 전략이지 않을까 싶긴합니다..


말이 길어졌네요.. 


그래서 제가 궁금한 질문은 이렇습니다.


1. 실무에서는 위와 같은 요구사항이 생겼을 때, 어떤 기술을 사용하는지?

2. 서버 증설의 계획이 있지만, 너무 먼 미래일 경우에는 현재 요구사항에 맞는 기술 선택 후 코드 리팩토링을 하는지? 아니면 그냥 증설 계획에 맞게 기술을 선택하는지,

선생님들의 깊은 훈수 기다리겠습니다..