본문 바로가기

개발/대규모 시스템 설계4

[대규모 시스템 설계] 동시성 처리 동시성 처리, 왜 중요할까? 동시성 처리는 대규모 시스템 설계에서 중요한 부분이다. 왜냐하면 대규모 시스템에서는 엄청나게 많은 사용자가 동시에 접근할 것이고, 그러면 여러 스레드가 동시에 한 값에 접근하는 상황이 많이 발생할 것이다. 예시로, 외국민 프로젝트에서 게시글의 조회수/추천수를 증가시키는 기능이 있다고 해보자. 이 부분은 단지 “DB로 부터 값 읽기 → 값 증가” 이 과정이다보니 Race Condition이 발생할 가능성이 매우 크다. 100명이 추천을 동시에 눌렀는데, 실제 값은 82명 정도로 100명에 못미치는 값이 될 가능성이 매우 높다.  혹시 해당 현상이 발생하는 이유는 잘 모르겠다면, 아래 운영체제 동시성에 관련된 개념을 한번 읽어보길 바란다. [OS/OSTEP] 26.threads-.. 2024. 7. 4.
[대규모 시스템 설계] GRPC를 통한 서비스간 통신 서비스간 통신 어떻게 진행할까?일반적으로 우리가 MSA 구조에서, 서비스와 서비스간 통신한다라고 한다면 직관적으로 떠오르는 것은 Endpoint를 생성해서 REST를 이용해서 통신하는 것이다. 하지만, REST의 큰 단점이 존재한다. REST는 HTTP/1.1 프로토콜을 사용하기 때문에, 단일 request에 대해서 단일 response만 제공해준다. 즉, 여러번의 request를 보내서 서버에 처리를 요청해야 된다. 그러면, 불필요한 네트워크 비용이 발생하며, 성능도 저하가 된다. 요즘같이 MSA가 업계 표준이 되가는 상황에서, 서비스간 통신이 진행될 일이 굉장히 많을텐데, 이 점은 굉장히 치명적일 것이다. 그래서 해결하기 위해 등장한 기술이 Socket, RPC와 같은 기술이다. 여기서, 구글이 기존.. 2024. 5. 22.
[대규모 시스템 설계] 캐시 설계 전략 캐싱 설계 전략 왜 필요한가?캐싱은 서비스의 응답시간을 대폭 줄일 수 있는 아주 좋은 기술이다. 우리가 특정 사이트로부터 공지사항을 크롤링 해오고, 이를 목록으로 보여주는 기능을 구상했다고 해보자. 그리고 이 공지사항은 24시간에 한번만 크롤링을 해와 자주 바뀌지 않는 정보라고 가정해보자. 그런데 자주 바뀌지도 않는데 매번 RDB에서 정보를 읽어오면 어떨까? 가뜩이나 리스트 형태여서 많은 정보를 읽어와야하는데, 자주 바뀌지도 않는데도 매요청마다 읽어오면 매우 비효율적이고 성능에 치명적일 것이다. 따라서, 자주 바뀌지 않는 정보는 메모리에 캐싱을 해두면 빠르게 사용자의 요청에 응답할 수 있게 된다. 얼마나 빨리지는지 결론이 궁금한 사람들이 있을 것 같에서, 실제 우리 프로젝트에서 적용한 캐싱 결과를 공개하.. 2024. 5. 20.
[대규모 시스템 설계] MSA의 필요성과 고려할 포인트들 예전부터 내가 제일 관심이 많았던 분야가 MSA, 대규모 트래픽 처리, 고가용성 아키텍처, 동시성 처리이다. 즉, 종합적으로 말하자면 "대규모 시스템 설계"에 대해서 많은 관심을 가지고 있었다. 하지만, 내가 여러개 프로젝트를 진행했음에도 불구하고 제일 많이 사용자를 유치한 것은 30여명의 사용자를 유치했던 "외국민" 프로젝트이다. 아마 프로젝트를 진행해본 사람들은 잘 알 것이다. 실사용자 100여명을 채우는 것은 굉장히 힘든 일이다. 즉, 내가 관심 있는 분야인 MSA, 대규모 트래픽 처리 등등은 경험하기 힘들고 오히려 MSA로 설계하면 오버엔지니어링인 경우가 많다. 그래서 솔직히 실제 우리 프로젝트에 적용하기에는 오버엔지니어링이고, 유지보수 시간과 비용이 너무 많이 들어서 개인적으로 대규모 시스템 설.. 2024. 5. 19.