Backend with Golang 28

[Docker] Storage: volumes vs bind mounts

Container 안에서 생성된 모든 파일들은 writable container layer에 저장된다. 이것은 아래와 같은 사실들을 의미한다. - 컨테이너가 사라지면 이 데이터들은 유지되지 않는다, 또한 이 데이터들을 다른 프로세스에서 사용하려고 할 때 꺼내기가 쉽지 않다. - container의 writable layer는 host machine과 tight하게 커플링 된다. 데이터를 어디론가 이동시키는 것은 쉽지 않다. 어떤 방식으로 mount 되는가에 상관 없이 data는 컨테이너 안해서 똑같이 보인다. 하지만 방식 자체는 여러개가 있는데 이 글에서는 그 세가지에 대해서 간략히 다뤄보고자 한다. Volumes : docker에 의해 관리되는 host filesystem (/var/lib/docker..

Backend with Golang 2024.03.21

Channel of Channel [번역]

https://qiita.com/hogedigo/items/15af273176599307a2b2 chan chan は意外と美味しい - Qiita すっかり寒くなってきてチャンチャン焼きが美味しい今日この頃ですね(^_^)ところで、Go言語でchannelをchannelで受け渡し出来ること、ご存知でしょうか。自分の周囲では使っている人少な… qiita.com 1. 요청 / 응답 채널을 이중으로 설정해서 응답을 받을 수 있다. error를 받고 싶은 경우, chan chan error를 사용한다. 요청을 보낼 때 channel of channel 에 error channel을 넣어서 보내면 그 채널에 처리된 결과를 넣어주게 되면, 요청을 처리한 후의 결과를 받을 수 있게 된다. 2. 처리 대기 Request / Response..

Backend with Golang 2023.11.21

CORS (Cross-Origin Resource Sharing)

한 출처에서 실행중인 웹 어플리케이션이 다른 출처의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다. , , , 태그의 경우 cross-origin 정책을 지원하며, image의 경우 다른 사이트의 png, jpg 등의 리소스에 접근하는 것이 가능하다. fetch api 등을 사용해서 javascript를 사용해서 요청을 보내는 경우엔, 다른 도메인 서버에 있는 자원을 가져오려고 할 때 에러가 난다. 기본적으로 same origin policy 를 따른다. 동일한 출처에서만 리소스를 공유할 수 있다를 의미한다. 동일 출처가 아닌 경우 접근을 차단하는 이유는? 기존 웹 브라우저는 하나의 서버에 요청해서 서버가 HTML을 반환해주는 동작을 했었기 때문에 다른 도메인에서 접근하는 것은 ..

Backend with Golang 2023.11.18

[Concurrency in Go] 비정상 고루틴의 치료 (steward & ward)

Background long-lived process의 경우, Goroutine 여러개를 들고 있을 수 있다. 고루틴들은 데이터가 들어올 때까지 기다리며 block되기 때문에 그들은 wakeup, do their work, pass data on을 할 수 있어야 한다. 하지만 control하기 어려운 resource들에 대해서 의존성이 있을 수 있다. 예를 들면 webservice에서 data를 끌어올수도 있고 어떤 일시적인 파일에 대해서 monitoring을 할수도 있다. 이런 경우 고루틴은 bad state에 쉽게 stuck될수도 있고, external help에 의해서가 아니면 회복이 불가능하다. 고루틴이 healthy한 상태로 남아있도록 보장하는 mechanism을 만들수 있는데, 이때 unhea..

Backend with Golang 2023.11.10

[MySQL] Update Data in Batches

How to update data in batches IN : 특정 값 여러개를 선택하기 위해서 사용되는 연산자이기 때문에, updated result가 하나로밖에 안되는 한계점이 있다. Update users Set status=1 Where account IN ('xx1', 'xx2') : 만약 여기서 1이 아니고 몇개는 1, 다른 몇개는 2 로 바꾸고 싶을 때 IN을 사용해서 하나의 statement 로는 불가능하고, 여러개의 SQL statement로만 가능하다. For + UPDATE : for loop + update statement intuitive, 거의 대부분의 상황에 적용 가능하며, 실수가 잘 일어나지 않는다. 하지만 단점으로는 performance가 별로다. INSERT INTO ...

Backend with Golang 2023.09.19

[Concurrency-6] Or-done channel

값이 들어오는 channel이 있을 때 단순하게 for range 문을 사용해서 그 채널에서 값을 받아오게 되면, done채널을 사용해서 취소하기가 쉽지 않다. 그렇기 때문에 아래와 같이 for 와 select 문을 함께 사용한다. 기존에 4번 글(https://sea-green.tistory.com/25 )에서 다뤘던 부분 중 Done channel이 닫히기 전까지 무한루프를 돌며 작업을 수행하는 코드이다. done 채널을 포함한 select 문을 사용하는 것이다. //1. for { select { case

Backend with Golang 2023.09.14

[Concurrency-5] Fan-Out, Fan-In

Best Practices for constructing Pipelines(이어서) Generator: data set을 stream of data on a channel 로 만드는 것이다. channel을 사용함으로써 함수를 사용해서 할 때와 다른 점은 value를 추출하기 위해서 range statement 를 사용할 수 있고, 이를 통해 안전하고 concurrent 하게 사용할 수 있다. 이렇게 각각의 value들뿐만 아니라 pipeline 단계 별로도 concurrent 하다. 단계가 독립적으로 실행된다고 보면 된다. 예시에서 나오는 stage들은 공통으로 사용하는 done channel과 다음 스테이지로 전달되는 channel 에 의해서 interconnected 되어 있다. preemptabl..

Backend with Golang 2023.09.12

Rate Limiting

Rate limiting - concurrency in go Why do we need Rate Limiting? malicious users can access your system as quickly as their resources allow it. -> they can do all kinds of things 악의적이지 않더라도, 큰 볼륨으로 operation을 수행하거나, 실행하려는 코드가 buggy하다면, performance를 저하시킬수 있다. 일반적으로 서비스에서는 어느정도의 성능을 지속적으로 유지할 수 있다는 것을 보증하고 싶어하고, 한명의 유저라도 그 agreement에 영향을 받는다면 좋지 않은 결과를 낳는다. 일반적으로 유저들은 시스템에 대한 자신들의 접근이 sandboxed되어 있..

Backend with Golang 2023.09.06