전체 글
-
동시성 제어에 관하여개발 2024. 9. 10. 17:29
개요우아한 테크 캠프에서 팀 프로젝트를 진행하면서 주문 시스템을 최적화 하기 위해서 많은 고민을 했다. 그 중 재고의 정합성을 유지하면서 속도를 빠르게 하고자 하였는데, 기존 비관적 락을 사용하면 같은 메뉴에 대한 요청이 계속 대기하면서 성능 저하가 발생했습니다. 그래서 원자적 연산을 적용해 DB의 락을 제거하고 레디스로 재고 관리를 위임하면서 2-3배의 성능 개선을 이뤄냈다.이 과정에서 원자적 동시성 제어에 대해서 궁금증이 생겼고 더 공부해보고 싶다는 생각이 들어 한빛미디어의 '동시성 프로그래밍'을 읽었다.동기 처리동기 처리를 해야하는 이유는 여러 프로세스가 공유 자원을 동시에 접근하면서 발생하는 예상하지 못한 상황, 즉 경쟁 상태를 발생시키지 않고 경쟁 상태가 발생하는 코드 영역, 임계 영역을 보호하..
-
주문 시스템 성능 개선기개발 2024. 9. 3. 18:45
개요우아한 테크 캠프 팀 프로젝트로 배달의 민족(일반 커머스에 가까운) 서비스 중 메뉴를 담고 장바구니에 등록한 뒤 주문하는 기능을 만들었습니다.저희는 고도화 과정을 통해 성능을 개선하려고 했는데요, 저는 대규모 시스템에서 안정적이고 빠른 주문 시스템을 만드는 작업을 했습니다.접근 방식저희는 클라우드 자원으로 ec2 t3.small과 rds t3.micro를 지원받았습니다. 그렇기 때문에 한정된 자원에서 성능향상을 이루기 위해서 현재 가장 부하가 많은 곳을 개선하려고 노력했습니다.서버에서 가장 많은 병목이 발생하는 부분은 DB라고 생각했기 떄문에 DB 락을 중심으로 문제를 접근했습니다.우리가 시도한 방법들비관락처음으로 적용한 방식은 비관락입니다. 적용한이유는 가장 간단히 적용할 수 있었기 때문이었습니다...
-
CSV Driver SELECT 요청 개선기개발 2024. 8. 5. 00:28
★이 글은 강승훈 님의 의견을 반영해 수정되었습니다.★단어수 : 391개 읽는 시간: 2분미리 보기- CSV 파일로 DB를 구현했다. - 마지막에 있는 데이터를 찾으려면 모든 데이터를 탐색해야한다. - 탐색 시간을 최적화 해 1900배 감소시켰다.개요WAS 미션 마지막에 CSV 파일을 활용하여 DB 를 만드는 미션이 있었습니다. 당시에 구현할 시간이 별로 없어서 단순하게 파일의 끝에 새로운 데이터를 추가하고 모든 라인을 탐색하면서 파일을 찾도록 구현했습니다. 그러다가 데모하면서 마스터님이 1GB 파일이 있을 때는 어떻게 탐색할 거냐고 물어보셨습니다. 그때 저는 별로 생각을 안하고 있었는데 너무 느릴 거 같다고 생각이 들었습니다. 데이터가 많으면 얼마나 성능이 안좋을까?한 번 제가 구현한 코드로 1억개의..
-
내가 만든 was, Maven에 올렸지개발 2024. 7. 20. 19:52
개요우아한 테크 캠프를 진행하면서 was를 직접 개발하는 경험을 했습니다. 3주 동안 고생하며 만든 제 was에 정이 들었는지 실제 maven 서버에 등록하고 싶은 마음이 생겨서 바로 어떻게 올리고 싶었는데 몇 년 전과 비교해서 달라진 게 많고 생각보다 자료를 찾기 어려워서 이틀 동안 매달려서 겨우 성공했습니다...여러분들은 쉽고 빠르게 성공할 수 있도록 저의 과정을 자세히 설명해 드리겠습니다.올리기 전에 알고 가면 좋은 것Maven Central Repository 란?Maven Central Repository는 Java 개발자들이 가장 많이 사용하는 공개 아티팩트 저장소입니다. 이 저장소는 수많은 오픈 소스 Java 라이브러리, 프레임워크, 그리고 도구들을 호스팅 하고 있습니다. Sonatype이 ..
-
Java 프로그램 바이트 코드를 분석해보자개발 2024. 7. 10. 21:13
오늘 배운 JVM의 동작을 간단히 이해해 보고자 Java 프로그램을 간단히 작성해 바이트 코드를 분석해보았다.코드먼저 다음은 작성한 코드다.public class SimpleProgram { public static void main(String[] args) { int a = 5; int b = 3; int result = add(a, b); System.out.println("Result: " + result); } public static int add(int x, int y) { return x + y; }}바이트 코드다음은javac SimpleProgram.java | javap -c SimpleProgram을 ..
-
ServerSocket의 내부 동작 살펴보기: TCP 연결 설정의 로우레벨 이해개발 2024. 7. 8. 20:21
들어가며WAS 미션을 진행하며 생긴 ServerSocket의 동작 원리에 대한 궁금증을 해결하기 위해 내부 구조를 확인해보았습니다. 궁금증HTTP 요청을 처리하는 중 /index.html을 접속했을 때 멀티 스레딩을 구현하지 않아도 다수의 요청이 동시에 들어오는 것을 모두 처리하는 것에 의문이 들었습니다. SeverSocket을 생성하면 발생하는 일new ServerSocket(port)를 하면 먼저 해당 port에 서버소켓을 바인드 시스템 콜을 호출합니다. 그 다음 백로그에 크기만 큼 SYN와 accept 큐의 합계를 제한합니다. 클라이언트가 서버에 요청을 보내면 SYN 큐로 들어가고 3-way handshaking 가 완료되면 accept 큐에 들어가 서버의 accept를 기다립니다.accept() ..
-
Buffered I/O Steram vs I/O Stream: 커널 영역 접근과 성능 비교개발 2024. 7. 8. 19:58
들어가며저번 주 우아한테크캠프 미션을 진행하면서 WAS를 구현하고 있는데, 그룹 리뷰에서 I/O Stream 보다 Buffered I/O Stream 을 사용하는 게 더 좋다는 피드백을 받아서 Buffered I/O Stream과 일반 I/O Stream의 차이점이 궁금해졌습니다. Buffered I/O Steram vs I/O Stream여러분은 Java에서 파일을 읽고 쓸 때 어떤 방식을 사용하시나요? 저는 InputStream 은 BufferedInputStream 으로 OutputStream은 그냥 OutputStream으로 구현했습니다. 이유는 InputStream은 BufferedInputStream을 사용해서 받는 경우를 많이 봤지만 OutputStream은 잘 못봤기 때문이었습니다. 하지만..
-
[LiveStreamingOnWebRTC] 스트리밍 서비스를 WebRTC로 구현해보기개발 2024. 5. 2. 22:00
개요HLS를 사용하는 기존 스트리밍 서비스의 지연 시간(20s)을 해결하기 위해 WebRTC를 활용해 스트리밍 서비스를 구현해봄.구조P2P Live Streaming On WebRTC P2P 구조현재 시그널링 서버와 클라이언트로 구성되어 스트리머가 시청자 1개당 1개의 PeerConnection을 생성하는 구조로 구성되어있다. P2P 통신으로 구성되기 때문에 많은 시청자가 접속할 때 스트리머에서 큰 부하가 있다.SFU Live Streaming On WebRTC sfu 구조그래서 위와 같은 구조를 통해 스트리머는 한개의 미디어 스트림을 서버로 보내고 서버와 클라이언트가 PeerConnection을 맺는 방식으로 구성한다.그 결과 스트리머의 과도한 부하는 막을 수 있지만 서버의 부..