Circuit Breaker

원격 리소스 요청은 느린 네트워크 연결이나 시간 초과, 혹은 일시적인 문제로 실패할 수 있다. 이런 경우 재시도를 통해 해결 할 수 있으나, 원격 요청의 연속적인 실패와 함께 오류의 복구가 더 오래 걸린다면 재시도는 오히려 시스템의 메모리, 스레드, 데이터베이스 커넥션과 같은 자원을 점유하면서 더 큰 문제를 발생 시킬 수 있다.
Circuit Breaker 패턴은 이러한 반복적인 오류를 막기위한 방법이다. 요청 처리에 일종의 프록시로 동작하는데, 최근 발생한 실패 회수를 기록하고 이를 토대로 요청을 정상적으로 처리할지 아니면 곧바로 막을지 결정한다.
Circuit Breaker는 세 가자 상태 Closed, Open, Half Open로 구현된다.

circuitbreaker

  • Closed: 비활성화 상태. 최근 실패 회수를 기록하고 임계값을 초과하면 Open 상태로 바뀌게 된다. Closed인 경우 요청은 처리Operate된다.
  • Open: 활성화 상태. 요청을 처리하지 않고 즉시 예외를 반환한다. 일정 시간동안 상태가 지속되고 시간이 끝나면 Half Open 상태가 된다.
  • Half Open: 일부 요청에 한에서 처리되도록 허용하는데 이때 허용한 요청이 하나라도 실패하면 다시 Open으로 돌아가고 모든 요청이 성공하면 시스템이 복구된 것으로 간주, Closed가 되며 모든 요청이 처리된다.

요청의 처리가 실패할 가능성이 매우 높을 때, 애플리케이션이 원격 서비스나 공유 자원에 접근하지 못하도록 막기 위해 이 패턴을 사용한다. 비즈니스 로직의 예외를 처리하기 위해 사용되어서는 안된다.

언어, 프레임워크에 구현체가 있는데 요청 상태 코드 혹은 예외 클래스 조건 등 적용하려는 시스템 내에서 커스터마이징을 위해 직접 구현하는 것도 좋다.

npmjs/circuit-breaker-js

java/spring/circuit-breaker

akka/common/circuitbreaker

Anemic Domain Model

특성

안티 패턴에 해당하는 개발 방법이다.

일반적으로 데이터만을 담기위한 Property bag 성격의 엔티티로 구현된다. 이 모델에는 특별한 행동이나 특성을 나타내는 메소드는 없고 속성의 Getter, Setter 메소드의 나열로 이루어져 있다.

비즈니스 처리는 별도의 서비스 혹은 헬퍼 클래스를 통해 처리된다. 이는 보통 트랜젝션 스크립트Transaction Script 패턴을 따르는데 이러한 데이터 백과 일련의 트랜젝션 스크립트 형태는 객체 지향적 개발 방법에서 매우 멀어지는, 절차적 개발 방식의 일종이다.

적용

특별한 비즈니스 규칙이 없고 단순한 CRUD가 필요한 경우 사용한다.

문제점

특성과 행동을  포함하지 않기 때문에 엔티티간 상태의 불일치 문제가 발생한다. 이는 비즈니스 처리를 할 때마다 상태가 올바른지 영속성 저장소를 다시 조회해야하는 비용을 발생시킨다. 또한 모델과 관련된 모든 동작의 세부 사항을 별도로 기억 혹은 기록해야 한다. 이런 상황에서 비즈니스 규칙이 추가되고 복잡해질 수록 새로운 규칙을 추가하거나 수정하는 일이 더욱 어려워진다.

Windows; VisualStudio; 2012; MS Visual Studio 재설치시 파일 경로 수정 불가 문제

Visual Studio 제품군을 재설치시 설치 경로를 바꿀 수 없는 경우가 있습니다. 제어판 > 프로그램 추가/삭제에서 제거를 하더라도 완전히 삭제가 되지 않는데, 이런 경우 커맨드 프롬프트에서 명령어를 입력하여 완전히 삭제해야 합니다.

계속 읽기 “Windows; VisualStudio; 2012; MS Visual Studio 재설치시 파일 경로 수정 불가 문제”

Grafana; Influxdb; Telegraf; 서버의 관제 (Monitoring)와 알림 (Alerting), 그리고 자동화 하기

이전 : https://blog.geunho.dev/posts/grafana-influxdb-telegraf-monitoring-alerting/

서버의 관제 (Monitoring) 에 대해서

DevOps의 역량이 점점 중요해지면서, 개발자가 서버의 운영에도 적극 개입하게 되었습니다. 서버의 리소스 뿐만 아니라 다른 시계열 데이터로 된 지표들을 미리 관제하여 서비스에 이상이 생겼음을 즉시 통보 받을 수 있어야합니다. 과거 시스템 관리자로부터 통보 받던 방식은 관제 대상이 제한적이라는 한계가 있습니다. 계속 읽기 “Grafana; Influxdb; Telegraf; 서버의 관제 (Monitoring)와 알림 (Alerting), 그리고 자동화 하기”

Hbase; Phoenix; PhoenixIOException: The system cannot find the path specified

이전 : https://blog.geunho.dev/posts/hbase-phoenix-troubleshoot-1/

발생원인 및 해결방법

윈도우에서 Phoenix에 jdbc client로 접속 후 order by 혹은 group by 명령어를 수행하면 아래와 같은 에러 메시지가 발생합니다. 계속 읽기 “Hbase; Phoenix; PhoenixIOException: The system cannot find the path specified”

kafka; org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for {}; kafka consumer의 zookeeper 관련 에러 발생시 대처

이전 : https://blog.geunho.dev/posts/kafa-troubleshoot-2/

발생 원인 및 해결 방법

Kafka consumer가 zookeeper 접속에 실패하면 발생하는 에러입니다. 그 원인에는 여러가지 이유가 있는데 그 중 timeout 시간이 짧아 발생한 상황에 대해 정리합니다.

계속 읽기 “kafka; org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for {}; kafka consumer의 zookeeper 관련 에러 발생시 대처”

kafka; kafka.common.InconsistentBrokerIdException: Configured brokerId {} doesn’t match stored brokerId {} in meta.properties; kafka 재시작 불가 문제

이전 : https://blog.geunho.dev/posts/kafka-troubleshoot-1/

발생 원인 및 해결 방법

Kafka broker 서버의 설정 파일 (conf/server.properties) 에 명시된 broker.id 값과 로그 파일이 저장되는 폴더 (kafka-logs/meta.properties) 에 명시된 broker.id 값이 서로 달라서 발생하는 문제입니다.

계속 읽기 “kafka; kafka.common.InconsistentBrokerIdException: Configured brokerId {} doesn’t match stored brokerId {} in meta.properties; kafka 재시작 불가 문제”

linux; ubuntu; 파일시스템 접근 권한 설정

이전: https://blog.geunho.dev/posts/filesystem-permission/

 

1. 파일시스템의 접근 권한

리눅스를 포함한 POSIX 계열 운영체제에서는 “전통적인 유닉스 권한” (Traditional Unix Permissions)을 따릅니다. 파일 목록을 보는 커맨드를 입력하면 아래와 같은 출력을 볼 수 있습니다:

계속 읽기 “linux; ubuntu; 파일시스템 접근 권한 설정”