studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 사례 정리
  • 1. Feedback API 호출 실패
  1. 실무 하며 깨닫는 부분 정리

장애 대처법

  1. 일단 마음을 가라앉힌다

  2. 가능하다면 이미 내 모듈에다가 상태를 파악할 수 있는 수단을 만들어뒀기를 기도한다.

  3. 그 수단 (상태 확인용 API라던가..) 을 사용해서 우선 내 API 상태가 정상인지 확인한다.

    1. 그런 수단이 없다면 서버로 들어가서 로그를 먼저 본다.

    2. 로그에 딱히 이상한게 없다면 이번엔 문제 기능을 직접 호출해서 테스트해본다.

    3. 문제가 없다면 이번엔 외부의 다른 위치에서도 정상적으로 작동하는지 확인해본다. 다른 IDC, 한국이면 한국, 일본이면 일본 등 되도록 다양한 위치에서 확인한다.

  4. 이래도 저래도 내 문제가 아닌 것 같다면 내 모듈을 사용하는 쪽에다가 확인용 API 등을 보내서 curl 같은걸로 테스트 해달라고 한다.

  5. 그 쪽에서 확인 결과 정상 작동한다고 하면 이제 이건 내 문제가 아니고 그쪽 클라이언트 문제이므로 그렇게 말하면 된다.

  6. 그런데 이 때, 정상작동하지 않으면 이건 네트워크, 인프라의 문제일 가능성이 있으므로 조사할 필요가 있다.

    1. ACL, 라우팅, L4 등 다양한 가능성이 있으므로 하나하나 찾아봐야한다.

사례 정리

1. Feedback API 호출 실패

상황

내 Rest API 사용하는 클라이언트가 어느 시점부터 Connection 오류가 뜬다고 연락이 옴. 확인해보니 로컬, 다른 한국쪽 서버, 다른 일본쪽 서버에서 시도해봤을 때 모두 정상적으로 호출됨. 사용자의 해당 서버에서 curl로 시도했을 때도 문제없이 동작.

원인

알고보니 L4서버와 내 Rest API 서버간 tcp connection은 timeout이 30분인데 내 서버에 별도 알림 없이 그냥 connection을 끊어버림. 보통은 이런 경우 새로 connection을 맺어서 사용하기 때문에 문제가 발생하지 않는데, 해당 클라이언트에서는 내 API를 호출할 때 connection을 pooling 해두고, 또 그 클라이언트의 timeout 세팅이 30분보다 길었기 때문에 문제가 발생함. 이 때 클라이언트 - L4 사이의 connection은 살아있는 것으로 간주되어 계속 그 connection을 사용하려고 시도함. 그러나 API 호출이 30분 이상 없어서 L4에서는 내 서버로 connection을 끊어버린 상황. 그러므로 당연히 정상 동작하지 않음.

해결책

  1. 클라이언트 서버의 커널 tcp connection timeout 설정을 30분 미만으로 수정. 이렇게 하면 30분 이상 요청이 없을 때 클라이언트가 connection을 정리하므로 재발 방지

  2. 클라이언트에서 api를 호출할 때 connection 오류가 뜨면 새로운 connection을 맺어서 retry하도록 로직 추가.

딱히 내가 뭘 어떻게 할 수 있는 부분은 없었음.

Previous자바 프로그램에 문제가 생겼다면NextLogstash, Beats 정리

Last updated 7 years ago