본문 바로가기

[쿠버네티스] uWsgi Graceful Shutdown 발단 회사 시스템에서 API 요청이 비정상적으로 종료되는 오류가 있어서 원인을 분석하게 되었다. 그러다 이 오류는 배포 타이밍과 비슷한 패턴으로 발생한다는 것을 발견하게 되었다. 즉, 이 문제는 Pod이 죽을 때, uWsgi 컨테이너가 Graceful Shutdown을 하고있지 않아서 발생한 문제였다. 이번 글에서는 이 경험에서 학습했던 uWsgi의 특징과 쿠버네티스 파드의 종료 방식에 대해서 정리해보고자 한다. Graceful Shutdown이란? 프로그램이 종료될 때, 최대한 사이드 이펙트 없이 로직을 잘 처리하고 종료하는 것을 말한다. 예를 들어, 열심히 PPT를 작성하던 도중에 파워포인트가 꺼지는 모습을 상상해보자. 이 때, 아무런 조치없이 프로그램이 종료되고, 이전의 작업 내용이 유실된다면 이는..
[uWsgi] harakiri 옵션 - 지나치게 오래걸리는 요청 제어하기 harakiri 하라키리는 워커의 Request 처리 지연을 예방할 수 있는 uWsgi의 기능이다. Request 처리 시간이 uWsgi에 설정한 값보다 오래 소요되는 경우, 해당 Request는 제거되고, 워커는 재사용된다. 사용법 uwsgi 설정 [uwsgi] http = 0.0.0.0:80 harakiri = 30 ...nginx 설정 nginx의 timeout은 harakiri 설정과 동일해야, 각 기능이 기대한대로 동작하게 된다. 예를 들어, harakiri 값이 더 높으면, nginx timeout 설정이 의미 없게 된다. 반면, harakiri 설정값이 더 낮으면, harakiri 설정이 의미 없게 된다. location / { proxy\_pass http://my\_uwsgi\_upstr..
Hibernate-type-52 - Entity에 Postgresql Jsonb 타입 선언하기 Note Hibernate는 Postgresql의 Jsonb 타입을 지원하지 않는다. Jsonb 타입을 엔터티의 속성으로 적용하고 싶은 경우 hibernate-types-52 오픈 소스를 적용하거나, Hibernate의 UserType을 사용하여 커스텀한 Jsonb 타입을 구현해야한다. Code (1) 의존성 추가하기 dependencies { compile('com.vladmihalcea:hibernate-types-52:2.10.0') } (2) Entity Class에 TypeDef 어노테이션 선언하기 (3) 프로퍼티에 jsonb Type, Column 어노테이션 선언하기 (4-1) 샘플 - JsonBinary 타입 선언하기 @Entity(name = "Event") @Table(name = "ev..
ElasticSearch Remote Reindex - ES 버전업과 마이그레이트 Remote Reindex란?Elasticsearch의 Reindex API를 사용하면 도큐먼트를 새로운 인덱스로 복사할 수 있다. Remote Reindex를 사용하면, 도큐먼트를 원격 클러스터의 인덱스로 복사할 수 있다. 때문에 이 기능을 사용하면 Elasticsearch 버전업을 수월하게 할 수 있다. Rolling Upgrade가 불가능한 버전 업을 해야하는 경우, 실시간으로 구 클러스터와 신규 클러스터의 인덱스를 동기화해야하는 경우에 유용하게 쓰일 수 있다. POST _reindex { "source": { "remote": { "host": "http://oldhost:9200", "username": "user", "password": "pass" }, "index": "source", "q..
<이동욱> 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 나는 새로운 프레임워크를 학습할 때에는 일단 튜토리얼을 따라서 간단한 게시판을 만들어본다. 그리고 서버에 애플리케이션을 올려보는 것까지 실습해본다. 처음에는 새로운 언어를 배우는 것이 무작정 어렵게만 느껴진다. 그러나 실습을 하다 보면 패턴이 익숙해지고, 초기에 느꼈던 마음의 장벽들이 낮아진다. 그리고 의미를 모르는 채 코드를 따라치는 것에 갑갑함을 느끼게 되어, 동작 원리에 흥미를 갖게 된다. 올해 중순부터 자바/스프링을 공부하기로 결심했다. 그래서 학습의 방향성을 잡고 언어에 대한 흥미를 줄 수 있는 첫 삽이 필요했다. 그래서 얇은 스프링 부트 책 몇 권을 따라쳐보았다. 그 중, "스프링 부트와 AWS로 혼자 구현하는 웹 서비스"가 가장 이해하기 쉽고, 실습하기 좋았다. 폰트 크기와 컬러 여부, 그리..
<이미예> 달러구트 꿈 백화점 달러구트 꿈 백화점은 꿈을 판매하는 상점을 다룬 소설이다. 꿈 판매자와 제작자, 현실의 손님들의 이야기를 다루고 있어, 판타지와 현실 세계를 번갈아가며 이야기를 풀어나간다. 소설 속 판타지 세계에서는 꿈 제작자들이 꿈을 만들고, 사람들은 자기가 꾸고 싶은 꿈을 구매한다. 소설을 읽으면서 나도 인셉션처럼 꿈을 설계하고 싶다는 생각이 들었다. 현실에서 경험할 수 없는 것들을 체험해보고자 우주에 가는 꿈을 상상해보기도 했다. 그러나 꿈속의 나는 여전히 평범했다. 소설을 읽는 내내 나도 이런 판타지 세계를 경험하고 싶다는 생각이 들었다. 소설에서는 심신 안정용 쿠키, 진정 시럽을 추가한 커피, 설렘 용액처럼 마법의 약이 등장한다. 그런데 다른 관점으로 보면 나는 이미 판타지적인 세계를 살고 있다. 나는 최근 들..
<마이클 C. 페더스 > 레거시 코드 활용 전략 레거시 코드 활용 전략은 테스트 코드 없이 레거시 코드를 다 감수하시겠습니까? 글을 읽은 후, 흥미를 갖게 된 책이었다. 이후, 비즈니스 로직이 복잡한 업무를 담당하게 되었고 나의 복잡한 심정을 대변해줄 대상을 찾는 심정으로 이 책을 읽게 되었다. 이 책은 현업에서 리팩토링을 하면서 암묵적으로 체득한 기법들이 명쾌하게 정리되어 있어 흥미로웠다. 리팩토링을 할 때, 적용 결과가 이전보다 낫다고 확신할 수 없는 경우가 종종 있었다. 이 때, 리팩토링을 하지 않으면 코드를 이해하기 어려웠기 때문에 별다른 선택지가 없어서 고민하고는 했다. 몇 번의 실패를 경험한 후, 스케치하듯이 연습 삼아 리팩토링을 하며 코드를 분석하는 패턴을 체득하게 되었다. 물론, 이 코드는 로컬에서만 사용했고, 리팩토링 효과가 확실하다고..
Chrome의 기본 레퍼러 정책 변화 - strict-origin-when-cross-origin (2020.07 / Chrome v.85) 요약 크롬은 85 버전 (2020.07 출시)부터 strict-origin-when-cross-origin 정책의 기본값을 enable으로 설정하기 시작했다. 이 영향으로 referer의 origin이 다른 경우, url path, parameter를 수집할 수 없는 경우가 발생하게 된다. 웹사이트에 referer 정책을 meta 태그로 설정해둔 경우, 이와 같은 문제는 발생하지 않는다. 크롬에서는 웹사이트에 referer 정책이 선언되어있지 않은 경우에만 브라우저의 referer 정책을 따른다. 각 브라우저의 referer 정책 설정은 chrome://flags/#reduced-referrer-granularity 에서 확인할 수 있다. Chrome 85의 Referer 정책 변화 referer hea..