최신 글
-
Kafka 신뢰성 있는 카프카 애플리케이션을 만드는 3가지 방법 카카오 공개 기술 세미나인 kakao tech meet에서 '신뢰성 있는 카프카 애플리케이션을 만드는 3가지 방법' 에 대해 발표하는 자리를 가졌습니다. https://www.youtube.com/watch?v=7_VdIFH6M6Q 이벤트 드리븐 아키텍처와 스트림 데이터 파이프라인을 만들때 고민해야 하는 부분을 다룹니다. 프로듀서/컨슈머와 같은 카프카 애플리케이션의 전달 신뢰도를 높이기 위해서 적용할 수 있는 기술들에 대해 설명하고 내부적으로 적용했던 경험을 공유합니다. 카프카에서 다루는 신뢰도에 대해 다시 한 번 고민해보고, 내가 만든 애플리케이션이 고객에게 어떻게 가치를 줄 수 있는지 생각해볼만한 주제도 함께 알려드립니다.
-
Kafka 카프카 프로듀서의 acks=all 옵션은 사실(?) 느리지 않다! 카프카 3.0 부터는 카프카 프로듀서의 acks 옵션이 all로 지정됩니다. acks=all이 기본값으로 지정된 이유 중 하나는 프로듀서와 브로커 간 통신을 멱등성(idempotence)있게 만들기 위함입니다. 프로듀서와 브로커는 acks를 통해 레코드가 전송되었는지 확인합니다. 문제는 acks가 유실되었을 경우입니다. 네트워크 상태, 브로커 상태에 따라서 언제든 유실될 수 있는 acks를 정상적으로 전송하기 위해서는 acks를 위한 acks(!)를 만들어야만 합니다. 이는 두 장군 문제 알고리즘과 동일하다고 볼 수 있습니다. 결과적으로 프로듀서의 중복 전달을 제거하기 위해 카프카 3.0부터는 enable.idempotence가 true로 변경되었고 이에 딸려오는 추가 옵션인 acks가 all로 설정되게..
-
Kafka 기존에 생성된 compact topic의 cleanup.policy를 변경하는 방법 현재 cleanup.policy 확인 $ ./kafka-topics.sh --bootstrap-server localhost:9092 --topic compact- test --describe Topic: compact-testPartitionCount: 1ReplicationFactor: 1Configs: cleanup.policy=compact,segment.bytes=1073741824 Topic: compact-testPartition: 0Leader: 0Replicas: 0Isr: 0 kafka-configs.sh를 사용하여 토픽 수정 $ ./kafka-configs.sh --bootstrap-server localhost:9092 --alter --entit y-type topics --ent..
-
Kafka Compacted topic에 null key 레코드를 전송하면? Compacted topic에 null key를 전송(produce)하면 어떻게 될까요? 1) Compacted 토픽 생성 $ ./kafka-topics.sh --bootstrap-server localhost:9092 --topic compact-test --config "cleanup.policy=compact" --create Created topic compact-test. $ ./kafka-topics.sh --bootstrap-server localhost:9092 --topic compact-test --describe Topic: compact-testPartitionCount: 1ReplicationFactor: 1Configs: cleanup.policy=compact,segment.b..
-
Kafka 아파치 카프카 Exactly-once 처리의 진실과 거짓 아파치 카프카와 같은 분산 이벤트 스트리밍 플랫폼을 사용하거나 메시지 브로커를 활용하다 보면 항상 마주치는 문제는 마로 메시지 전달 시멘틱(message delivery semantic)입니다. 메시지 전달 시멘틱은 A지점에서 B지점으로 데이터를 전송할 때 어느 만큼의 신뢰도로 데이터를 전송하는지에 대한 정의입니다. 즉, 특정한 장애 상황(또는 임계치를 벗어난 상황)에서도 보증하는 데이터 전달 신뢰도라고 볼 수 있습니다. 메시지 전달 시멘틱은 크게 세가지로 나뉩니다. 적어도 한번(at least once), 많아도 한번(at most once), 정확히 한번(exactly once). '적어도 한번'은 데이터가 전달될 때 유실이 발생하지는 않지만 중복이 발생할 가능성이 있음을 뜻합니다. 아파치 카프카는 ..
-
개발이야기 [개발자를 넘어 기술 리더로 가는 길]읽고 정리 타냐 라일리 https://www.linkedin.com/in/tanyareilly/ 타냐 라일리는 중간급 엔지니어가 되었을 때 매니저가 되고 싶지 않았고 '스태프 엔지니어의 길'로 가고 싶었다. 기술 전략 수립, 조직을 성공적으로 이끌기 위한 방법에 대해 고민했고 이에 대한 내용을 정리했다. 두 가지 진로 개발자는 크게 두가지 진로가 있다. 1) 매니저 - 명확하게 소통 - 위기 상황에서 침착함 유지 - 동료들이 더 나은 일을 할 수 있도록 도움 - 많은 사례들이 나와 있음 2) 스태프 엔지니어(기술 리더) - 불분명한 길 타냐 라일리가 생각하는 스태프 엔지니어의 필요한 역할 3가지 1) 빅 픽처 관점의 사고력 : 현재 상황에 대해 인지하고 기업에 필요한 것이 무엇인지 파악하여 n년 단위 프로젝트 진행..
-
Kafka 모던 데이터 플로우: 데이터 파이프라인을 잘 운영하는 방법 https://www.confluent.io/events/kafka-summit-london-2022/modern-data-flow-data-pipelines-done-right/ Kafka Summit London 2022 Keynote | Jay Kreps, CEO, Confluent featuring Avi Perez, Wix.com Confluent is building the foundational platform for data in motion so any organization can innovate and win in a digital-first world. www.confluent.io 메이븐에서 카프카 자바 라이브러리의 사용율이 급격하게 올라가는 것을 볼 수 있음. 그만큼 카프카의 사..
-
golang golang struct type을 JSON으로 Print 하기 package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int } func main() { myStruct := Person{"dvwy", 145} fmt.Println("=======") fmt.Println(myStruct) fmt.Println(prettyPrint(myStruct)) } func prettyPrint(i interface{}) string { s, _ := json.MarshalIndent(i, "", "\t") return string(s) } 결과는 다음과 같습니다. {dvwy 145} { "Name": "dvwy", "Age": 145 } 출처 : https://stackoverflo..
-
Kafka 아파치 카프카 브로커 설정에서 listener와 advertised.isteners의 차이? Kafka 브로커의 설정에서 listener와 advertised.listeners 옵션은 다음과 같은 특징이 있다. listener는 Kafka 브로커가 클라이언트로부터 듣고있는 네트워크 인터페이스와 포트를 나타낸다. 예를 들어, listener를 PLAINTEXT://localhost:9092로 설정하면 브로커는 localhost의 9092 포트에서 PLAINTEXT 프로토콜을 사용하여 들어오는 클라이언트 연결을 수신한다. advertised.listeners는 Kafka 브로커가 클라이언트에게 알려주는 네트워크 인터페이스와 포트를 나타낸다. 클라이언트는 이 정보를 사용하여 브로커에 연결한다. 이 정보는 일반적으로 브로커가 외부에 노출되는 경우 사용된다. 예를 들어, advertised.listene..
-
Java & Scala spring boot HttpServletRequest 사용 쿠키 구현시 HttpSession.getAttribute(String) is null 에러 발생 대응 spring boot에서 쿠키/세션 로그인 기능 구현시 다음과 같은 에러를 만났습니다 ...HttpSession.getAttribute(String)" is null 분명히 다음과 같이 attribute를 제대로 설정했는데 왜그랬을까요? HttpSession session = request.getSession(true); session.setAttribute("LOGIN_MEMBER", 123); 이유는 다음과 같습니다. 제가 가진 특수한 상황 때문이였는데요. - server : localhost:8080 - client : localhost:3000 - client는 server로 axios 요청을 함 위 상황은 여러가지 문제가 있었고 해결방안은 다음과 같습니다. 1) CORS 문제 크로스 도메인에 대..
인기글
-
하둡 Hdfs dfs 명령어 정리 및 설명(ls, cat, du, count, copyFromLocal 등) Hadoop을 적절히 사용하기 위해서는 hdfs 명령어를 알아야 한다. 아래에 정리를 해 보았다. ※ 2.6.0 version을 기준으로 정리함 Hadoop 명령어 Hadoop filesystem command를 사용하기 위함. Usage : hdfs dfs [GENERIC_OPTIONS] [COMMAND_OPTIONS] HDFS 명령어 File System(FS) shell은 Hadoop Distributed File System(HDFS)를 여타 파일시스템처럼 관리하기 위한 목적으로 command를 사용할 수 있다. Hadoop-2.6.0에서는 총 33개의 HDFS 명령어를 지원한다. 1) appendToFile Local 파일들을 hdfs에 append 저장하기 위한 목적 Usage: hdfs df..
-
개발이야기 결혼식 청첩장 Github blog로 세련되게 만들기. 후기! 2019년 5월 18일. 이날은 여자친구와 4년 그리고 1일 되는날, 그리고 결혼식이 열렸던 날이다. 결혼식을 준비하면서 만든 github.io blog기반 모바일 청첩장을 만들게 된 이유와 만들기까지의 과정에 대해 이야기 하고자 한다. 결혼식을 위해 뼈발자(뼈속까지 개발자)인 나는 어떻게 결혼식을 준비하는데 있어 실력을 발휘할까 고민하던 도중 모바일 청첩장을 직접! 만들어보면 어떨까 아이디어를 생각하였다. 모바일 청첩장을 직접 만들고자 한 이유는 아래와 같았다. 첫째. 바른x, 더카x 등 종이 청첩장을 만들어주는 사이트의 디자인이 마음에 안든다. 둘째. 무료로 청첩장을 만들어 주는 사이트는 시간이 지나면 만료되어 더이상 조회가 불가능하다. 셋째. 선물 예약 기능. 친구들에게 필요한 선물을 알려주고 예약..
-
servlet container [linux] netstat 명령어 설명 및 예제 netstat 소개netstat(network statistics)는 전송 제어 프로토콜, 라우팅 테이블, 수많은 네트워크 인터페이스(네트워크 인터페이스 컨트롤러 또는 소프트웨어 정의 네트워크 인터페이스), 네트워크 프로토콜 통계를 위한 네트워크 연결을 보여주는 명령 줄 도구이다. OS X, 리눅스, 솔라리스, BSD를 포함한 유닉스 계열 운영 체제와 윈도우 XP, 윈도우 비스타, 윈도우 7, 윈도우 8, 윈도우 10을 포함한 윈도우 NT 기반 운영 체제에서 이용이 가능하다. 네트워크의 문제를 찾아내고 성능 측정으로서 네트워크 상의 트래픽의 양을 결정하기 위해 사용된다.리눅스에서 net-tools의 일부인 netstat은 시대에 뒤쳐진 것으로 간주되며, iproute2의 일부인 ss를 대신 사용하여야 한..
-
JS & JQuery jqeury 스크롤 내리다가 특정 영역(부분) 이벤트 발생시키기 웹을 개발하다가 보면 스크롤을 내리다가 특정부분이 되면 혹은 특정 div가 나오게 되면 이벤트를 발생시키고 싶어 할 때도 있다. 아닐때도 있고, 갑자기 하고싶을 때도 있다. 이때 아래와 같이 사용하게 되면 이벤트를 딱 한번만 발생을 시킬 수 있다. HTML scroll down to see the div CSS body, html { height: 100%; } #wrapper { height: 400%; background: none repeat scroll 0 0 #f99ccc ; text-align:center; padding-top:20px; font-size:22px; } #tester { padding-top:1200px; height: 600px; background: none repeat ..
-
JS & JQuery [JavaScript]변수내용이 json인지 확인하는 method(check valid json) js에서 사용하고 있는 variable이 json인지 여부를 확인하고 싶을때가 있다. npm을 사용한 여러 library를 사용하는 방법도 있지만 아래와 같이 간단한 method를 활용하는 방법도 있다. function IsJsonString(str) { try { var json = JSON.parse(str); return (typeof json === 'object'); } catch (e) { return false; } } JSON.parse(str) 메서드 ECMAScript 2015의 standard method이다. JSON.parse(str)는 json의 문자열 구문을 분석하고 들어온 파라미터를 js값이나 객체로 생성한다. 이때 정상적인 json type이 아닌경우 exception을 반..
-
Java & Scala JVM 기반 애플리케이션 운영시 스레드 덤프를 통한 이슈 해결 JVM기반 애플리케이션을 개발하다가 이슈가 생겼을때 다양한 방식으로 이슈를 확인하고 처리할 수 있습니다. 그중 한가지인 스레드 덤프를 사용하여 이슈를 해결한 사례를 공유하겠습니다. 제가 운영하고 있는 애플리케이션은 Scala로 이루어져 있고 JDK 1.8에서 돌아가는 Multithread application입니다. 카프카 컨슈머를 스레드로 작게는 10개 많게는 100개이상 띄워서 운영하고 있습니다. 이 애플리케이션은 안전하게 중지하기 위해 Shutdown hook을 받도록 개발했습니다만, 언제부턴가 Shutdownhook을 통해 중지요청을 하더라도 애플리케이션이 중지하는 절차를 진행하지 않는 현상이 발생했습니다. 또다시 shutdown hook을 kill -term 명령어와 함께 명령내렸으나 응답이 없..
-
Kafka 신뢰성 있는 카프카 애플리케이션을 만드는 3가지 방법 카카오 공개 기술 세미나인 kakao tech meet에서 '신뢰성 있는 카프카 애플리케이션을 만드는 3가지 방법' 에 대해 발표하는 자리를 가졌습니다. https://www.youtube.com/watch?v=7_VdIFH6M6Q 이벤트 드리븐 아키텍처와 스트림 데이터 파이프라인을 만들때 고민해야 하는 부분을 다룹니다. 프로듀서/컨슈머와 같은 카프카 애플리케이션의 전달 신뢰도를 높이기 위해서 적용할 수 있는 기술들에 대해 설명하고 내부적으로 적용했던 경험을 공유합니다. 카프카에서 다루는 신뢰도에 대해 다시 한 번 고민해보고, 내가 만든 애플리케이션이 고객에게 어떻게 가치를 줄 수 있는지 생각해볼만한 주제도 함께 알려드립니다.
-
Kafka 레디슈 큐(queue), 레디스 스트림(streams), 레디스 펍섭(pub/sub) 그리고 카프카와 비교 레디스란? 레디스는 오픈소스 인 메모리 데이터 구조 저장소로서 데이터베이스, 캐시, 메시지 브로커로 역할을 수행한다. 레디스는 String, hash, lists, sets, sorted sets, bitmaps, streams등을 지원한다. 레디스 큐란? 레디스 큐는 레디스의 자료구조 중 List를 이용하여 Queue를 구현한 것이다. 큐는 FIFO(First In First Out)구조로 먼저 들어온 데이터가 먼저 처리되는 것이다. LIST자료구조의 LPUSH, RPOP(또는 RPUSH, LPOP)을 사용하여 구현할 수 있다. 이외에도 BLPOP을 사용하여 블락킹(blocking) pop을 수행할 수 있다. 지정한 시간만큼 기다리고 값이 들어오면 LPOP을 수행하는 것이다. $ lpush my-que..
-
Java & Scala Java 시큐어 코딩 - 공격 종류 및 해결방안 1. SQL injection 취약점 발생 원인외부입력값을 동적으로 SQL실행문을 만들어서 사용할때 주로 나타남. /* SQL injection에 취약한 코드*/ String userId=request.getParameter("userId"); String password=request.getParameter("password"); ... Statement stmt = conn.createStatement(); ResultSet result = stmt.executeQuery("select count(*) as count from student where userid='"+userId+"' and password='"+password+"'"); userid에 admin' OR '1'='1 을 입력하면 그..
-
개발이야기 NAT IP란? NAT는 Network Address Translation의 줄임말 입니다. NAT는 사설 네트워크에 속한 여러 개의 호스트가하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위해 사용합니다. 쉽게말해서 외부망과 내부망을 나눠주는 기능을 하게 되는 것입니다. NAT 특징 - 내부에서 외부로 통신 가능 - 외부에서 내부로 통신 불가 NAT 장점 - 여러 사설 네트워크를 사용함으로서 인터넷 공인 IP 주소를 절약 가능. - 사내망 IP주소를 외부로 알리지 않음으로서 외부로 부터의 침입/공격 차단 NAT 단점 - 네트워크 복잡성 증가 - 네트워크 지연 영향 NAT 종류 - Static NAT : 사설IP와 공인 IP를 1:1 매핑 - Dynamic NAT : 다수 공인 IP와 다수 사설 IP 매핑 - PAT..
728x90