# scheduling

Scheduling 과 SSE 를 활용한 실시간 푸시 알림 구현
개요 프로젝트를 하면서 실시간 알림을 구현해야 하는 일이 생겼습니다. 이때 WebSocket을 사용할 수 있지만 서버에서 클라이언트로 일방적으로 데이터를 전송하는 환경에 양방향 통신인 WebSocket 을 쓰기엔 리소스 낭비가 커보였습니다. 이때 Server-Send Event 의 약자인 SSE 를 활용하면 WebSocket 보다 가벼운 단방향 통신을 할 수 있다는 것을 알게되었습니다. 이를 활용하여 서버 - 클라이언트간 연결을 유지하면서 서버에서 받은 데이터가 있을 경우에 클라이언트에서 이벤트를 발생시키는 SSE에 대해서 알아보고 구현하는 방법을 설명하겠습니다. 구현 목표 사용자가 설정한 알림을 받을 시간에 SSE 를 통해 클라이언트에게 데이터를 전송합니다. 프로세스 각 컨텐츠는 알림을 받을 시간이 설정되어 있습니다. -> 매 10분마다 현재 시간과 비교하여 알림을 보낼 데이터를 조회 -> 조회된 데이터마다 SSE 를 통해 데이

Nest.js에서 스케쥴러를 사용해보자!
왜 이 기능을 만들고 싶은가? 매시간마다 또는 특정 시간마다 기능을 실행하고싶다. 과정 스케쥴러를 사용하는 방법이... 너\\무 쉽다. Nest.js 공식문서에도 나와있고.. 음.. 너무 간단해서 당황했다. npm i @nestjs/schedule app.module.ts 에 추가한다. 10초마다 console.log(Date());를 실행한다. 이게 끝이다..!..? 으잉.. 이제 API를 호출해

Spring- 서버에 저장된 사진 삭제
🫧 서버에 저장된 사진 확인해보기 !문제점! 프로젝트 서버에 일정 시간마다 파일 업뎃하기! 현재 진행 중인 서버의 images 파일에는 board 파일과 member파일이 있고 위의 폴더에는 사진이 게시글 사진과 프로필 사진이 각각 저장되어 있다. 그러나, 게시글 목록과 프로필이미지에서 사진을 수정 삭제 할 경우에 DB에는 변경된 사항들이 UPDATE와 DELETE을 통해 변경이 되지만 서버에는 변경 되지 않고 그대로 남아 있는 모습을 보인다. > 20230814541931115.png , 20230814541995983.png 이 두 파일은 DB에 없는 사진 파일이다! 그런데 서버에는 존재하고 board파일에

배치와 스케줄러의 차이
'엄빠도 어렸다' 서버 개발을 하며, 매일 특정시간에 특정 조건을 만족할 때마다 푸시알림을 보내는 스케줄링 작업을 구현해야 했다. 푸시알림 기능을 구현하기에 앞서 Spring Batch, Spring Scheduler 등의 라이브러리를 이용할 수 있다는 것을 알고 각각에 대한 공부 후 더 효율적이고 적합한 것을 선택하고자 하였다. 배치(Batch) > 사용자와의 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것 > *배치 = 일괄처리 → Spring Batch 특징 ✓이 조건들을 만족해야 ‘배치’인 것이다! 대용량 데이터 - 대량의 데이터를 가져오고, 전달하고, 계산하는 등의 처리 가능 견고성 - 잘못된 데이터를 충돌/중단 없이 처리 성능 - 지정한 시간 내에 처리 완료 및 동시에 실행되는 다른 프로그램에 방해 X 자동화 - 사용자의 개입 없이 실행 신뢰성 - 잘못된 부분의 추적

스케줄링 작업 트랜잭션 처리 미적용 문제
매일 지정된 시간에 새로운 ‘오늘의 질문’에 대한 푸시알림을 보내는 기능에서 알림 시간이 저장된 테이블을 전체 조회한 후, 각각의 객체에 대한 작업을 예약하는 방식으로 구현하고자 한다. 해당 기능을 구현하며 다양한 고려사항과 오류가 있었는데, 오류를 해결하기 위해 시도한 방법과 공부한 내용을 정리해보았다. 오류 사항 먼저 간단히 정리하자면 아래와 같은 상황에 있었다. > cron을 초기화해두고 → 각 엔티티마다 저장된 푸시알림 시간으로 작업을 예약하는 방식 > > > 이 예약한 작업 내에서 트랜잭션 처리 및 DB 변경사항 반영이 되지 않는 상황 > 오류가 발생하기 시작한 시점은 예약한 작업 안에서 어제에서 오늘의 질문으로 넘어가기 위해 인덱스를 증가시키는 과정에서 DB 조회 및 업데이트하는 코드를 추가한 뒤부터 였다. 오늘의 질문 알림이 갈 때마다 질문 인덱스를 증가시켜야 하는데, 알림이 정상적으로 가도 DB 상으로는 인덱스 필드의 업데이트가 반영되
[OS] 멀티프로세서 스케줄링
멀티프로세서 스케줄링 멀티프로세서 스케줄링(multiprocessor scheduling)은 어려운 주제이므로 기본적인 내용만 다룰 것이다. 병행성(concurrency)에 대해 어느정도 공부를 한 후에 다루는 것이 가장 좋다. 멀티프로세서 시스템: 두 개 이상의 CPU를 가진 컴퓨터 시스템 원래는 고사양 컴퓨터에만 존재했는데, 멀티코어 프로세서가 대중화되면서 널리 쓰임 전통적인 응용프로그램은 하나의 CPU만 쓰기 때문에, CPU를 추가해도 속도가 빨라지지 않았음 이 문제를 해결하려면 응용프로그램을 병렬(parallel)로 실행되도록 해야함 (보통 쓰레드 사용) 응용프로그램뿐 아니라 운영체제도 멀티프로세서 스케줄링 문제에 직면함 -> 단일프로세서 스케줄링 원칙들을 멀티프로세서에서 동작하도록 확장할 수 있을까? > 핵심 질문: 여러 CPU에 작업을 어떻게 스케줄 해야 하는가? 1. 배경: 멀티프로세서 구조 멀티프로세서 스케
[OS] 스케줄링: 비례 배분 (Proportional Share)
비례 배분 (Proportional Share) 이번 장에서는 시간을 최적화 하는 것보다는, 작업의 비율 배분에 초점을 맞춘 스케줄러를 알아볼 것이다. 비례 배분 (공정 배분, fair share): 반환시간이나 응답시간을 최적화하는 대신 스케줄러가 각 작업에게 CPU의 일정 비율을 보장하는 것 추첨 스케줄링 (lottery scheduling) 다음 실행될 프로세스를 추첨을 통해 결정 더 자주 수행되어야 하는 프로세스는 더 높은 당첨 기회 비례배분 스케줄러의 대표적인 예 > 핵심 질문: 어떻게 CPU를 정해진 비율로 배분할 수 있는가? 1. 기본 개념: Tickets Represent Your Share (추첨권 == 할당량) 추첨권(티켓): 프로세스가 할당받아야 할 자원의 몫 예) A는 75장의 추첨권, B는 25장의 추첨권을 가지고 있다. 그러면 CPU 비율을 A: 75%, B: 25%로 가
[OS] 스케줄링: Multi-level Feedback Queue
스케줄링: Multi-level Feedback Queue (MLFQ) > 작업의 실행 시간에 대한 선행 정보 없이 대화형 작업의 응답 시간을 최소화하고 동시에 반환 시간을 최소화하는 스케줄러를 어떻게 설계할 수 있는가? Multi-level Feedback Queue (MLFQ) Compatible Time-Sharing System에 사용됨 MLFQ가 해결하고자 하는 문제 짧은 작업을 먼저 실행시켜 "반환시간" 최적화 SJF, STCF 알고리즘은 실생시간 정보를 필요로 하지만, 실제론 실행시간을 미리 알 수 없음 대화형 사용자를 위해 "응답시간" 최적화 RR 알고리즘은 응답시간을 최적화하지만, 반환시간은 거의 최악 > 핵심질문: 프로세스에 대한 정보 없이 스케줄링 하는 방법은? > 프로세스에 대한 선행 정보 없이 "반환시간"과 "응답시간"을 최소화하는 스케줄러를 설계할 수 있을까?
[OS] CPU 스케줄링
스케줄링 스케줄링: 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법. 즉, 어떤 프로세스를 실행시키거나 중단할지 결정하는 것 다양한 스케줄링 정책이 있고, 이는 discipline이라고도 볼림 > 핵심질문: 스케줄링 정책은 어떻게 개발하는가? 스케줄링 정책의 핵심 가정은? 어떠한 평가 기준이 중요한지? 컴퓨터 시스템에 사용된 기본 접근법은? 아래의 내용을 통해 스케줄링 정책이 어떻게 개발되는지 알아볼 것 1. 워크로드에 대한 가정 워크로드(workload): 일련의 프로세스들이 실행하는 상황 워크로드 결정은 곧 정교한 정책개발로 이어짐 > #### 워크로드에 대한 가정 모든 작업은 같은 시간동안 실행됨 (실행시간 일정함) 모든 작업은 동시에 도착 각 작업은 시작되면 완료될 때까지 실행됨 모든 작업은 CPU만 사용(입출력 x) 각 작업의 실행시간은 사전에 알려져 있음

Pintos Project 1: 키워드 정리
1. 쓰레드 상태 (무엇이 있는지, 어떤 함수 또는 인터럽트등이 불려지면 어떤 상태로 전환되는지) ❗ In Project 1 thread_block() : Running Thread -> Blocked Thread thread_unblock() : Blocked Thread -> Ready Thread thread_yield() : Running Thread -> Ready Thread schedule() : Ready Thraed -> Running Thread thread_exit() : Running Thread -> Dying Thread 2. 스케줄링이 무엇인지? (1의 함수들 호출과 스케줄링 관계 설명) 📅 운영체제에

[DB] Scheduling
동시성 제어 하나의 DBMS에서 여러 트랜잭션들이 동시에 처리되면 프로세서 및 디스크 활용도가 늘어나 throuput(단위시간당 처리되는 트랜잭션의 수)이 증가하고, 짧은 트랜잭션이 다른 트랜잭션들을 기다리지 않아도 되기 때문에 response time(응답시간)이 줄어드는 이점이 있다. 하지만 동시에 여러 트랜잭션이 실행되기 때문에 각 트랜잭션 안의 작업이 수행되는 순서에 따라 예상하지 못한 결과가 나올수도 있다. 이를 방지하기 위해 DBMS는 각 트랜잭션의 독립성과 정확성을 보장하기 위해 동시성을 제어하는 방법을 마련해야 하는데, 대표적인 방법으로 트랜잭션 스케줄링이 있다. 스케줄링 트랜잭션의 Schedule이란 여러 트랜잭션을 동시에 처리하기 위한 시간적 작업 순서를 의미한다. 각 트랜잭션은 하나 이상의 작업으로 이루어져있는데, 각 트랜잭션을 구성하는 작업의 상대적인 순서에 따라 다른 스케줄을 만들 수 있다. T1은

[NestJS] (+보완) Remove refresh-token data in DB if token has expired (using Task-Scheduling)
시작하기에 앞서 이번 포스팅은 온전히 이전 포스팅 "How to implement Refresh-Token using JWT"을 전제로 이어나간다. (아래 링크 참조) 이전 포스팅 (How to implement Refresh-Token using JWT) ✔ 물론 더 깊게 들어가면 수정하고 보완해야할 부분이 끝도 없지만 이전 포스팅의 내용에서 기본적인 Refresh-Token 구축에 따른 필요 기능을 구현해보았다. 일반적으로, 클라이언트에서 "로그아웃"을 요청하게 되면 데이터베이스 유저 테이블에 저장된 currentRefreshToken(현재 refresh 토큰값)과 currentRefreshTokenExp(refresh 토큰의 만료 시간)을 null로 수정하게끔

Lambda 스케줄링으로 매일 아침 자동으로 노션 페이지 만들기
Lambda 스케줄링으로 매일 아침 자동으로 노션 페이지 만들기 Preface 저는 매일 아침 오늘의 할일과 메모, 배운것을 기록하기 위한 노션 페이지를 만듭니다. 그날 작성한 기록들은 하루를 마감할때 관련된 카테고리나 페이지로 재분류하는 방식으로 저만의 기록을 쌓고 있습니다. 단순한 일도 매일 하게 되면 까먹기도 하고, 귀찮아지기도 합니다. 저는 그리 부지런하지 않기 때문에 기록을 위한 데일리 노트 템플릿을 매일 아침 지정된 시간마다 자동으로 생성하기 위해 몇 가지 도구를 이용했습니다. AWS CloudWatch Event AWS Lambda Notion API / SDK Terraform 노션에서 제공하는 공식 API와 SDK를 사용하면 손쉽게 컨텐츠 관리를 자동화 할 수 있습니
[운영체제] multiprocess 환경에서의 scheduling
singleprocessor vs multiprocessor 멀티 프로세서 환경이 일반적이게 된 이후로 스케줄링의 측면에서 고려해야할 많은 요소들이 생겨났다. 당연하게도 한 번에 여러 개의 프로세서가 동작할 수 있게 됨으로써 애플리케이션을 작성할 때도 이를 염두에 두어야하게 됐다. CPU의 개수를 늘리는 것 뿐 아니라 하나의 프로그램이 병렬로, 여러 개의 스레드로 실행될 수 있게 해야한다는 것이다. 이러한 하드웨어/소프트웨어의 양상 변화 때문에 스케줄링 방법은 더욱 중요해졌다. 싱글 프로세서인 경우에는 단순히 turnarround time, response time, fairness 등 스케줄링 알고리즘의 성능만을 고려하면 됐지만, scheduling의 대상이 되는 프로세서의 수가 둘 이상이 되면서 이 사이의 일관성 유지나 성능과 관련된 이슈들이 생겨난 것이다. 결론부터 말하자면, 이와 관련된 가장 중요한 이슈는 바로 ‘캐시’다. 캐시는 코어 앞에 붙어서

Linux Scheduling
Scheduling CPU를 사용하기 위한 작업들을 관리하는 것 스케줄러가 Dispatch 함으로써 프로세스가 CPU를 할당 받아 작업을 수행한다. 이때 스케줄링은 CPU를 할당하기 위해 결정하는 과정이라고 생각하면될 것 같다. CPU를 사용하기 위한 조건 1. Time Slice 작업에 할당하는 CPU의 사용시간 Time Slice가 0이 된다면 CPU를 빼앗기게 된다. 2. 우선순위 작업마다 우선순위가 존재하는데 CPU를 사용하기 위해서는 대기 큐에서의 우선순위가 높은 순서부터 CPU를 할당받는다. Scheduling Algorithm in Linux Ready Queue CPU를 받기위해 프로세스(작업) 들이 대기하는 큐 작업들이 대기하는 큐(queue)와 그러한 큐들을 모아놓은 이진 배열(bitmap) 으로 구성되어있다. bitmap은 이진 비트로 구성되어 작업 큐의 유무를 보관

Github Actions로 JS/TS 파일 실행시키기(node.js) + 토이프로젝트 소개
서론, 간단한 토이 프로젝트 소개 > 본 포스트는 간단하게 진행한 프로젝트에 대한 소개와, Github Actions를 활용해 Typescript(혹은 Javascript) 파일을 실행하는 과정에 대해 설명합니다. > Github Actions와 Node.js를 활용해 Push 등의 액션이 발생하거나, 매일 원하는 시간에(Cron scheduler 활용) TS/JS 파일을 실행하도록 할 수 있습니다. 방학을 맞아 매일 할 일을 기록하는 간단한 웹페이지를 만들었다. 깃허브의 잔디를 가꾸는 것처럼, 크게 네 가지 주제에 대한 매일의 달성도를 표기할 수 있도록 만들었다. 달성한 항목은 초록색, 달성하지 못한 항목은 빨간색으로 표현된다. 주말의 경우 반투명하게 표현되고, 아직 실천이 가능한 항목(오늘 아직 완료하지 않은 항목)들은 검은색으로 표현된다. <img alt="프로젝트 뷰" src="https://u

Thread, Unit of execution, Scheduling
실행의 단위(unit of execution) 프로세스 CPU 점유 프로세스는 독립적인 자원을 할당받고 스케줄링을 통해서 일정 시간 CPU를 사용할 수 있는 시간을 할당받는다. 멀티태스킹 방식 프로세스는 일정시간동안 작업을 실행할 수 있는 시간을 할당받는다. 이 시간동안 프로세스가 아닌 스레드가 실제 CPU를 점유하여 사용하게 된다. 그래서 스레드를 실행의 단위(unit of execution) 라고 부른다. 스레드 스케줄링 — First Come First Serve 
(5) Spring Official Guide - Scheduling Tasks
Scheduling Tasks https://spring.io/guides/gs/scheduling-tasks/ 한줄 요약 정말 간단하게 Spring 환경에서 스케쥴링의 기본, 즉 주기적으로 함수를 호출하는 방법에 대해 익힌다. 프로젝트 구성 Spring initializer를 통해 다른 dependency 없이 프로젝트를 만들고, gradle 파일에 아래 library 딱 하나만 추가해주자 Create a Scheduled Task 코드 자체는 매우 간단하다. 핵심만 집자면 @Scheduled annotation을 통해서 해당 함수를 주기적으로 반복하며, 반복 주기는 [fixed Rate, fixed Delay, cron] 셋 중 하나로 구성해야야 한다는 것이다. Enabl

[Computer Science] Operating System(Scheduling & Context Switching)
스케줄링이란? 스케줄링은 프로세스가 생성되어 실행될 때 필요한 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업을 의미합니다. 스케쥴링은 CPU에서 자원을 효율적으로 사용하기 위한 목적으로 사용됩니다. 스케줄러의 종류에는 장기 스케줄러, 중기 스케줄러, 단기 스케줄러가 있습니다. 장기 스케줄러는 실행 중인 프로세스의 수를 제어 중기 스케줄러는 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절 단기 스케줄러는 CPU에 프로세스를 적재하는 역할 Context Switching이란? 왜 필요한가? IF. 컴퓨터가 매번 하나의 Task만 처리할 수 있다면? 해당 Task가 끝날때까지 다음 Tas