Posted in scala, actor, akka

Reactive Message Patterns w/ Actor Model, Chapter 1



Comment

Why Enterprise Software Development Is Hard

엔터프라이즈 소프트웨어를 구현할 때 마주치는 문제점은, 고려해야할 것이 너무나 많다는 점입니다.

  • Physical Tiers
  • Application Servers
  • Software layers
  • Frameworks and Patterns
  • Toolkits
  • Databases
  • Messaging Systems
  • Third-Party Applications
  • ...

이런 요소들로 구성된 complexity stack 의 내부를 잘 살펴보면, 결국 관심사는 command 에 의해 생성된 domain event 를 저장하는 일임을 알 수 있습니다.

Actor Model 은 여기에서 출발합니다. 불필요한 컴포넌트를 제외하고, commandevent 에만 집중할 수 있도록 추상화를 제공합니다.

  • What incoming messages (commands and/or events) do I accept?
  • What outgoing messages (commands and/or events) do I emit?
  • How can my state be mutated in reaction to incoming messages?
  • What is my supervision strategy for supervised actors?


Origin Of Actors

Actor Model 은 최근에 새롭게 만들어진 개념이 아니라, 1973년(Dr. Carl Hewitt) 부터 있었던 개념입니다. 다만 당시에는 컴퓨팅 파워가 부족했기 때문에 활용되지 않았을 뿐입니다. Actor Model 이 처음 만들어졌을 당시에는 CPU 클럭은 1MHz 남짓이었고 멀티코어 프로세서는 존재하지도 않았습니다.


Understanding Actors

Actor 는 하나의 컴퓨팅 객체로서 메시지를 받아 다음의 일들을 수행할 수 있습니다.

  • Send a finite number of messages to other actors
  • Create a finite number of new actors
  • Designate the behavior to be used for the next messages it receives

Actor System 에서는 모든것이 Actor 입니다. 따라서 Int, String 처럼 일종의 primitive type 으로 생각하면 더 이해가 쉽습니다.

Actor System 과 Actor 는 다음의 특성을 가지고 있습니다.

  • Communication via direct asynchronous message
  • State machines (FSM)
  • Share nothing
  • Lock-Free Concurrency
  • Parallelism

Akka 에서 추가적으로 제공하는 특성들은 다음과 같습니다.

  • Location Transparency
  • Supervision
  • Future / Promises


Concurrency and Parallelism

Concurrency describes multiple computation occurring simultaneously. Parallelism is concurrency but applied to achieving a single goal. Parallelism is achieved by dividing a single complex process into smaller tasks and executing them concurrently.

Amdahl’s law 에 의하면 병렬화해서 얻을 수 있는 최대 성능은, 병렬화 할 수 없는 부분에 의해서 제한됩니다.

따라서 시스템을 얼마나 병렬화 할 수 있도록 디자인하는가가 성능에 영향을 주게 됩니다. 이는 일반적으로 어려운 일이지만, Actor System 을 이용하면 atomic 연산 unit 인 Actor 를 기반으로 디자인할 수 있으므로 부가적인 계층(Tier) 보다는 로직(이 메시지를 받았을 때 어떤 일을 해야하는가)에 더 집중하게 되어 쉬운 일이 됩니다.

Akka 프로젝트 설명에서도 볼 수 있듯이, 분산 병렬 시스템을 만드는 것은 어려운 일이지만 대부분의 경우는 잘못된 추상(Abstaction), 도구(Tool) 을 이용하기 때문입니다. Actor Model 은 프로그래머가 더 쉬운 방법으로 분산 병렬 시스템을 디자인할 수 있도록 돕습니다.

We believe that writing correct concurrent & distributed, resilient and elastic applications is too hard. Most of the time it's because we are using the wrong tools and the wrong level of abstraction.

Akka is here to change that.

Using the Actor Model we raise the abstraction level and provide a better platform to build correct concurrent and scalable applications.


Non-determinism

Actor Model 이 비결정적이라는 비판들이 있습니다. 그러나 실제로 내부를 잘 살펴보면 Actor 그 자체는 deterministic atomic unit 입니다. 따라서 시스템을 Reactive 하게 구성하는 과정에서 프로그래머가 다루어야 하는 non-determinism 을 Actor Model 을 이용하면 더 간단하게 다룰 수 있습니다.


References

Author

1ambda

Functional, Scala, Akka, Rx and Haskell