Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Lightweight 프로세스 (수십만 개 생성 가능)

  • 모든 액터는 메시지 기반으로 통신

  • 고장 격리 (let it crash 철학)

  • OTP 사용 시 supervision, 상태 관리, 분산까지 매우 쉬움

액터프로그래밍 활용사례

1. Scala: Akka 프레임워크

Akka는 Scala와 Java에서 사용 가능한 강력한 액터 기반 프레임워크로, 분산 시스템과 동시성 처리를 위한 도구를 제공합니다.

  • 적용 사례:

    • LinkedIn: Akka를 활용하여 실시간 데이터 처리를 개선하고, 대규모 메시징 시스템의 성능을 향상시켰습니다.

    • Lightbend: Akka의 개발사로, 자체 제품과 서비스에 Akka를 적극 활용하여 고성능 애플리케이션을 구축하고 있습니다.

2. Java: Akka 및 Spring Integration

Java 진영에서는 Akka 외에도 Spring Integration과 같은 프레임워크를 통해 액터 모델의 개념을 적용하고 있습니다.

  • 적용 사례:

    • Credit Karma: Akka를 사용하여 마이크로서비스 아키텍처를 구축하고, 사용자에게 실시간 신용 점수 업데이트를 제공하고 있습니다.

    • Netflix: Spring Integration을 활용하여 마이크로서비스 간의 메시지 기반 통신을 구현하고, 서비스 간의 결합도를 낮추는 데 기여했습니다.

3. C#: Akka.NET

Akka.NET은 .NET 환경에서 Akka의 기능을 제공하는 프레임워크로, C#과 F#에서 사용 가능합니다.

  • 적용 사례:

    • Petabridge: Akka.NET의 주요 개발사로, 분산 시스템 구축을 위한 도구와 서비스를 제공하며, 자체 프로젝트에 Akka.NET을 활용하고 있습니다.

    • SIL International: Akka.NET을 사용하여 언어 학습 애플리케이션의 성능과 확장성을 개선하였습니다.

4. Kotlin: 코루틴과 채널

Kotlin에서는 언어 자체의 **코루틴(coroutines)**과 **채널(channels)**을 활용하여 액터 모델을 구현할 수 있습니다.

  • 적용 사례:

    • JetBrains: Kotlin의 개발사로, 내부 도구와 애플리케이션에서 코루틴과 채널을 활용하여 비동기 프로그래밍과 동시성 처리를 효율화하고 있습니다.

5. Python: Ray 프레임워크

Ray는 Python에서 분산 컴퓨팅을 위한 프레임워크로, 액터 모델을 지원하여 대규모 병렬 처리를 가능하게 합니다.

  • 적용 사례:

    • OpenAI: Ray를 활용하여 대규모 머신 러닝 모델의 학습과 배포를 효율적으로 관리하고 있습니다.

    • Ant Group: 금융 서비스에서 Ray를 사용하여 실시간 데이터 분석과 위험 관리를 수행하고 있습니다.

6. Erlang: 내장 액터 시스템

Erlang은 언어 자체에 액터 모델이 내장되어 있어, 높은 동시성과 분산 시스템 구축에 적합합니다.

  • 적용 사례:

    • WhatsApp: Erlang을 사용하여 수억 명의 사용자에게 안정적인 메시징 서비스를 제공하고 있습니다.

    • Ericsson: 통신 시스템의 신뢰성과 가용성을 높이기 위해 Erlang을 활용하고 있습니다.

7. Elixir: Erlang 기반의 액터 모델

Elixir는 Erlang VM 위에서 동작하는 언어로, 액터 모델을 활용하여 확장성과 유지보수성이 높은 애플리케이션을 개발할 수 있습니다.

  • 적용 사례:

    • Discord: Elixir를 사용하여 대규모 실시간 채팅 시스템을 구축하고, 수백만 명의 동시 접속을 처리하고 있습니다.

    • Bleacher Report: Elixir를 활용하여 스포츠 뉴스와 관련 콘텐츠를 실시간으로 제공하는 플랫폼을 운영하고 있습니다.

이처럼 다양한 언어와 프레임워크에서 액터 모델이 구현되어, 여러 테크 기업에서 분산 시스템과 동시성 처리를 위한 핵심 도구로 활용되고 있습니다.

AKKA의 다양한 장치를 이용 액터기능을 확장하기

코틀린 버전 AkkaStream을 활용해 BackPresure를 포함 TPS제어



AKKA의 다양한 장치를 이용 액터기능을 확장하기

코틀린 버전 AkkaStream을 활용해 BackPresure를 포함 TPS제어

Code Block
themeEmacs
class HelloActorStreamTest {

    companion object {
        private val system = ActorSystem.create("TestSystem")
        private val materializer = ActorMaterializer.create(system)

        @JvmStatic
        @AfterClass
        fun teardown() {
            TestKit.shutdownActorSystem(system)
        }
    }

    @Test
    fun `should throttle and respond with world`() {
        object : TestKit(system) {
            init {
                val helloActor = system.actorOf(HelloActor.props())

                // Source.queue + throttle + ask pattern
                val (queue, done) = Source.queue<String>(10, OverflowStrategy.backpressure())
                    .throttle(3, JDuration.ofSeconds(1)) // 초당 3건
                    .mapAsync(1) { msg ->
                        akka.pattern.Patterns.ask(helloActor, msg, 1000).thenApply { it as String }
                    }
                    .toMat(Sink.foreach { response ->
                        println("응답 수신: $response")
                        expectMsgEquals("world")  // 테스트 검증
                    }, Keep.both())
                    .run(materializer)

                // 메시지 전송 (10건)
                for (i in 1..10) {
                    queue.offer("hello")
                }

                // 일부 응답 대기
                within(Duration.create(5, "seconds")) {
                    // 최소 3건은 들어왔는지 확인
                    for (i in 1..3) {
                        expectNoMessage()
Code Block
themeEmacs
class HelloActorStreamTest {

    companion object {
        private val system = ActorSystem.create("TestSystem")
        private val materializer = ActorMaterializer.create(system)

        @JvmStatic
        @AfterClass
        fun teardown() {
            TestKit.shutdownActorSystem(system)
        }
    }

    @Test
    fun `should throttle and respond with world`() {}
         object : TestKit(system) {}
        }
    init {
   }
}


액터를 라우터를 구성후 순차 라운드로빈처리

Code Block
themeEmacs
             val     helloActor = system.actorOf(HelloActor.props())

 +------------------+
                 // Source.queue + throttle| + ask pattern
Router (RoundRobinPool)   |
            val (queue,  done) = Source.queue<String>(10, OverflowStrategy.backpressure())
    +------------------+
                  .throttle(3, JDuration.ofSeconds(1)) // 초당 3건
      |        \
      .mapAsync(1) { msg ->
 HelloActor1  HelloActor2  HelloActor3

Code Block
themeEmacs
fun main() {
    val system            akka.pattern.Patterns.ask(helloActor, msg, 1000).thenApply { it as String }
   = ActorSystem.create("RoundRobinSystem")

    // RoundRobinPool로 HelloActor 3개 구성
    val router = system.actorOf(
          }RoundRobinPool(3).props(HelloActor.props()),
        "helloRouter"
    )

    println("=== 메시지 전송  .toMat(Sink.foreach { response ->시작 ===")
    for (i in 1..9) {
        val future = Patterns.ask(router,     println("응답 수신: $response""hello $i", 1000)
        val result = Await.result(future, Duration.create(1, TimeUnit.SECONDS))
        println("응답   expectMsgEquals("world$i: $result")
  // 테스트 검증}

    system.terminate()
}

// Output
[helloRouter/$a] received: hello 1
응답 1: world
[helloRouter/$b] received: hello 2
응답 2: world
[helloRouter/$c] received: hello 3
응답  }, Keep.both())
                    .run(materializer)

                // 메시지 전송 (10건)
                for (i in 1..10) {
                    queue.offer("hello")
                }

                // 일부 응답 대기
                within(Duration.create(5, "seconds")) {
                    // 최소 3건은 들어왔는지 확인
                    for (i in 1..3) {
                        expectNoMessage()
                    }
                }
            }
        }
    }
}

액터를 라우터를 구성후 순차 라운드로빈처리

Code Block
themeEmacs
                    +------------------+
                    |   Router (RoundRobinPool)   |
                    +------------------+
                    /        |        \
          HelloActor1  HelloActor2  HelloActor3

...

themeEmacs

...

3: world
[helloRouter/$a] received: hello 4
응답 4: world
...



액터프로그래밍 활용사례

1. Scala: Akka 프레임워크

Akka는 Scala와 Java에서 사용 가능한 강력한 액터 기반 프레임워크로, 분산 시스템과 동시성 처리를 위한 도구를 제공합니다.

  • 적용 사례:

    • LinkedIn: Akka를 활용하여 실시간 데이터 처리를 개선하고, 대규모 메시징 시스템의 성능을 향상시켰습니다.

    • Lightbend: Akka의 개발사로, 자체 제품과 서비스에 Akka를 적극 활용하여 고성능 애플리케이션을 구축하고 있습니다.

2. Java: Akka 및 Spring Integration

Java 진영에서는 Akka 외에도 Spring Integration과 같은 프레임워크를 통해 액터 모델의 개념을 적용하고 있습니다.

  • 적용 사례:

    • Credit Karma: Akka를 사용하여 마이크로서비스 아키텍처를 구축하고, 사용자에게 실시간 신용 점수 업데이트를 제공하고 있습니다.

    • Netflix: Spring Integration을 활용하여 마이크로서비스 간의 메시지 기반 통신을 구현하고, 서비스 간의 결합도를 낮추는 데 기여했습니다.

3. C#: Akka.NET

Akka.NET은 .NET 환경에서 Akka의 기능을 제공하는 프레임워크로, C#과 F#에서 사용 가능합니다.

  • 적용 사례:

    • Petabridge: Akka.NET의 주요 개발사로, 분산 시스템 구축을 위한 도구와 서비스를 제공하며, 자체 프로젝트에 Akka.NET을 활용하고 있습니다.

    • SIL International: Akka.NET을 사용하여 언어 학습 애플리케이션의 성능과 확장성을 개선하였습니다.

4. Kotlin: 코루틴과 채널

Kotlin에서는 언어 자체의 **코루틴(coroutines)**과 **채널(channels)**을 활용하여 액터 모델을 구현할 수 있습니다.

  • 적용 사례:

    • JetBrains: Kotlin의 개발사로, 내부 도구와 애플리케이션에서 코루틴과 채널을 활용하여 비동기 프로그래밍과 동시성 처리를 효율화하고 있습니다.

5. Python: Ray 프레임워크

Ray는 Python에서 분산 컴퓨팅을 위한 프레임워크로, 액터 모델을 지원하여 대규모 병렬 처리를 가능하게 합니다.

  • 적용 사례:

    • OpenAI: Ray를 활용하여 대규모 머신 러닝 모델의 학습과 배포를 효율적으로 관리하고 있습니다.

    • Ant Group: 금융 서비스에서 Ray를 사용하여 실시간 데이터 분석과 위험 관리를 수행하고 있습니다.

6. Erlang: 내장 액터 시스템

Erlang은 언어 자체에 액터 모델이 내장되어 있어, 높은 동시성과 분산 시스템 구축에 적합합니다.

  • 적용 사례:

    • WhatsApp: Erlang을 사용하여 수억 명의 사용자에게 안정적인 메시징 서비스를 제공하고 있습니다.

    • Ericsson: 통신 시스템의 신뢰성과 가용성을 높이기 위해 Erlang을 활용하고 있습니다.

7. Elixir: Erlang 기반의 액터 모델

Elixir는 Erlang VM 위에서 동작하는 언어로, 액터 모델을 활용하여 확장성과 유지보수성이 높은 애플리케이션을 개발할 수 있습니다.

  • 적용 사례:

    • Discord: Elixir를 사용하여 대규모 실시간 채팅 시스템을 구축하고, 수백만 명의 동시 접속을 처리하고 있습니다.

    • Bleacher Report: Elixir를 활용하여 스포츠 뉴스와 관련 콘텐츠를 실시간으로 제공하는 플랫폼을 운영하고 있습니다.

이처럼 다양한 언어와 프레임워크에서 액터 모델이 구현되어, 여러 테크 기업에서 분산 시스템과 동시성 처리를 위한 핵심 도구로 활용되고 있습니다.



도큐먼트

🟦 Scala / Java – Akka

...