목록전체 글 (251)
호랑이한테물릴래

멀티 컨테이너 파드는 아주 유용하다. 대체로 파드에 하나의 컨테이너만 생성하는 편이지만, 파드에 여러 컨테이너를 추가하면서 얻을 수 있는 장점이 많다. 컨테이너를 동일한 노드에서 관리해야하는 프로세스가 필요하거나, 파드의 컨테이너간 통신이 필요한 경우 멀티컨테이너의 역할이 요구된다. 여기서 멀티컨테이너는 3가지 패턴이 있는데 아래와 같다. 사이드카 패턴(Sidecar) 사이드가 패턴은 어플리케이션에 필수적이지만, 어플리케이션의 일부일 필요가 없는 컨테이너로 구성된다. 대체로 Logging이나 Sync를 맞추거나 혹은 monitoring이 필요한 경우에 많이 사용하는 패턴이다. 이 패턴은 로깅 코드에 결함이 생길 경우에 격리된 컨테이너기 때문에 어플리케이션에 영향을 주지 않는다는 장점이 있다. 어댑터 패턴..

도커를 실행할 때, ENTRYPOINT와 CMD를 활용해서 명령어의 인자값을 컨테이너 실행시에 전달하고 수정할 수 있다. 쿠버네티스에서도 Pod 정의에서 활용이가능하다. Kubernetes Command & args 왼쪽은 Dockerfile에서 선언된 ENTRYPOINT와 CMD다. 오른쪽 POD 정의에서 command는 ENTRYPOINT의 필수 실행 명령을, args를 통해서 인자값을 전달할 수 있게된다. Configmap 환경변수를 미리 선언하고 관리할 수 있는 Kubernetes Configmap을 이용하면 많은 인자값 관리가 편리해진다. 위처럼 ConfigMap을 Key:Vaule 식으로 먼저 정의를 한다. 적용할 Pod에서 spec.containers.envFrom.configMapRef.n..
내가 구현한 블록체인과 통신할 수 있는 CLI를 구현해본다. flag를 사용해서 port와 사용할 mode를 설정한다. package cli import ( "flag" "fmt" "os" ) func usage() { fmt.Printf("This is vatacoin\n\n") fmt.Printf("Please use the following flags:\n\n") fmt.Printf("-port:Set the PORT of the server\n") fmt.Printf("-mode:Choose between 'html' and 'rest'\n\n") os.Exit(0) } func Start() { if len(os.Args) == 1 { usage() } port := flag.Int("port"..
REST API를 GO로 구현해서 blockchain부터 특정 block을 확인하고, 추가할 수 있도록 해본다. package rest import ( "encoding/json" "fmt" "log" "net/http" "strconv" "github.com/gorilla/mux" ) var port string type url string func (u url) MarshalText() ([]byte, error) { url := fmt.Sprintf("http://localhost%s%s", port, u) return []byte(url), nil } type urlDescription struct { URL url `json:"url"` Method string `json:"method"` De..

이전에는 main.go에 모든 함수를 때려넣어서 구현했지만, func의 기능도 세분화해서 만들어보려고 한다. main.go # main.go package main import ( "fmt" "github.com/test/blockchain" ) func main() { chain := blockchain.GetBlockchain() chain.AddBlock("Second Block") chain.AddBlock("3 Block") chain.AddBlock("4 Block") for _, block := range chain.AllBlocks() { fmt.Println("Data: ", block.Data) fmt.Println("Hash: ", block.Hash) fmt.Println("Prev..

Golang x Blockchain 블록체인의 구조에 대해서 이해하더라도, 직접 코드로 구현해보는 것만큼 좋은게 없다. 이더리움도 Go로 개발할 정도로, Go는 빠른 처리속도를 자랑하기 때문에 다양한 블록체인 프로젝트에 Golang이 많이 사용된다. 간단한 구조로 구현해보고 개념도 학습해보자. Block 블록은 블록체인의 가치있는 정보를 저장하는 매개체다. 비트코인의 경우엔 트랜잭션같은 거래내역들이 저장된다. 외에도 version, timestamp, hash 들이 저장되어 개별 블록이 구분되고 연결될 수 있다. 블록의 기본적인 구성은 아래와 같다. type Block struct { Timestamp int64 Data []byte PrevBlockHash []byte Hash []byte } Time..
Geth(Go Ethereum)은 Go로 개발된 Ethereum client다. JSON-RPC를 이용해서 이더리움 콘솔에 접속할 수 있는 환경을 제공한다. + JSON-RPC? JSON으로 인코딩된 원격 프로시저 호출이다. 매우 간단한 프로토콜로, 소량의 데이터 타입과 명령어들만으로 정의한다. JSON-RPC는 알림을 허용하고, 다수의 호출이 서버로 전송되고 순서없이 응답한다. 참고 자료 : https://www.getoutsidedoor.com/2019/08/10/%EC%99%9C-json-rpc%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C/ 기본적으로 Geth를 이용해서 Ethereum wallet 정보와, state를 확인할 수 있다. Geth 설치방법 $ s..

컨슈머의 주요 역할은 카프카에 저장된 메시지를 당겨오는 것이다. 메시지를 당기는데 중요한 요소인 오프셋과 그룹 코디네이터, 파티션 할당 전략을 간단히 정리해보려고 한다. 1) 오프셋 (Offset) 오프셋 관리는 컨슈머의 동작 중에 핵심이라고 볼 수 있다. 컨슈머는 카프카에 저장된 메시지를 꺼내기 때문에 컨슈머가 메시지를 어디까지 가져왔는지를 표시하고 확인하는 것은 중요하다. 여기서 메시지의 위치를 나타내는 것을 오프셋이라고 한다. 이 오프셋은 숫자 형태로 저장된다. 컨슈머 그룹은 오프셋 정보를 카프카의 토픽에 저장한다. (__consumer_offsets 토픽에 각 컨슈머 그룹 별 오프셋 위치 정보가 기록됨) 2) 그룹 코디네이터(Group Cordinator) 컨슈머 그룹에서 컨슈머들은 속한 컨슈머 ..

Producer 카프카의 토픽은 병렬처리가 가능하기 위해서 파티션으로 나뉘어, 최소 하나 이상의 파티션으로 구성된다. 그리고 프로듀서가 카프카로 전송한 메시지는 토픽 내 각 파티션의 로그 세그먼트에 저장된다. 그래서, 프로듀서는 토픽으로 보낼 때 토픽의 어느 파티션으로 메시지를 보내야할 지 결정해야하고 이 때 사용하는 것이 '파티셔너(Partitioner)'다. 그래서 파티션의 증가에 따라 관리자의 의도와 다르게 메시지 전송이 이뤄질 수 있기 때문에 되도록 파티션 수를 변경하지 않는 것이 좋다. 파티셔닝 방법 2가지 레코드들은 배치 처리를 위해서 프로듀서의 버퍼 메모리 영역에서 잠시 대기한 후에 카프카로 전송된다. 이 때 크게 두가지전략을 고려할 수 있다. 1) 라운드 로빈 전략 키 값을 지정하지 않은 ..
Producer와 Consumer는 Python으로 테스트, Broker와 Zookeeper는 Docker로 올려본다. 서버를 EC2로 올리는 건 비용이 들기 때문에 간단한 테스트용으로 추천한다. (Confluent-Kafka는 개발이 활발하고 다른 버전들보다 여러면에서 스펙이 가장 뛰어나기 때문에 Confluent버전을 사용함) 1) Confluent-kafka 설치 $ pip install confluent-kafka (consumer와 producer 어플리케이션을 위해) 2) Broker와 Zookeeper docker-compose로 올리기 # docker-compose.yml --- version: '3' services: zookeeper: image: confluentinc/cp-zooke..