기본 콘텐츠로 건너뛰기

2016의 게시물 표시

Netflix에서는 어떻게 고가용성을 확보했는가? (Tomcat 튜닝)

높은 가용성을 위한 tomcat 튜닝, 그리고 fail fast 시스템 # 링크 :  https://medium.com/netflix-techblog/tuning-tomcat-for-a-high-throughput-fail-fast-system-e4d7b2fc163f 문제 상황 # netflix는 수많은 mid tier 시스템으로 구성되어 있는데, 이 서비스들중에 하나가 갑자기 어느순간 트래픽이 몰리면서, cpu가 올라가고 서버가 응답하지 않는 현상이 발생했다. 일반적인 상황에서는 cpu도 널널하고, 게다가 서비스 자체가 cpu 집약적이지도 않음에도 불구하고 이런 현상이 발생한 것이다. 왜 그런걸까? # 테스트를 해보니 일단 apache와 tomcat의 설정이 적절하지 않았다. 트래픽이 올라가는 시점에서 다수의 apache worker들과 tomcat thread들이 busy하게 되고, 이러한 스레드들의 context swtiching 비용으로 사실상 의미 있는 일을 하지 않는 상황에서도 cpu가 높게 올라가는 이슈가 발생했다. 해결은 어떻게? # 일단은 apache - tomcat 으로 구성된 시스템을 tomcat 단일 시스템으로 변경했다. 아무래도 apache를 제거하면 configuration 설정이 상대적으로 심플해질 수 있으니. (tomcat만 관리하면 되니까) 그렇다면 왜 tomcat thread는 그렇게 바쁘게 동작하게 된 것일까? 이것을 알려면 tomcat의 스레드 처리 모델을 알아야 한다. Tomcat 스레딩 모델의 이해 # high level에서의 처리 프로세스는 아래 그림을 참조한다. (외부 이미지 발췌) 여기서 acceptCount값은 OS단에서 클라이언트의 TCP 커넥션 갯수를 queueing 할 수 있는 갯수를 지정하는 것이다. 이것을 크게 잡았을 경우엔 트래픽이 몰릴 경우, OS상의 커넥션 큐를 금방 채우고 tomcat의 worker 스레드를 더 busy하게 만들며 더 몰릴 ...

Etsy서비스에서의 피드 아키텍쳐 (Etsy's Activity Feed Architecture)

Etsy(엣시) 서비스란?   엣시는 미국의 웹2.0을 기반으로 한 전자상거래 사이트이다. 당시 목수이자 웹 디자이너이었던 엣시의 창업자 로버트 칼린은 대표적 전자상거래 사이트인 이베이가 아닌 좀 더 특별한 웹 사이트에 그가 만든 목공예품을 등록하길 원했으며, 2005년 6월 18일에 소셜 네트워크 쇼핑몰 엣시를 구축 했다. 현재 엣시에는 핸드메이드 물건과 사진, 그림, 빈티지 제품 등을 판매 할 수 있고 약 150여개 국가에서 240만명의 유저들이 엣시를 이용하고 있다.   위키백과 Activity Feed Architecture 1. 주요 요소   1) Connections : 유저와 샵, 유저와 유저와의 관계 (node, edge, weight를 가지고 있음)   2) Activities : (Subject, verb, object)로 구성됨. ex) 찰스가 A물품에 좋아하기를 눌렀다. 2. 피드 생성 단계   1) Aggregation : Connection을 기반으로 Activities를 모아 유저별로 newsfeed를 구성   2) Display : newsfeed를 화면에 노출 3. Aggregation   1) affinity 기반으로 connection을 선출함. (다만 random도 어느정도 반영하여 affinity가 떨어지는 connection도 newsfeed 구성에 일부 활용)   2) 대부분의 유저들은 connection이 잘 구성되지 않는 경우가 많은데, 12개 정도의 connection을 임의로 선출하여 사용함.   3) 이후 Activity Set들을 구성 (메모리 자료구조 활용함), 이것들을 분류하고 중복은 제거하고 score (time decay function)를 생성하여, sort&merge함. 이것을 기존에 있던 newsfeed 중간중간에 껴넣는 작업을 진행, 그리고 해당 newsfeed가 일정 길이 이상...
A/B Testing : Test Your Own Hypotheses & Prepare to be Wrong - Stuart Frisby at Booking.com Booking.com의 선임 디자이너인 Stuart Frisby가 2015년도에 O'Reilly 컨퍼런스에서 발표한 A/B 테스팅과 관련된 발표 자료에 대한 대략적인 설명입니다. - 왜 테스트해야 하는가? 1. 우리가 '좋다'라고 생각하는게 대부분은 틀린 경우가 많다. 2. 우리가 추가하는 feature들이 생산적이었으면 좋겠다. 3. 제품의 개발이 이루어지기 위해서는 고객들의 의견이 필요하기 때문이다. 4. 사실에 기반한 제품 생산을 원하기 때문이다. - 왜 테스트 하면 안되는가? 1. 아직 충분한 트래픽이 없을때 2. 아직 key metrics가 준비가 되지 않았을때 => 테스트에 대한 결과를 증명할만한 key metrics가 있어야 한다. 3. 당신이 어느 분야의 '전문가'라고 자처한다면 하지 마라. => 중립적인 입장에서 데이터를 통해 분석할 줄 알아야 한다. - A/B 테스팅의 일반적인 실수들 1. Big Shot AB Testing   쉽게 접하는 가장 일반적인 실수이다. 전체 페이지를 다 바꾸고, 모든걸 다 변경한 후에 테스트를 하고 나서 지표가 좋아졌다고 하더라도 정확히 어떤 요구사항을 만족시켜서 지표가 좋아졌는지 정확히 판단하기 어렵다. 2. Fringe AB Testing   명확하고 구체적인 것에 포커싱 해야 한다. sign up을 늘리기 위해서 landing page를 redesign하는 것도 좋지만이 business metrics에 기반한 분석이 가능하도록 목적을 명확하게 하고 좀 더 작게 테스트를 하는 것이 좋다. 3. Assumed Reproducibility   테스트의 결과가 다른 곳에도 똑같이 생산적으로 반영될 것이라고 생각하지 말아라. 햄버거 메뉴같은 경우에도 어...

[JAVA] 코딩시 고려해야 할 점 (작성중)

개인적으로 코딩을 하면서 문제발생을 야기했거나, 가독성을 해치는 코드를 만들었던 케이스들을 정리하고 지킬수 있도록 합니다. [한번쯤 생각해 볼만한 Coding Convention] AOP나 intercep등 횡단 관심사의 공통 처리 로직의 경우 최대한 가볍게 만든다. 다수의 query문이나 복잡도가 높은 로직을 실행할 경우 이슈가 발생할 소지가 높다. (게다가 이후에 성능문제가 발생했을때 찾기도 어렵다) switch~case나 try~catch 문등의 묶음 단위로 처리되는 구문안에 들어가는 행을 짧게 만든다. 로직이 길어질경우 break;를 누락하거나 return;문을 누락하는 경우가 매우 많다.한눈에 들어오도록 만들수 있도록 한다. (private나 적절하게 기능을 다른 class에 위임하도록) Controller -> Service -> Repository의 레벨은 될 수 있으면 지키자. 내가 만든 Service의 경우 (예를들면 MemberService)에 개념적으로 다른 부분의 영역을 호출할 경우 (예를들어 Profile)에는 Repository를 직접 가져다 쓰기 보다는 Service를 가져다 사용하도록 한다. CheckedException과 RuntimeException을 잘 구분해서 사용한다. 호출하는 쪽에서 복구처리가 필요하거나 반드시 재처리 해줘야 하는 경우에만 CheckedException을 사용한다. (CheckedException은 남용하지 않는다.) 기본제공되는 Exception을 잘 활용한다. (IllegalArgumentException등..) 다중 if문, 다중 for문은 지양한다. 다중 if문은 가독성을 낮추고(code complexity를 높인다), 다중 for문은 성능에 영향을 미칠 가능성이 높다. (기본적인 Collection 자료구조를 잘 활용하면 이중 for문은 거의 사용하지 않을 수 있다.) private안에 private메소드는 될 수 있으면 지양한다. ...

[JAVA] pass-by-value & pass-by-reference

pass-by-value? or pass-by-reference? in JAVA JAVA 개발을 8년째 해오고 있지만, 아직도 기본이 부족하다고 느낄때가 참 많습니다. 최근에는 대학교 1학년 학부 생활할때쯤 배웠던  'pass-by-value (call-by-value)' / 'pass-by-reference (call-by-reference)'에 대해서 다시 한번 개념을 정리한 계기가 있었습니다. 먼저 퀴즈를 통해 접근해 보도록 하죠. 퀴즈) 다음과 같은 코드에서 출력되는 count값은? @Test public void passByValueTest () { Integer count = 1 ; increment( count ) ; System. out .println( "* count : " + count ) ; } private void increment (Integer count) { count++ ; ++count ; } 아마도 대부분의 사람들이 "3"이라고 대답하지 않을까 싶습니다. 또는 증가 연산자인 '++' 의 위치에 대해서 뭔가 함정이 있을까 고민할수도 있겠네요. 누군가는 당연하다고 여길지 모르겠으나 정답은 " 1 " 입니다.   즉, count값은 변경되지 않습니다.  (정확하게 얘기하면 passByValueTest() 메소드안의 count값이 변경되지 않습니다.) JAVA만 공부하셨던 분들은 당연하게 받아들이시는 분들도 있으실테지만, C나 여타 다른 언어를 함께 공부하셨던 분들은 약간 혼란스러운 부분이 있을수 있을것 같습니다. (JAVA에서 object를 넘기면 pass-by-reference 아닌가?? JAVA에선 reference를 어떻게 넘기지?) JAVA엔 포인터를 안쪽에 숨기고 있기 때문에 이런 혼란스러움이 생기는것 같은데요, JAVA는 오직 p...
HATEOAS(Hypermedia As The Engine of Application State) HATEOAS란? - REST application 의 규약 - 클라이언트는 선행정보 없이 서버로부터 전송되는 데이터만으로도 인터렉션이 가능해 진다. 기정의된 IDL 인터페이스를 통해 SOA(Service Oriented Architecture)와 대조되는 개념이다. - client는 어떤 document나 다른 정보 없이 서비스의 하위 정보로 접근이 가능해 지는 이점을 가져갈 수 있다. 기존에 hypertext에서 href를 통해 링크 정보를 내려주는 것과 비슷하다고 볼 수 있다. Hypermedia는 뭐지? - Hypertext의 확정향 개념, hypertext는 일반 text에서 문서간 이동이 가능하도록 hyperlink를 제공해 주었는데, 여기에 Hypermedia는 audio, video까지 포함한 개념으로 이해하면 된다. - 참조 :  https://en.wikipedia.org/wiki/Hypermedia Examples { " content " : [ { " price " : 499.00 , " description " : " Apple tablet device " , " name " : " iPad " , " links " : [ { " rel " : " self " , " href " : " http://localhost:8080/product/1 " } ], " attributes " : { " connector " : " ...