tech 27

좋은 서비스 운영환경을 만들기 위해서

현재 회사에 구축해 놓은 시스템들에 많은것들이 부족하다고 느낀다. 젠킨스에서 워커노드나 마스터노드간에 동일한 환경을 유지하는것이 잘 안되고 있다. k8s나 도커를 사용해 job실행시 이미지 기반으로 동일한 실행환경을 보장하는 것이 필요하고, 리소스를 동적으로 늘리는것에 대한 안정성에 대한 보장이 필요하다.트래픽이 안정적으로 인입되어 정상적으로 처리되지 않는 경우에 대한 알람, 자동복구 등에 대한 처리가 부족하다. 현재 트래픽이 서버에 도착한 이후에 Exception 이 발생했을때에 대한 알람은 sentry 로 존재하나, 트래픽이 서버에 제대로 도착하지 못 하는 모든 경우(서버가 죽어서) 는 서버의 헬스체크실패 알람 하나에 의존하고 있다.게임회사는 데이터가 생명이고 자주 변경/추가 가 이루어지는데, 이 처..

tech/생각 2024.03.01

[k8s] 무중단 배포를 위한 설정들

deployment 를 통한 배포시 타이밍적으로 "API 요청을 받을 수 없는 상태의 pod에 API 요청이 가는" 상황이 일시적으로 발생하는것으로 확인되었다. 원인은 "서비스에서 pod를 제외한 후 pod를 terminating 시키는 것이 아니라, pod를 죽인 후 service에서 제외시키는" 것 때문이다. 이 문제를 k8s의 의도한 바를 토대로 해결하기 위해서는, 어플리케이션에서 graceful shutdown 구현이 필요하다. 사실 정확하게는 graceful shutdown 을 구현한다해도 무조건적으로 service가 어플리케이션 트래픽을 끊는 시간보다 늦게 종료처리될것이라는 보장을 어떻게 하는지에 대해선 정확한 이해를 하지 못했다. 쉽게 해결하는 방법은 pod 를 terminating 시키는 ..

tech/k8s 2024.01.02

websocket 내부 동작 정리 & signalr

websocket 연결 과정 1. websocket handshake TCP 소켓 리스닝을하며, HTTP 프로토콜의 GET request 에 응답한다 클라이언트는 websocket handshake process를 거친다. HTTP request가 시작이며 아래와 같은 HTTP header 를 보낸다 GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 이과정에서 어떤 header라도 부정확한 값을 갖거나 서버가 해석하지 못하는경우 서버는 400(bad request)를 응답하게 된다. we..

tech/network 2023.10.26

apache lucene 내부구조

개요 아파치 루신은 open-source, high-performance, scalable DB 엔진이다. elasticsearch, solr등의 오픈소스 프로젝트들이 루신을 엔진으로 사용하고있다. 특징 1. inverted index 데이터구조를 사용한 인덱싱 구조 사용 2. 데이터 저장 구조가 log-structured 이다. 즉, disk의 도큐먼트 정보 혹은 인덱스 정보가 inplace로 수정되지 않는다. 인덱스를 예로 들면, 인덱스는 여러 세그먼트(immutable, append only)로 구성되고 새로운 segment들이 계속적으로 생성되고 과거의 segment들은 merge를 통해 합쳐져서(compaction이라고 함) 전체 segment 갯수가 일정이하로 유지되는 식의 구조이다 위 1번의..

tech/database 2023.10.22

프로그래밍 언어와 패러다임에 대한 짧은 생각

나무위키를 검색해보다 인상적인 부분을 발견해서 적어놓는다. Java의 예를 들어보자. 처음엔 날코딩에서 시작해 IDE를 쓰게 되고, 서드파티 라이브러리를 사용하다가 스프링 프레임워크라는 것이 있다는 걸 알게 되고, 프레임워크의 유연성에 감동하다가, 그 프레임워크를 만든 근간 기술인 디자인 패턴에 대해 공부하게 되고… 그렇게 차츰 자기도 모르게 고급 프로그래머가 되어 간다. 그러나 학습량은 결코 적지 않다. 위에서 트렌드를 이해해야 한다고 했는데, Java 쪽의 트렌드를 따라가려면 읽어야 할 자료가 엄청나게 많다.[14] 그래서 다른 것에 한눈팔 여유가 없다. 그래도, Java의 인기와 점유율은 여전히 상당하다. 최신 트렌드를 접하다 보면 스프링 프레임워크를 접할 때 즈음엔 함수형 언어에 대해 알게 된다...

tech/생각 2023.10.14

dynamodb 내부구조

내부 아키텍처 이해dynamo db에서 partition key는 hash function 에 의해 2의 64승에 해당하는 파티션 유닛중 하나로 할당된다. 실제 파티션은 파티션 unit의 range 를 갖고 있는데, 어느 파티션의 range로 들어가는지에 따라 소속 파티션이 결정된다. 이때, 특정 파티션에 데이터가 몰릴 경우, 해당 파티션의 range를 반으로 쪼개어 새로운 파티션이 만들어지며 1개의 파티션에 몰려있던 데이터가 2개의 파티션으로 분산되는 과정이 반복된다. 만약 PK가 위의 2번 방식(composite)일 경우, 동일 파티션에 할당된 Partition key가 같은 여러데이터들은 sort key로 정렬되어 b-tree 구조에 저장된다. link  즉, 정리하자면 동일한 파티션키는 내부적인 ..

tech/database 2023.10.08

AWS Kinesis Data Stream 내부구조

현재 회사 서비스에 발생하는 데이터 스트림을 구축하고 있다. aws 에서 제공하는 aws kinesis data stream 를 사용할 일이 있어 내부구조 파악하고 있다.--- 아키텍처kinesis data stream 은 "분산 큐" "스트림 스토리지" 라는 개념으로 설명할 수 있다.즉, 아래 세가지 특성을 갖는다.1. queue2. distributed3. storage stream 별로 샤드수를 지정해야 하는데, 샤드는 인입되는 데이터가 저장되는 큐의 갯수라고 할 수 있다. 1개 샤드당 capacity, maximum total data read rate, maximum total records for writes, maximum total record rate 등 상한수치가 정해져있다. 따라서 인..

tech/database 2023.10.07