전체 글
-
Redis는 왜 다른 DB보다 빠를까개발 2023. 3. 16. 16:20
Redis 는 크게 4가지 측면에서 MySQL 같은 전통 RDB와 차이점이 있다. In Memory Storage 다른 데이터베이스는 disk 에다가 데이터를 저장하고 읽는 반면 레디스는 데이터를 메모리에 저장한다. 디스크에 비해 메모리는 입출력 속도가 훨씬 빠르다. Data Structure 레디스는 string, hash, list, set, sorted set 으로 작업하기 위해 만들어졌다. 이 데이터 구조는 성능에 효율적이고 레디스가 읽고, 쓰고, 조회하는 것을 빠르게 한다. 그리고 자료 구조를 효율적으로 이용해서 레디스는 메모리 공간을 절약하고 동작에 시간 복잡도를 줄인다. 실제로 레디스는 리스트의 push/pop을 크기와 상관 없이 O(1) 시간에 처리할 수 있다. 그리고 레디스는 교집합이든 ..
-
single threaded vs multi threaded개발/기술 2023. 3. 16. 16:15
싱글 쓰레드 시스템은 쓰레드 하나로 시스템을 구성하는 방식이고 멀티 쓰레드 시스템은 두개 이상의 쓰레드를 이용해서 프로그램을 구성하는 것을 말한다. 멀티 코어가 대세인 하드웨어 환경이라면 쓰레드를 늘려서 시간당 작업량을 늘리는게 당연히 좋지 않을까 하는 생각이 들겠지만 구조마다 장/단점이 있다. Single Thread 특징 Simplicity: 쓰레드가 하나만 있기 때문에 간단한 아키텍처를 구항할 수 있다. 개발하고 배포하고 유지하기가 쉽다. 멀티 쓰레드 환경에서 발생할 수 있는 동시성 이슈 같은 것은 고민하지 않아도 된다. Limited Concurrency: 싱글 쓰레드 환경에서는 요청 하나당 한개만 처리할 수 있다. 동시에 처리할 수 없기 때문에 응답 속도도 느려지고 througput도 좋지 않다..
-
HTTP 2.0 주요사항개발/기술 2023. 3. 1. 19:36
Multiplexed Streams HTTP1 .0 에서는 요청을 보내기 위해선 반드시 이전 요청이 완료돼야했기 때문에 속도면에서 딜레이가 있었다. 그래서 HTTP 1.1에서는 하나의 TCP 안에 두개 이상의 HTTP 요청을 담아 속도를 높일 수 있는 Pipelining을 기술을 도입했다. 동시에 여러개의 요청을 보낼 수 있기 때문에 속도면에서 HTTP 1.0 에서 발생한 딜레이를 줄일 수 있다. 그러나 순서가 보장돼야하는 한계가 있었다. 서버는 TCP에서 요청을 받은 순서대로 응답해야하기 때문이다. 그래서 앞선 요청에 의해 뒤에 있는 요청이 딜레이 되는 문제가 발생한다. 이미지 세장을 받는 경우 가장 앞선 이미지 응답이 지연되면 두, 세번째 이미지도 지연이 발생하게 된다. 이 문제를 Head Of Li..
-
coroutine - runBlocking, coroutineScope, suspend개발 2023. 2. 28. 20:30
runBlocking runBlocking은 코루틴 월드에 있지 않는 곳과 코루틴 월드를 이어주는 대표적인 함수다. 일반 메인 함수에서는 launch, async 같은 코루틴을 실행할 수 없는데 runBlocking을 이용해 코루틴 월드에 진입하면 실행 할 수 있게 된다. 이름에서도 유추할 수 있듯이 runBlocking은 내부 코루틴 작업이 완료될 때까지 동안 쓰레드를 잠시 일시 중지(blocked)시킨다. 쓰레드를 마구잡이로 중단시키는건 비효율적인 작업이기 때문에 runBlocking을 사용하는 코드는 대부분 애플리케이션 최상위 계층에 존재한다. fun main() { runBlocking { launch { delay(2000) println("Hello1") } launch { delay(1000..
-
coroutine - launch, async, CoroutineContext개발 2023. 2. 28. 20:00
launch, async coroutine을 시작하는 방법은 launch, async가 있다. launch는 결과값을 반환하지 않고 async는 await를 이용해서 결과값을 반환할 수 있다. fun main() { ThreadTest().runCoroutine() } class ThreadTest { fun runCoroutine() = runBlocking { val jobs = ArrayList() (1..5).map { number -> val job = async { delay((Math.random() * 1000).toLong()) println("${Thread.currentThread().name} done, number: $number") increaseCounter() return@a..
-
kubernetes - readiness, livenesss, startup probe개발 2023. 2. 28. 19:05
kubernetes 에서는 컨테이너 상태를 지속적으로 모니터할 수 있는 기능을 제공한다. readinessProbe, livenessProbe, startupProbe 을 적절하게 활용하면 컨테이너를 자동으로 재실행 시키거나 로드밸런서에서 빼줄 수 있다. readinessProbe 컨테이너가 트래픽을 받을 수 있는지를 알기 위해 사용한다. 일반적으로 Pod은 모든 컨테이너가 준비된 상태 일 때 트래픽을 받을 수 있지만 만약 오래걸리는 작업을 처리하는 경우에는 트래픽을 받는게 부적합할 수 있다. readinessProbe 결과 준비가 되지 않았다고 판단되면 로드밸런서로부터 제거한다 livenessProbe 컨테이너를 언제 다시 시작할지 결정하는 역할을 한다. livenessProbe 조건을 활용하면 데드락..
-
Java - Thread start, run개발 2023. 2. 28. 19:00
start(), run()의 차이 둘다 쓰레드를 실행하기 위한 함수다. 그러나 run() 을 사용하면 run을 호출한 쓰레드에서 작업이 처리되고 start()를 사용하면 쓰레드를 새로 만들어서 처리된다. 병렬 처리를 하고 싶다면 start()를 사용해야 한다. fun main() { ThreadTest().runThread() } class ThreadTest { var counter = 0; private fun increaseCounter() { counter++ } fun runThread() { val threads = ArrayList() (1..100).map { number -> val thread = Thread { sleep((Math.random() * 1000).toLong()) pr..
-
HTTP개발/기술 2023. 2. 28. 17:32
HTML 문서, 이미지, 텍스트를 가져올 수 있는 프로토콜. 웹에서 이루어지는 모든 데이터 교환의 기초다. 브라우저인 클라이언트에서 보내는 메시지는 요청, 서버에서 응답하는 메시지를 응답이라 부른다. HTTP, TCP 클라이언트와 서버서 HTTP 요청, 응답을 교환하기 위해선 TCP 연결을 설정해야한다. 브라우저로 http://google.com 를 요청 할 때 HTTP 처리 순서는 아래와 같다. 브라우저는 DNS로부터 호스트 주소, google.com 대한 IP 주소를 가져온다 브라우저는 IP 주소와 Port에 대해서 TCP 연결을 형성한다 브라우저는 TCP 연결로 서버에게 HTTP 요청을 보낸다 브라우저는 TCP 연결로 서버로부터 HTTP 응답을 받는다 응답이 완료되면 TCP 연결을 종료한다. HTT..