TCP는 연결이 완료된 후에 데이터를 주고 받지 않으면 아무런 데이터도 오가지 않는다. 이는 중계 라우터 장애 등 예상치 못한 장애로 인해서 연결이 끝기더라도 양쪽에서는 이를 감지하지 못하고 연결 상태를 유지할 수 있다.여기서 사용할 수 있는 기능이 keepalive이며 이 기능은 종단 시스템 중 하나가 다운됐을 때 한 쪽만 열린 상태를 막기 위함이다.setsockopt()를 사용하여 SO_KEEPALIVE 옵션을 사용하면 되며 tcp_keepalive_interval로 지정된 시간 동안 유휴 상태가 되었을 때 이를 상태를 확인하기 위해서 keepalive 패킷을 보내게 된다. 이 패킷에 응답이 없을 경우 연결을 종료하게 되는데 이 기능은 옵션이므로 상황에 따라 작동하지 않을 수 있다.
이 패턴은 여러 기준을 만들어 연결할 수 있다. 또한 하나의 조건은 내부적으로 여러 조건을 갖을 수 있으며 연결된 여러 조건들을 사용하여 객체를 검사할 수 있다.https://www.tutorialspoint.com/design_pattern/filter_pattern.htm Intercepting Filter Pattern Intercepting Filter Pattern은 중요 로직을 수행하기 전과 후에 처리해야 할 작업을 Filter로 만들고 이를 Chain으로 연결하여 사용하는 패턴이다. Filter는 연결된 순서로 실행되며 인증, 로깅, 검사 등의 Filter 만들고 필요한 로직의 어디에서나 재활용한다. 필요한 부분에서는 원하는 Filter들을 재조합하여 활용한다.https://www.tutor..
이 패턴은 Runtime 중에 행동이나 알고리즘을 교체할 수 있게 하는 것에 있으며 다양한 전략적인 Object를 만들고 상황에 맞는 전략을 선택할 수 있다.Bridge Pattern과 비슷한 듯 보이지만 Bridge Pattern은 구조 패턴이고 Strategy Pattern은 행동 패턴임이 다르다. 나도 둘이 거의 비슷한 느낌이 들지만 Bridge Pattern으로 행동에 해당하는 구현 부분을 분리하고 이를 Runtime에서 상황에 맞는 객체로 교체한다면 두 패턴을 혼용해서 사용했다고 생각했다.Netty의 Pipeline은 runtime에서 들어오는 데이터에 따라 언제 든지 교체가 가능한데 이 부분도 이 패턴이 사용됐다고 생각한다.https://www.tutorialspoint.com/design_p..
이 패턴의 중요한 점은 구현 클래스와 추상 클래스를 분리하는데 있다. 여기서 구현 클래스와 추상 클래스를 구분 짓는게 쉽지 않았다. 추상 클래스를 내가 만들려는 목적 클래스로 생각 한다면 구현 클래스는 추상클래스 안에서 실제로 동작하는 수행하는 부분이라고 생각했다. https://www.tutorialspoint.com/design_pattern/bridge_pattern.htm예제를 보면 구현 인터페이스인 DrawAPI를 추상 클래스인 Shape을 확장한 Circle이 draw메소드에서 사용하고 있는 것을 볼 수 있다.
두 개의 호환되지 않는 인터페이스를 연결해 주기 위한 패턴으로 새로운 기능의 클래스가 기존의 다른 인터페이스 기능을 사용하려고 할 때 두 인터페이스를 연결하는 용도로 사용할 수 있다.카드리더기를 예로 들 수 있는데 메모리 카드와 노트북 사이에서 노트북이 메모리 카드를 사용할 수 있도록 도와주는 것이다.A가 B의 기능을 사용해야 한다면 A의 인터페이스로 Adapter를 만들고 Adapter가 B를 사용하도록 설계하면 B의 인터페이스가 변하더라도 A의 변경없이 Adapter만을 변경하여 사용할 수 있다.https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm
Java는 메모리를 할당 받는 것은 개발자가 원하는 만큼 받을 수 있지만 해제는 개발자의 영역이 아닌 JVM의 영역이다. 이 Garbage Collection는 Garbage Collector(이하 GC)에 의해서 수행되며 할당된 객체가 더이상 참조되지 않을 경우 수행되게 된다.GC는 개발자가 메모리를 명시적으로 해제해야 하는 고민을 덜어 주었지만 의도와 다른 GC 수행으로 잠시 멈추는 현상인해 CPU를 많이 사용하는 프로그램의 경우 어려운 상황을 초래하기도 한다.Hotspot의 GC Hotspot은 Generational Collection 방식을 사용하는데 익히 들어왔던 것과 같이 Heap영역을 Young Generation과 Old Generation으로 나누는 것이다.객체가 처음 생성되는 영역은 ..
Object class는 자바에서 기본적으로 상속을 받는 클래스로 항상 사용은 하고 있지만 Object 의 메소드는 자주 사용하지 않아서 정확한 사용방법을 모르는 경우가 많다. 나도 정확히 모르는 부분이 있어서 java API와 실제 구현 소스를 보고 정리를 해 보았다.참고 API URL : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.htmlpublic native final Class getClass() 객체의 런타임 class를 반환해 준다. 이 반환되는 Class object는 static syncronized methods에 의해서 잠겨있다.public native int hashCode() 이 메소드는 각 객체의 hashCode를 만..
log파일에서 중복 데이터를 찾아야 하는 경우가 생겼을 때 아래의 명령어를 통하면 쉽게 찾을 수 있다. 물론 로그가 특정 키값을 갖도로 남아야 한다. 우선 로그파일을 모두 보면 명령어에 cat test.log특정 로그를 찾기 위한 필터를 한다. grep의 -a 는 해당 파일이 binary 형태일 경우 넣어준다. cat test.log | grep -a "SEND DATA"그리고 이 로그 중에 찾아야 추출해야 하는 부분을 awk 명령어를 통해서 빼낸다. 여기서 sub는 awk로 추출한 문자열 중 필요없는 문자를 빈 값인 ""로 치환하여 필요한 단어만 추출하는 기능을 한다. 필요한 만큼 sub( "aa", "");를 반복하여 사용해서 필요없는 문자를 지울 수 있다. cat test.log | grep -a ..
Scouter는 JVM을 모니터링 할 수 있는 오픈소스 성능 모니터링 툴로 기본 기능을 사용하기에는 정말 좋으며 tomcat은 상세하게 모니터링 할 수 있는 기능을 제공한다. Scouter는 Agent, Server, Client 세 부분으로 나눠진다. - Agent : jar 로 제공되며 모니터링을 할 JVM에 포함시켜서 같이 기동된다. - Server : Agent가 보내는 데이터를 수집하며 Client에게 데이터를 보내준다. - Client : Server에서 받은 정보를 화면에 보여준다. - Host : 서버의 cpu, memory, disk, network 등의 정보를 수집한다.모든 소스는 github에 있고 소스를 받아 빌드를 해볼 수 있고 release를 다운 받아 설치하여 사용할 수있다.빌..
이번에 개발한 API서버의 성능 테스트를 진행하면서 모니터링을 위해 Thread, CPU, Memory, 개발한 connection pool, Thread pool 등의 자원은 JMX를 사용하고, 처리 속도 및 병목 구간을 확인하기 위해서 Open Source APM인 Scouter를 적용해 보기로 했다. Scouter의 XLog를 사용하면 하나의 서비스에 대해 전체 호출 StackTrace를 확인할 수 있기 때문에 아주 유용할 것으로 보였다.JMXJMX는 체크해야할 클래스의 정보를 MBean Interface를 통해 확인하고 데이터를 변경할 수 있다. 방법은 interface를 만들고 간단하게 MBeanServer에 등록하면 된다.(Interface를 만들 때 get/set를 지켜줘야 하고 Interf..