개발자 노트

비동기 프로그래밍 - 정리 본문

일반적인 IT주제

비동기 프로그래밍 - 정리

jurogrammer 2022. 8. 29. 22:39

 

추후 자바 API 및 기술 블로그들의 소개를 통해서 자세히 풀어나가도록 하겠습니다.

비동기

비동기란?

작업(task)을 순서대로 처리하지 않는 것

언제 사용 하는가?

성능 개선을 위하여 사용.

  • I/O 작업이 있을 경우
  • CPU bounded JOB이 있을 경우 (배치성)

비동기 프로그램 작성시 고려할 점

  • 비동기 작업의 결과물을 어떻게 이용할 것인가?
    • callback
      • 완료시 추가 작업을 하도록 함수(루틴) 전달.
    • blocking
      • 모두 완료될 때까지 대기
    • buffer 이용
      • I/O가 끝나지 않더라도 데이터 이용가능
  • 비동기 작업들이 어떤 상태에 있는가?
    • 상태에 따른 대응
      • 모두 완료됬을 경우 -> 처리
      • 처리 중일 경우 -> 대기 또는 다음 프로세스 진행
      • 에러났을 경우 -> 전체 프로세스 실패 등
  • 비동기 테스크인 I/O를 어떻게 처리할 것인가?
    • non-blokcing (event loop 방식 처리)
    • blocking (일반적인 방식으로 Thread에게 I/O 요청) 비동기 작업들의 완료
  • 여러 개 잡을 분할하여 처리시 완료 또는 실패 처리
    • 모두가 완료되었으면 성공
      • 어떻게 모두 성공했는지 판단?
    • 하나만이라도 실패한다면 모두 실패(fail fast)
      • 어떻게 하나가 실패 했는지 판단?
    • 하나만이라도 완료되었을 경우 성공 처리
      • 어떻게 판단?
    • 완료되는 순서대로 처리
  • Concurrency
    • 비동기 작업 목적이 성능 개선이다보니 여러 쓰레드를 이용하여 처리할 때가 있음. 이때 동일한 자원에 접근할 때 동시성 문제를 해결 해야 함.
    • volitile
      • cpu 레지스터에 캐싱된 값이 아닌, 메인 메모리 값을 참조하도록 함 (공유자원 불일치 문제 해결 목적)
    • CompareAndSwap
      • Check Then Act를 CPU 레벨에서 operation의 원자성 보장해주는 것. 단 하나의 쓰레드만 해당 operation을 수행할 수 있음.
      • 변수에 기대하는 값이 담겨 있을 경우에만 변수의 값을 변경한다.
      • synchronization 키워드(lock)을 대신하여 사용. 쓰레드가 블로킹되는 경우 thread가 곧바로 블로킹 상태에서 깨어나지 못함.
    • ForkJoinPool
      • work-stealing 기법. 쓰레드가 다른 쓰레드에 할당된 잡들을 뺏어서 작업함.
      • 쓰레드 별로 Task를 완벽히 균등하게 나눌 수 없음. 따라서, 유휴 쓰레드가 작업 중인 쓰레드의 Task를 뻇어와서 작업할 수 있도록 함.

시스템 단위에서 비동기 처리는?

  • 메세지 큐를 이용
  • Producer가 작업할 내용에 관한 메세지를 큐에 전달 , Consumer가 해당 메세지를 읽고 작업을 처리하는 방식
  • 이벤트 주도 설계 방식에서 의존성을 끊는 목적으로도 메세지 큐 사용
  • Transaction의 단위
    • 메세지 발행까지를 하나의 Transaction으로 묶음.
    • 비동기 Task의 처리 완료 여부는 무관심.
  • 메세지가 Task라고 보면 됨. 만약 에러로 인해 Consumer가 처리하지 못했을 경우, 재발행 필요.
반응형

'일반적인 IT주제' 카테고리의 다른 글

2의 보수  (0) 2022.07.15
expression과 evaluation이란?  (0) 2020.11.10
[DDNS]iptime 서버 주소 등록  (0) 2020.04.20
UI와 API에 대하여  (0) 2020.03.12
Comments