본문 바로가기

전체 글26

TCP, HTTP/HTTPS keep-alive Persistent Connection 클라이언트에서 서버로 데이터를 전송하기 위해 TCP 요청은 client와 서버간 3-way handshake 과정을 통해서 연결을 맺고 데이터를 전송하고 전송이 완료되었으면 4-way handshake 과정을 통해서 해당 연결을 종료한다. 커넥션을 맺기 위해서는 클라이언트와 서버 관점에서 보면 다음과 같은 작업으로 진행된다. 클라이언트 운영체제로부터 소켓 할당 (사용 할 포트, 파일 디스크립터 등등) 요청 보낼 곳 DNS Query (캐시에 존재하면 캐시를 조회) 소켓 생성 3-way handshake 시작 요청 전송 다 보낸 이후 4-way handshake 시작 커넥션 종료 서버 운영체제로부터 소켓 할당(사용 포트, 파일 디스크립터 등등) 소켓 생성 클라이언트 .. 2024. 2. 5.
Gradle Java plugin API and Implementation 멀티모듈을 사용하다보면 종종 build.gradle에서 의존성을 추가할 때 API, Implementation을 확인 할 수 있고 여러 자료들을 찾아보다보면 헷갈려서 둘의 차이를 공식 문서를 보고 정리했다. 우선 헷갈리지 않게 둘의 의존성 관리 주체는 gradle이다. 즉, gradle에서 제공하는 의존성 관리 기능을 사용하는데 API, Implementation이 있고 이 차이를 확인하는 것이다. API This is where you declare dependencies which are transitively exported to consumers, for compile time and runtime. api는 사용하는 측에 컴파일 시점과 런타임 시점에 전이 된다고 한다. 예를 들어서 A 라는 모듈.. 2024. 1. 31.
SSD Sequantial Read/Write HDD와 SSD를 비교하는 글들을 보면 HDD는 구조상 헤드가 데이터를 읽거나 쓰는 위치로 이동하는 탐색시간 (Seek Time) 때문에 임의의 위치에 있는 데이터를 접근하려면 (Random Access) 시간이 오래 걸리며 SSD는 기계의 움직임이 없어서 더 빠르다고 한다. 여기서 처음 들었던 의문은 SSD는 기계의 움직임이 없으므로 Random Access나 Sequantial Access나 비슷한 시간이 걸리지 않을까? 라는 점이다. 하지만 SSD 제품들의 성능 지표를 보면 순차 접근과 랜덤 접근으로 나뉘어있다. 읽기나 쓰기나 차이가 비슷하기 때문에 순차 읽기만 보면 우선 단위가 달라서 순차 읽기와 랜덤 읽기를 맞춰주기 위해 IOPS를 MB/S 단위로 변환해준다. IOPS로 나타내는 I/O 단위는 .. 2024. 1. 30.
Latency 계층 구조로 본 서비스의 Primary DB 선택 ByteByteGo에서 Latency 계층을 보던 중 흥미로운 점이 보인다. 레디스에서 물리 메모리에 저장 되어있는 데이터를 접근해서 사용할 메모리로 가져오는 것이 네트워크를 통해 데이터를 전송하는 것 보다 100배가 빠르다는 것이다. 1000 바이트의 데이터를 네트워크를 통해 데이터 전달은 100 마이크로초가 걸린다고 한다. 그럼 운영하는 서비스는 결국 레디스는 외부에서 사용하게 되니까 병목 지점은 네트워크에서 데이터 전달하는 것이 되며, 이 말은 네트워크 속도를 기준으로 데이터를 가져오는 latency를 측정하면 된다는 것이다. 보통의 서비스에 경우 MSA를 채택했을 때 중간의 한 API 서버가 응답해야 하는 latency는 P99 기준 우리 서비스는 200ms정도를 만족해야 한다. 이 말은 Redi.. 2024. 1. 28.