Swift Concurrency 12편 - distributed actor

김재형·2024년 7월 17일
2
post-thumbnail
post-custom-banner

시작하기에 앞서

해당 글은 Swift Concurrency 1편과 이어지는 내용입니다.
1편부터 보고 와주시길 바랍니다.

다시 생각해보는 Actor

Actor는 어떻게 비동기와 동시성 처리가 가능 할까요?
사진을 보면서 다시 이해해 보죠.

  • Behavior: 행동
  • State: 상태
  • MailBox: 큐 ( 수신함 )

Actor는 행동, 상태, 수신함으로 구성됩니다.
이때, 상태는 메시지를 수신 받을때 Actor 외부에선 변경이 불가하고, 자신만 변경이 가능합니다.
수신함은 직렬 큐이기에 순서대로 처리됩니다.
메시지에 따라 행위를 결정하게 되죠.

좀더 이해해보기

즉, Actor 끼리 수신함을 향해 메시지를 보내고 있는 부분을
async / await 로 구현되게 되는겁니다.
즉 다시 사진을 보며, 각 Actor 들은 각자만의 고유한 영역이 있습니다 이는 격리 되었다고 표현하며
Actor State Isolation 한 것이죠. 또한, 이들이 결합하여 컴파일이 된다면
컴파일러에서 low-level의 Data Race 가 발생하지 않음을 보장해줍니다.

분산 시스템

공유하는 여러개의 개별 컴퓨팅 노드 ( 컴퓨터 ) 에서 하나의 공동의 목표 즉
하나의 통합된 시스템 처럼 동작하는 컴퓨터 시스템을 말합니다.

온라인 게임을 흠... 롤(League of Legends)을 한번 생각해 봅시다.

  • 각 컴퓨터(노드)는 독립적으로 챔피언들을 동작 시킬 수 있습니다.
  • 각 노드들은 네트워크를 통해 서로 플레이(통신)합니다.
  • 중앙에서 모든 노드를 제어하지 않습니다. 각 노드는 독립적으로 작업을 수행하며, 협동을 통해 문제를 해결합니다.
  • 사용자에게 시스템이 하나의 통합된 시스템처럼 보이도록 합니다.

Distributed Actor

분산 시스템에서 안전하게 상태, 행위 를 관리 해주는 기능입니다.
네트워크를 통해 서로 통신하는 독립적인 컴포넌트로, 데이터의 일관성, 병렬처리를 도와줍니다.
네트워크상 다른 엑터에게 메시지를 보낼수 있습니다.


import Distributed

distributed actor ChatUser {

    distributed func sendMessage(_ message: String, toUser: ChatUser) async {
			// 다른 유저에게 메시지 에 로직~~~
        print("sends message: \(message) to \(toUser)")
    }
}

Task {
    await alice.sendMessage("취뽀 가즈아!", to: iOS_Dev)
}

마무리 하며....

이번편도 상당히 어려운 개념을 다루게 되버렸습니다...!
저도 다시봐도 어질 어질 한 부분이라 계속해서 다시 읽어 봐야 할것 같습니다... ㅠ
Apple 에서도 이에 대한 코드를 제공해 주고 있습니다.
Apple_swift_distributed_actor 해당 링크를 통해 더 자세히 공부 하실분들은 참고해주세요!
다음편은 GCD VS Swift Concurrency 입니다...!

profile
IOS 개발자 새싹이
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 7월 18일

어려워요ㅕㅇ려여여ㅇ유유ㅠㅠㅠ

1개의 답글