상돌로그

상돌로그

모든 경험과 개인적인 생각을 기록합니다.

K8S Deployment가 생성하는 파드 이름의 해시값 충돌 가능성과 TSID로의 적용 과정
Tech

K8S Deployment가 생성하는 파드 이름의 해시값 충돌 가능성과 TSID로의 적용 과정

TSID는 Twitter Snowflake와 비슷하게 시간을 기반으로 고유한 값을 생성하며, 분산 환경에서의 Primary-Key 채번 등에 사용됩니다. TSID는 총 64비트로 구성되며, 그 구조는 다음과 같습니다. * 시간: 42비트, 2020년 1월 1일부터 채번 시점까지 경과된 ms단위 시간 * 노드 번호: 10비트, 지정할 수 있는 노드 번호 (10비트 기본값에서는 0~1023 까지) * 카운터: 12비트, 1ms당 생성할
10 min read
Kotlin의 Annotation use-site target와 Spring Bean Validation에서의 Null-Safe 처리
Tech Kotlin

Kotlin의 Annotation use-site target와 Spring Bean Validation에서의 Null-Safe 처리

코틀린을 시작한지 3일정도 되었는데, 자바를 쓰다 넘어가니 확실히 처음 자바를 배울 때 보다는 수월한 것 같습니다. 코틀린과 자바는 전반적으로 비슷하지만 그럼에도 차이가 있는 부분이 존재하는데, 이번 글에서 다룰 Spring Bean Validation에서의 차이가 그 중 하나일 것 같습니다. 이번 글에서는 배경 지식인 코틀린에서의 use-site targets을 먼저 살펴본 뒤 Spring의 Bean Validation을
13 min read
Kafka Selector: 컨슈머에 활용
Tech Kafka

Kafka Selector: 컨슈머에 활용

지난 5편의 Selector 글에서 과정 자체는 대략적으로 설명하였으나, 여전히 ‘이걸 어떻게 활용할 수 있을까?’라는 의문이 존재합니다. 이번 글에서는 이 의문에 대한 답을 위해 다음의 내용을 다뤄볼 예정입니다. 1. Spring Kafka가 아닌 직접 구현한 Consumer를 이용하여 이전 4편에서의 가설에 대한 테스트를 진행합니다. 2. Selector의 poll() 과정에서 기록되는 몇 가지 메트릭을
14 min read
잊고 있던 소중함
Thoughts

잊고 있던 소중함

오늘은 예비군을 다녀왔다. 지난 3월에 받은 3박4일 동미참 훈련과 달리 오늘은 단 하루만 하는 학생 예비군 훈련이기에 이제는 하루라는 시간조차 아깝지만 그래도 동미참보단 낫지... 라는 생각으로 별생각 없이 갔다. 유일한 흠은 내 자취방인 강북구 수유동에서 남양주 금곡 훈련장까지 편도 1시간 30분 정도가 걸린다는 것이다. 별생각 없이 간 것이지 그다지 좋은
6 min read
모든 것은 생각하기 나름
Thoughts

모든 것은 생각하기 나름

정말 오랜만에 친구들(정확히는 동생들이지만..)과 술을 마셨다. 맥주는 집에서 가끔 한 캔씩 마셨으니 정확히는 소주를 마신 것이고, 3주 만에 만나서 마시는 거니 '정말 오랜만'이라고 할 정도는 아니라고 할 수 있으나 한창때는 주에 2번은 새벽까지 마셔댔으니 정말 오랜만이라고 할 법하다. 학교라는 비슷한 일상을 살아가던 예전과 달리, 한
5 min read
Kafka Selector: Poll
Tech Kafka

Kafka Selector: Poll

Selector 과정을 이해하는 것이 어떤 도움을 줄 수 있을까요? 지난 글에서 다룬 소켓 버퍼의 크기 등을 제외하면, 사실 사용자가 크게 수정할 부분이 없기는 합니다. 그럼에도 Selector의 과정을 공부하며 제가 느꼈던 것은, 프로듀서와 컨슈머의 이해도를 높일 수 있고, 카프카의 구현 방법 자체에서 아이디어를 얻어간 것이 있다는 것입니다. 아이디어를 얻어간 예시 중
27 min read
Kafka Selector: NetworkReceive / Application Buffer for SSL
Tech Kafka

Kafka Selector: NetworkReceive / Application Buffer for SSL

카프카 클라이언트를 사용할 때, 모든 메시지를 평문(PlainText)로 전송하는 것은 인증이나 추가적인 Handshake에서 오는 오버헤드를 줄일 수 있어 성능 면에서는 유리할 수 있으나, 보안이 필요한 곳에서는 PlainText가 아닌 SSL이나 SASL 방식을 사용할 것입니다. Selector에서 마지막으로 다뤄볼 poll() 과정에서는 keysWithBufferedRead 라는 SelectionKey 컬렉션 필드를 사용하고 있고, 이 컬렉션에 데이터가 있는지로
9 min read
Kafka Selector: Connection / KafkaChannel
Tech Kafka

Kafka Selector: Connection / KafkaChannel

카프카의 프로듀서, 컨슈머는 내부적으로 각각 Sender와 KafkaConsumer에서 NetworkClient를 호출하고, 실제 네트워크 I/O 작업은 NetworkClient가 Selector를 호출하면서 시작됩니다. 정확히는, 컨슈머는 ConsumerNetworkClient를 호출하고 여기서 NetworkClient를 호출합니다. 카프카에서는 기존의 NIO Selector와 SelectionKey를 기반으로 자체 구현한 Selector와, SocketChannel을 기반으로 자체 구현한 KafkaChannel을 사용합니다. 위 그림을 보면 SelectionKey와 SocketChannel은 얼핏 보면 순환참조처럼 느껴지는 것
20 min read
Kafka Selector: Java NIO
Tech Kafka

Kafka Selector: Java NIO

하나의 시스템이 자체적으로 모든 작업을 수행할 수 있다면 좋겠으나, 대부분의 시스템은 외부와 데이터를 주고받으며 동작합니다. 물론, 하나의 시스템을 여러 컴포넌트로 구성할 수 있겠으나 이 경우 특정 컴포넌트가 SPOF(Single Point Of Failure)가 될 위험이 존재합니다. 따라서 장애 발생을 대비하기 위해 이 컴포넌트들을 분리하는 것이 필요하며, 이렇게 분리된 각 컴포넌트들이
14 min read
Kafka Selector: Buffer / TCP
Tech Kafka

Kafka Selector: Buffer / TCP

카프카는 비동기적으로 작동하고, 사용자가 코드를 작성하는 부분은 실제 전송보다 ‘전송 요청’에 가깝습니다. 즉 프로듀서와 컨슈머를 정확하게 이해하고, 모니터링과 최적화 포인트를 잡기 위해서는 눈에 보이는 부분과 보이지 않는 부분을 이해할 필요가 있겠습니다. 이번 Selector 시리즈에서는 카프카에서의 네트워크 I/O 작업이 이뤄지는 카프카의 Selector 클래스를 알아볼 예정이며, 이번 글과 다음 글에서는
13 min read
론 뮤익이 표현하는 삶
Thoughts

론 뮤익이 표현하는 삶

전시는 평균적으로 한 달에 한 번정도는 보러 갔던 것 같다. 전시는 내가 예술적인 인간이라서가 아니라, 하나의 피사체를 다양한 각도에서 관찰하고, 정답보다는 다양한 생각을 하며 생각의 폭을 넓혀간다는 관점에서 좋아 하고, 그래서 혼자 가는 것을 선호한다. 하지만 삶이 바쁘고 여유가 없을 때 가장 내려놓기 쉬운 취미생활은 아마도 '문화 / 예술'
9 min read
Grafana Alloy: 쿠버네티스에서의 초기 배포부터 개선까지
Tech Alloy

Grafana Alloy: 쿠버네티스에서의 초기 배포부터 개선까지

이번 글에서는 지난 글의 내용을 바탕으로 쿠버네티스에서의 설정 방법을 알아보겠습니다. 공식 문서에 있는 가장 기본적인 설정 방법부터 시작하여 제가 느낀 불편과 그 개선 방안을 작성합니다. 따라서 이 글은 지난 두 개의 글보다 제 주관이 더더욱 담겼다는 것, 즉 이 글의 내용은 Best-Practice가 아니라는 것을 참고해주시면 감사하겠습니다. alloy-configurationGrafana Alloy 설정 파일상돌허브pricelees
15 min read
Grafana Alloy: 컴포넌트 설정 적용
Tech Alloy

Grafana Alloy: 컴포넌트 설정 적용

이번 글에서는 만들어진 컴포넌트를 설정에 반영하는 방법과, Alloy UI에서 이를 확인하는 방법을 알아봅니다. 컴포넌트는 지난 글에서 만들었던 아래 코드의 내용을 그대로 사용하며, 이름만 기존 "abcde"에서 조금 더 의미 있는 이름으로 수정하였습니다. discovery.kubernetes "kube_system_pods" { role = "pod" namespaces { names = ["kube-system"
7 min read
Grafana Alloy: 컴포넌트 구조
Tech Alloy

Grafana Alloy: 컴포넌트 구조

로그 저장소로 Grafana Loki를 사용하시는 분들은 대부분 Promtail과 함께 사용하시는 것 같습니다. 하지만 Promtail의 지원 기간이 얼마 남지 않았고, Grafana에서는 Alloy로의 마이그레이션을 지원하는 만큼 Alloy의 사용도 점차 많아질 것이라 생각됩니다. Promtail agent | Grafana Loki documentationHow to use the Promtail agent to ship logs to LokiGrafana Labs 저는 이번에 개인용 서버의
10 min read