잡다한 프로그래밍 :: 잡다한 프로그래밍
반응형

- 정적 팩터리 메서드는 클래스에 정적 메서드를 정의하여, 생성자 대신 객체를 생성할 수 있게 만드는 기법이다.

 

장점 1. 이름을 가진 생성자

 

생성자는 기본적으로 이름을 가질수 없다.

아래와 같은 클래스가 존재한다고 했을때, 다른 개발자가 해당 생성자를 보고 코드를 직관적으로 이해할 수 있을까?

public class Test {
    private int no;
    private String name;

    public Test(int no) {
        this.no = no;
    }

    public Test(String name) {
        this.name = name;
    }
}
Test test1 = new Test(1);
Test test2 = new Test(2);

이렇게 코드를 작성하면, 다른 개발자가 생성자 인자에 no, name을 전달해야한다는 사실을 직관적으로 이해할 수 없다.

 

정적 팩터리 메서드를 사용한 객체 생성

public class Test {
    private int no;
    private String name;

    private Test(int no, String name) {
        this.no = no;
        this.name = name;
    }

    public static Test createById(int id) {
        return new Test(id, null);
    }

    public static Test createByName(String name) {
        return new Test(0, name);
    }
}

생성자에 private 접근 제어자를 두어 new 키워드로 직접 객체를 생성할 수 없게 하고, 정적 메서드를 통해  Book 객체를 생성한 뒤 반환하게한다.

Test test1 = Test.createById(1);
Test test2 = Test.createByName("이름");

이로서 생성자는 이름을 가지게 되고, 좀 더 직관적으로 바뀌게 된다.

 

장점 2. 호출될때마다 인스턴스를 생성하지 않아도 된다.

public class Test {
    private int no;
    private String name;

    private Test(int no, String name) {
        this.no = no;
        this.name = name;
    }

    private static final Test TEST_INSTANCE = new Test(1, "test");

    public static Test getInstance() {
        return TEST_INSTANCE;
    }
}

 

장점 3. 호출될때마다 인스턴스를 생성하지 않아도 된다.

class Parent {
    public static Parent child1() {
        return new Child1();
    }

    public static Parent child2() {
        return new Child2();
    }

    public static Parent child3() {
        return new Child3();
    }
}

class Child1 extends Parent {
    // ...
}

class Child2 extends Parent {
    // ...
}

class Child3 extends Parent {
    // ...
}

 

장점 4. 인자에 따라 다른 클래스 객체 반환 가능 (장점3과 비슷함)

장점 5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

- 서비스 제공자 프레임워크를 만드는 근간이 된다. (ex. JDBC)

  public static void main(String[] args) {
      ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class);
			// 첫번째 구현체를 가져옴(있을수도 없을수도 optional로 가져옴
      Optional<HelloService> helloServiceOptional = loader.findFirst();

      helloServiceOptional.ifPresent(h -> {
         System.out.println(h.hello());
      });
   }

단점1. 상속을 하려면 public이나 protected 생성자가 필요하니, 정적 팩토리 메소드만 제공하면 하위 클래스를 만들 수 없다.

위의 예제처럼 생성자를 private로 생성하기 때문에 상속받을 수 없다는 단점이 있다.

반응형
반응형

1. Backpressure(배압) 현상 이란?

배압이란 데이터 생산(Producer)과 소비(Consumer)가 불균형적일 때 일어나는 현상이다.

만약 10,000개의 데이터를 0.1초마다 발행하고, 소비는 10초마다 한다면? 데이터는 스트림에 계속 쌓이게 된다.

이는 OutOfMemoryError(OOM)로 이어져 어플리케이션이 죽게 될 것이다.

이러한 현상을 배압(Backpressure)이라고 하며 RxJava에서는 배압 현상을 제어할 수 있는 방법을 제공한다.

 

2. 어디서 주로 발생?

생산자, 소비자 라는 내용이 이전 내용과 비슷하지 않은가? (대용량 처리, kafka 참고) 생산자가 reactive하게 데이터를 쌓고, 소비자가 이를 가져다가 사용하는 구조에서 주로 발생하게 된다.

※ 정리하면 non-blocking 방식으로 데이터를 보내는구조에서 발생

 

3. Backpressure를 예방하기 위한 전략

 

반응형
반응형

지인의 추천으로 메이크 타임이라는 책을 읽게 되었다.

 

이 책은 시간관리에 대한 설명을 해주는 책이다.

시간관리를 잘하고 싶은 사람들이 읽어보면 좋을 것 같다.

 

책에서 설명하고 있는내용은 다음과 같았다.

 

1. 하이라이트

- 쉽게 설명해서 오늘의 하이라이트 (가장 중요한 것)를 정하는 것 이다.

하이라이트를 정하는 방법 (직감, 글쓰기 등)은 다양하게 있고 책을 한번 읽어보는 것 을 추천한다.

 

2. 초집중

- 하이라이트를 정했으면 해당 일을 수행할 시간을 지정해 두는 것이다. 이시간에는 하이라이트를 제외한 다른일을 할 수 없게 한다.

 

3. 돌아보기

- 오늘의 하루를 돌아보는 것, 쉽게 말해 내가 정한일을 얼마나 잘 수행했는지 등 되돌아보는 시간

 

4. 에너지 회복

- 내일도 1, 2, 3 번의 단계를 수행할 수 있도록 회복하는 단계이다.

 

이런식으로 시간 관리하는 방법을 제시한다. 간단하게 정리하다보니 이정도는 책을 읽지 않아도 누구나 알 수 있는게 아닐까? 하지만, 책에서 제시하는 작은 차이들이 꽤 도움이 된다 (시계설정, 유튜브 SNS 절제 등)

 

내가 시간관리를 잘 하고 싶다면 한번쯤 추천하는 책이다.

반응형

'일상 > 독서' 카테고리의 다른 글

[독서] - 도파민네이션  (0) 2023.12.06
[독서] - 원띵  (0) 2023.12.06
[독서] 창업가의 특성  (0) 2023.08.17
[독서] 클루지  (0) 2023.06.27
[독서] - 포커스 리딩  (0) 2023.06.20
반응형

관심있는 분야이다보니 해당 책을 읽게 되었다.
해당 책은 저자가 생각하는 방법을 나열해 두었기에 요약하는편이 좀 더 어울리다고 생각해서 정리하게 되었다.

책에서 하고자하는 말은, 단순하게 어떤식으로 행동해야 창업에 성공할 수 있는지이다. 책 제목처럼 심플하다.
내가 가장 기억에 남았던 내용을 정리하자면 아래와 같다.

1. 먼저 해야 성공한다.
- A는 이래서 안돼, B는 이부분이 부족하네.. C는 등등 이런 잡다한 고민보다 일단 팔아보는게 더 중요하다는 내용이다.
- 시장에서의 가치는 내가 판단하는게 아니기 때문에, 일단 하나라도 판매(시도)를 해보는게 더 중요하다고 한다.

2. 직장에서의 성공경험과, 창업은 다르다.
- 직장에서 성공한 사람들이 가장 많이 오해하는 것 중 하나라고 한다.

3. 마케팅 2.0 > 3.0으로의 전환
- 마케팅 방법을 바꾸라는 내용인데 소비자 중심의 마케팅을 했다면, 3.0은 소비자에서 나아가 세상을 더 나은바향으로 바꾸자 하는데 힘쓴다.
- 책이 아닌 개인적인 서칭으로는 4.0 까지 존재하는것 같다.

가끔은 이런 다른주제의 책을 읽어보는것도 도움이 되는 것 같다.

반응형

'일상 > 독서' 카테고리의 다른 글

[독서] - 원띵  (0) 2023.12.06
[독서] - 메이크 타임  (1) 2023.11.04
[독서] 클루지  (0) 2023.06.27
[독서] - 포커스 리딩  (0) 2023.06.20
역행자 - 자청  (1) 2023.02.16
반응형

이전 자청 책을 읽고 궁금한 책이기도 했고, 회사 1층 추천서에 이 책이 있어서 읽게 되었다.
먼저 클루지란 어떤 문제에 대해 서툴거나 세련되지 않은 해결책을 뜻한다. (하지만 잘 굴러가기는 하는 그런 상황)
쉽게 정리하면 어찌어찌 해결은 잘 되는데, 방법이 깔끔하지 않은 그런 상황을 뜻한다.

이러한 일이 왜 생겼을까? 인류는 결국 생존하기 위해서 클루지 방식대로 진화했기 때문이라고 한다.
그럼 이러한 방식이 최고의 방법일까? 이 책에서 말하고자 하는 내용이 이 내용이라고 생각한다.

결국 우리는 이러한 클루지를 인지하고 더 나은 방법을 찾아야 한다.

책에서 예시로 보여주는 클루지는 다음과 같다.

1. 인간의 기억 체계는 생각보다 허술하다.
- 인간의 기억 방법이 컴퓨터보다 좋은 점, 나쁜 점을 예시로 들며 설명하지만 결국 우리 기억은 100% 신뢰할 수 없다.

2. 신념은 쉽게 오염될 수 있다.

3. 피로하거나 마음이 산란할 때는 되도록 중요한 결정을 내리지 말 것

이외에도 책에서 여러 클루지 예시를 들어주고 있어서 책을 읽고 확인해 보면 좋을 것 같다.
책 자체는 많이 두껍고, 지루한 편이지만 신선한 내용들이 중간중간 숨어있어서 한 번쯤 읽어보길 추천한다

반응형

'일상 > 독서' 카테고리의 다른 글

[독서] - 원띵  (0) 2023.12.06
[독서] - 메이크 타임  (1) 2023.11.04
[독서] 창업가의 특성  (0) 2023.08.17
[독서] - 포커스 리딩  (0) 2023.06.20
역행자 - 자청  (1) 2023.02.16
반응형

팀장님의 추천으로 `포커스 리딩`이라는 책을 읽게 되었다.

항상 책읽는건 좋은거야, 중요해 라고 생각은 했지만 어떻게 책을 읽어야 도움이 되는지는 잘 몰랐기에 재미있게 읽어볼 수 있었다.

책에서는 독서의 장점을 계속해서 설명한다. 책은 경험을 싼 값에 살 수 있는 것, 만날 수 없는 대상의 강의를 듣는 것 등 비유해가며 설명하는데

결국 이러한 독서를 어떻게 효율적으로 읽을 수 있는지가 주 내용이다.

5가지로 책에서는 단계를 정의하고있다.

1. 마인드셋
- 나는 할 수 있다는 마음가짐을 가지는 마인드셋 단계

2. 속도 뛰어넘기
- 집중력을 향상시키는데 도움이 되고, 본인이 필요로 하는 핵심을 빠르게 뽑아낼 수 있게 훈련하는 단계 이다.

3. 스킵 & 스캐닝
- 핵심이 아닌 부분은 빠르게 스킵하고, 보다 빠르게 스캐닝하는 훈련이다.

4. 핵심단어 뽑아내기
- 자기만의 핵심을 뽑아낼 수 있게 훈련하는 단계이다.
- 핵심 3가지가 하나의 결론을 나타낸다고 책에서는 말하고 있으며, 이러한 훈련은 일상에도 도움이 될 것 이다

5. 질문하기
- 스스로 끊임없이 질문하는단계
- 이 책에 핵심을 정확하게 파악했는지 스스로에게 질문하는 단계 질문을 하면 할 수록 더 좋은 답에 도달할 수 있다.


책 읽기를 좋아하거나, 책 읽기를 시작해보려는 누군가가 있다면 해당 독서를 추천한다.

반응형

'일상 > 독서' 카테고리의 다른 글

[독서] - 원띵  (0) 2023.12.06
[독서] - 메이크 타임  (1) 2023.11.04
[독서] 창업가의 특성  (0) 2023.08.17
[독서] 클루지  (0) 2023.06.27
역행자 - 자청  (1) 2023.02.16
반응형

1. 카프카의 기본 구성

카프카는 데이터를 받아서 전달하는 데이터 버스의 역할을 한다. (이전 MQ와 동일한 형태)

그리고 주키퍼는 카프카의 정상 동작을 보장하기위해 메타데이터를 관리한다.

 

앞서 설명한 Message Queue처럼, producer는 카프카에 메세지를 전달하고, consumer는 카프카에서 메세지를 꺼내간다.

이때 이 카프카에 대한 설정은 주키퍼에서 담당한다.

 

2. 카프카의 기본 개념

  • 브로커: 카프카가 설치되 서버, 또는 노드를 의미함
  • 프로듀서: 카프카로 메세지를 보내는 역할을 하는 클라이언트
  • 컨슈머: 카프카에서 메세지를 꺼내가는 역할을 하는 클라이언트
  • 토픽: 카프카는 메시지 피드들을 토픽으로 구분, 각 토픽은 카프카내에서 고유함
  • 파티션: 병렬 처리 및 고성능을 얻기 위해 하나의 토픽을 여러개로 나눈 것을 말함
  • 세그먼트: 프로듀서가 전송한 실제 메시지가 브로커의 로컬 디스크에 저장되는 파일을 말함
  • 메세지: 프로듀서가 브로커로 전송하고나, 컨슈머가 읽어가는 데이터를 의미함
  • 주키퍼(ZooKeeper): 카프카의 메타데이터 관리 및 브로커의 정상상태 점검(health check)을 담당합니다

 

토픽(TOPIC)

- producer가 실제로 보내는 메세지가 담기는 곳

- 하나의 토픽에 여러 프로듀서들이 메세지를 전송할 수 있고, 여러 컨슈머가 하나의 토픽에서 데이터를 읽어올 수 있다.

- 토픽을 효율적으로 관리하기위해, 토픽은 여러 파티션으로 구성되어야한다

 

파티션

여러프로듀서 A, B, C가 같은 'TOPIC1'에 데이터를 전송했다고 가정해보자.

토픽에 파티션이 1개라면 프로듀서 A, B, C가 보내는 데이터는 해당 파티션이 모두 감당해야한다.

이 경우 하나의 데이터 전송 완료 이후, 다음 메세지 전송이 가능해지면서 전송 속도에 영향을 미친다.

 

- 파티션을 여러개로 늘려 하나의 토픽을 병렬 처리할 수 있도록 한다.

 

▶ 적절한 파티션의 수는 어떻게 정할 수 있을까?

파티션의 수는 초기 생성 후 언제든 늘릴 수 있지만, 다시 줄일 수 없음

따라서 파티션수를 작게, 2개 혹은 4개 정도로 생성한 후, 메시지 처리량이나 컨슈머의 LAG(카프카의 남아있는 메시지수)를 보고 늘려 가는 방법이 가장 좋다.

https://eventsizer.io 를 참고해 적절한 파티션 수를 산정할 수도 있다 (참고용)

 

추가

파티션간에는 순서보장 X, 같은 파티션내에서는 순서보장O

그래서 토픽에 메세지 전달할땐 키값을 같이 전달해서 같은 파티션에 저장해서 순서보장을 하거나 하는식으로 사용가능

 

파티션 오프셋

파티션내의 메세지의 위치를 의미

세그먼트

프로듀서가 hello my name is A라는 메세지가 "TOPIC1" 에 파티션 0에 저장되었다면 해당 메시지는 어떻게 저장되고 있을까?

바로 파티션0에 세그먼트 라는 로그 파일의 형태로 브로커의 로컬 디스크에 저장된다.

해당 로그파일을 확인하고 싶다면 /data/kafka-logs/에서 확인할 수 있다.

 

리플리케이션

리플리케이션이란, 각 메시지들을 여러개로 복제해서 카프카 클러스터내 브로커들에게 분산시키는 동작을 의미한다.

이러한 리플리케이션 동작덕분에 하나의 브로커가 종료되더라도 카프카는 안정성을 유지할 수 있다.

 

위 그림은 'Topic1'을 리플리케이션 팩터 3으로 설정한 후 각 브로커에 배치된 상태이다.

그림에 나타난대로, 'Topic1'은 원본을 포함해 총 3개가 있다. (정확하게는 토픽이 리플리케이션이 되는것이 아니라 파티션이 리플리케이션 된다)

 

▶ 적절한 리플리케이션 팩터 수는 어떻게 정할 수 있을까?

리플리케이션 팩터수가 커지면 안정성은 높아지지만, 브로커의 리소스를 많이 사용하게 된다. (저장하는 양이 많아지니까)

테스트나 개발환경 = 리플레이션 팩터 수 1

운영 환경 (로그성 메시지로 약간의 유실 허용): 리플리케이션 팩터 수 2

운영 환경 (유실 허용 X) 리플리케이션 팩터 수 3

 

※ 실전 카프카 개발부터 운영까지 고승범 작가에 의하면, 리플리케이션 팩터 수 3정도면 충분하게 안정성 보장과, 적절한 디스크 공간을 사용할 수 있다고 한다. 더 늘어날 경우 디스크 공간을 많이 사용할 수 있음을 인지하도록 하자.

 

실제 카프카를 사용하기 전, 개념 정리를 완벽하게 하고 가도록 하자.

반응형
반응형

- 앞서 공부한 MQ중 널리 사용되는 kafka를 설치하고 공부하도록 할 예정이다.

- AWS, 온프레미스 방식을 이용해도 되지만. 간단하게 도커, 도커 컴포즈를 이용하여 설치하도록 할 예정이다.

 

- 주키퍼3, 카프카3 형태의 클러스터 설치 방법을 공유할 예정이다.

주키퍼 = 과반수 방식을 유지해야하므로 홀수 구성 필요(Elasticsearch 클러스터 구성과 유사)

카프카 = 과반수 방식이 아니라 반드시 3대를 만들 필요는 없지만, 리플리케이션 팩터 수를 3을 충족시키기 위해 최소 3대의 클러스터 구조로 구성한다

 

1. 도커 설치 방법

# docker 리포지토리에 접근하기 위한 키 생성 설정
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 패키지 매니저가 docker 설치 시, 설치 위치를 알기 위한 repository 추가
sudo add-apt-repository \ 
 "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 

# 위에서 추가한 repository를 위해서 업데이트!
sudo apt update

# docker 설치
sudo apt install docker-ce

sudo systemctl status docker

2. 도커 컴포즈 설치 방법

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

docker-compose -v

 

3. kafka 설치 방법

git clone https://github.com/onlybooks/kafka2

cd kafka2/appendix_C/cluster_zk_kafka/

docker-compose up -d

4. 설치 완료 확인

docker ps 명령어로 kafka1,2,3 zk1,2,3이 동작중인지, status 가 up인지 확인한다.

 

http://{{IP}}:9000/ 로 접속하면 CMAK를 확인할 수 있다.

해당 CMAK에서  아래와 같이 클러스터를 등록하면 된다.

반응형

+ Recent posts