✅ 개요목적Jetty의 VirtualThreadPool에서 성능 이슈가 있을지 확인.내부에서 Semaphore를 사용 중인데, 자원 획득을 기다리는 스레드들이 모두 busy waiting인지 점검.공정성 정책인 경우만 고려함.Jetty의 VirtualThreadPool.execute의 기본적인 동작 과정Jetty의 VirtualThreadPool에 task를 제출합니다.가상스레드가 실행 된 후 제출된 task를 실행하기 전에 Semaphore 획득을 시도합니다.Semaphore 획득에 성공하면 task를 실행합니다.task 실행을 마치거나 task 실행 중 예외가 발생한 경우에 Semaphore 자원을 반환합니다.https://github.com/jetty/jetty.project/blob/jetty-1..
의지 보단 습관을 믿어야 한다. 의식보단 무의식에 의지 해야 한다. 그래야 일상을 단순하고 고요하게 운영하여 정말 중요한 일에 집중할 수 있다. 습관을 만들려면, 환경을 재배열 해야 한다. 환경(상황)으로 부터 신호가 나오고 우린 이를 선택적으로 인지한다(ex. 핸드폰에서 울리는 알림). 마찰력에 의해 우리의 행동은 한 방향으로 가속을 받게 되고(ex. 핸드폰과의 거리가 가까우면 핸드폰과의 거리 마찰력이 작은 것. 마찰력이 작다면 핸드폰을 만지는 방향으로 우린 가속을 받는다. 퇴근 길에 붕어빵 집이 있다면 붕어빵과의 거리 마찰력이 작은 것과 같다), 그 결과 보상을 얻는다(ex. 알림을 확인 후 가치 있는 정보를 획득. 혹은 맛있는 팥붕 획득). 신호에 대한 반응이 보상으로 연결되면 뇌는 이를 학습한다...
자바 NIO는 세가지 주요 클래스를 사용합니다.간단하게 알아보고 채팅 서버와 클라이언트 애플리케이션을 만들어보죠. 1. Buffer, channelBuffer특정 원시(primitive) 타입 데이터의 컨테이너입니다. 원시 타입의 데이터들을 많이 담을 수 있는 통이라고 생각하면 편합니다. 한 곳에서 다른 장소로 데이터를 보내기 위해 사용되는 일시적인 공간이며, 채널을 위한 읽거나 기록된 정보를 보유합니다. Buffer에 대해 자세히 알려면 capacity, limit, postion에 대해 알고 있어야 합니다.capacity : 버퍼의 크기. 버퍼의 크기 만큼 데이터 요소를 담을 수 있다.position : 다음 읽거나 써야할 인덱스 위치. 그림1에 의하면 min까지는 데이터를 읽었으니 position은..
인삿말 안녕하세요! 김민석입니다! 본 회고 글에서는 를 풀어 나갈겁니다. 문제 정의, 원인 분석, 해결 전략 등을 세세하게 적어보려해요:) 그럼 바로 시작하겠습니다! 타임라인(2023) 1월 ~ 2월: 카카오뱅크 인턴 수료 3월 ~ 4월: 인턴 때 진행한 과제 고도화(Link) 계좌 및 이체 시스템 기술 문서 URL | Built with Notion 2023.03 ~ 2023.04 excellent-snowshoe-c4c.notion.site 5월 ~ 8월: 취업 준비(Resume) 김민석 (Kim MinSuk) Resume | Built with Notion 💁♂️ Software engineer(Back-end) excellent-snowshoe-c4c.notion.site 9월 ~ 12월: 채널..
테스트란? TDD 관점에서 테스트는 요구사항에 대한 명세. 주어진 상황에서 객체(혹은 서버)에게 요청을 보냈을 때 기대하는 결과 혹은 과정에 대한 명세. 기대하는 결과를 명세: 특정 Input에 특정 Output 약속 ex) 평균값 메소드는 (1,2,5) → (3)를 테스트 기대하는 행동 명세: A메소드 호출은 B,C,D를 2번씩 호출하는 것을 약속 💡 테스트는 요구사항을 구현한 동작에 대한 검증 아닌가? 테스트를 작성하는 동기의 차이라고 생각합니다. 구현한 코드가 원하는 대로 동작하고 다른 코드의 변화에 의해 테스트가 작성된 코드가 영향을 받지 않는 것에 테스트의 목적을 둔다면, 테스트는 요구사항을 구현한 동작에 대한 검증으로 바라볼 수 있습니다. 반면, 요구사항을 구현하기 전, 사용자가 서비스에게 바..
📌 문제 상황 1. 즉각 요청-응답 프로세스는 외부 서비스와의 connection을 유지한 채 비관 lock을 잡기에, lock으로 인한 다양한 이슈가 외부 서비스로 전파될 위험 존재(ex. deadlock 발생시 connection도 대기) 2. 즉각 요청-응답 프로세스는 타행 이체(은행A→은행B 이체)를 2개의 API(이체 입금 요청 API, 이체 입금 완료 응답 API)로 구현하자는 은행 간 약속(프로토콜)을 무시하는 방법임. 📌 접근 방법과 해결과정 원인 분석 - 그림2 즉, 이체 입금 요청을 비동기로 처리하는 구조의 문제점 재파악. - 입금을 위해 비관 lock을 잡고 Network I/O를 하는 것이 가장 큰 문제라고 파악. - 특히 타행(이체 입금 역할)은 당행(이체 출금 역할)의 이체 내역..
목차 1. 간단 요약 2. 사전 지식 3. 문제 상황 4. 접근 방법과 해결 과정 Gap lock 분석 현 설계의 문제점 로컬 테스트로 검증 개선 방향 성능 테스트 5. 결과 6. 배운점 ✍️ 간단 요약 OutBox 데이터를 polling 하는 스케줄러가 읽기 연산을 할 경우, connection은 (마지막 레코드, 무한대) 범위에 gap lock을 겁니다(MySQL ver 8.0 innodb, Repeatable-read 기준). 그로 인해 이체 출금의 insert 쿼리가 병목이 되어 TPS가 낮게 나왔었습니다. Read Committed로 변경한 결과, gap lock의 해제를 기다리지 않고 insert할 수 있게 됐습니다. 이는 Mean Test Time 감소로 이어져 tps를 86%(66.6 → ..
목차 1. [문제 상황] 비동기가 너무 느린 현상 2. [원인 분석] 동기로 작동하는 경우(케이스) 존재 3. 이체 입금 요청 API 처리 방법별 장단점 4. API 로직 선정 및 테스트 5. 고민해봐야할 것 ✍️ 사전 지식 용어 당행 : 사용자로부터 이체 요청을 받고, 이체 입금을 진행하는 은행 타행 : 이체 과정에서 출금을 진행하는 은행 당행 이체 : 입금 은행과 출금 은행이 동일한 이체 타행 이체 : 입금 은행과 출금 은행이 다른 이체 OutBox 데이터 : 이벤트나 메시지를 DB에 있는 아웃박스에 저장해서 DB 트랜잭션의 일부로 발행하는 패턴을 Transactinal OutBOx라고 합니다. 서로 다른 서버의 트랜잭션을 관리하고 할 때, eventual consistency를 보장하기 위해 DB ..
목차 1. [문제 상황] 동기 보다 비동기가 느린 현상 2. [원인 분석] 로컬에서만 일어나는 NIO 3. [해결] 당행과 타행으로 테스트 서버 분리 4. 고민해봐야할 것 ✍️ 사전 지식 용어 당행 : 사용자로부터 이체 요청을 받고, 이체 입금을 진행하는 은행 타행 : 이체 과정에서 출금을 진행하는 은행 당행 이체 : 입금 은행과 출금 은행이 동일한 이체 타행 이체 : 입금 은행과 출금 은행이 다른 이체 OutBox 데이터 : 이벤트나 메시지를 DB에 있는 아웃박스에 저장해서 DB 트랜잭션의 일부로 발행하는 패턴을 Transactinal OutBOx라고 합니다. 서로 다른 서버의 트랜잭션을 관리하고 할 때, eventual consistency를 보장하기 위해 DB 테이블을 메세지 큐로 사용하는 방식을 ..