Pull to refresh

Введение в Akka.NET

Reading time6 min
Views42K

Что такое Akka?


Масштабируемая, распределенная обработка транзакций в реальном времени


Мы верим, что написание корректных, параллельных, отказоустойчивых и масштабируемых приложений это сложно.

В большинстве случаев это связано с тем, что мы используем неправильные инструменты и неправильный уровень абстракции. Akka создана для того, чтобы изменить это.

Используя модель акторов, мы повышаем уровень абстракции и обеспечиваем лучшую платформу для создания масштабируемых, устойчивых и гибких приложений (см. Reactive Manifesto для подробностей).

Для обеспечения отказоустойчивости мы используем модель «позволь этому упасть», которая с большим успехом используется в телекоммуникационной индустрии для создания самовосстанавливающихся приложений и систем, которые никогда не должны останавливаться. Акторы также обеспечивают прозрачный уровень абстракции для распределенности и базу для действительно масштабируемых и отказоустойчивых приложений.

Akka.NET это проект с открытым исходным кодом и доступный по лицензии Apache 2 Licenseпоясненной здесь.

Уникальный гибрид


Акторы


Акторы дают вам:

  • Простые и высокоуровневые абстракции для конкурентности и параллелизма.
  • Асинхронную, не блокирующую и высокопроизводительную событийную модель программирования.
  • Очень легкие событийные процессы (несколько миллионов акторов за ГБ в куче). См. раздел для C# или F#.

Отказоустойчивость


  • Руководящую иерархию с семантикой «позволь этому упасть».
  • Руководящие иерархии могут охватить несколько виртуальных машин, чтобы обеспечить по-настоящему отказоустойчивые системы.
  • Замечательно подходят для написания высоко отказоустойчивых систем, которые могут самовосстановиться и никогда не останавливаются. См. Отказоустойчивость.

Прозрачное расположение


Всё в Akka предназначено для работы в распределенной среде: любое взаимодействие между акторами использует простую передачу сообщений и всё является асинхронным.

Поддержка кластеризации в настоящий момент находится в бета состоянии. См. здесь для деталей.

Персистентность


Akka.Persistence на данный момент в бета состоянии и очень активно развивается. (п.п. в документации ссылка битая, а на гитхабе просто написано, что "еще не реализовано").

Почему Akka?


Какие преимущества в Akka.NET перед конкурентами?


Akka.NET обеспечивает масштабируемую, распределенную обработку транзакций в реальном времени.

Akka.NET это единая среда выполнения и модель программирования для:

  • Масштабирования по вертикали (конкурентность)
  • Масштабирования по горизонтали (удаленность)
  • Отказоустойчивость

Akka.NET является очень масштабируемым куском ПО; не только в контексте производительности, но также в размере приложений, для которых она используется. Ядро Akka.NET, Akka.NET-actor, очень маленькое и его можно с легкостью положить в существующий проект, в котором вам необходима асинхронность и не блокирующая конкурентность.

Хороший пример использования Akka.NET?


Мы видим как Akka.NET используется многими крупными организациями в широком спектре индустрий:

  • Инвестиции и торговые банки
  • Розничная торговля
  • Социальные медия
  • Моделирование
  • Игры и ставки
  • Автомобильные системы и системы управления движением
  • Здравоохранение
  • Анализ данных и многое другое. Любая система с необходимостью в высокой пропускной способности и низкой латентностью является хорошим кандидатом для использования Akka.NET.

Акторы позволяют вам управлять сбоями (руководители), управлять нагрузкой (стратегии откладывания, тайм-ауты и изоляция процессов), а также горизонтальной и вертикальной масштабируемостью (добавить больше ядер и/или добавить больше машин).

Вот что некоторые из пользователей Akka говорят.

Начало работы с Akka.NET


Этот туториал является введением в использование Akka.NET. Здесь создается простой Greeter (Приветствующий) актор, используя C#.

Настройка проекта


Запустите visual studio и создайте новое консольное приложение C#. После откройте консоль диспетчера пакетов и введите:
PM> Install-Package Akka

Вы также можете использовать NuGet
image

Затем необходимо добавить using:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// Добавьте эти две строчки
using Akka;
using Akka.Actor;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Создание вашего первого актора


Первым делом необходимо создать тип сообщения, на который наш актор будет реагировать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace ConsoleApplication11
{
    // Создание (неизменяемого) типа сообщения, на которое ваш актор будет реагировать
    public class Greet
    {
        public Greet(string who)
        {
            Who = who;
        }
        public string Who { get;private set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

После того, как у нас есть тип сообщения, можно создать актора:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace ConsoleApplication11
{
    public class Greet
    {
        public Greet(string who)
        {
            Who = who;
        }
        public string Who { get;private set; }
    }

    // Создание класса актора
    public class GreetingActor : ReceiveActor
    {
        public GreetingActor()
        {
            // Сказать актору реагировать
            // на Greet (Приветствие) сообщение
            Receive<Greet>(greet =>
               Console.WriteLine("Hello {0}", greet.Who));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Теперь пришло время отправить сообщение актору. Для этого мы используем ActorSystem и вызываем ActorOf.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Akka;
using Akka.Actor;

namespace ConsoleApplication11
{
    public class Greet
    {
        public Greet(string who)
        {
            Who = who;
        }
        public string Who { get;private set; }
    }

    public class GreetingActor : ReceiveActor
    {
        public GreetingActor()
        {
            Receive<Greet>(greet =>
               Console.WriteLine("Hello {0}", greet.Who));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Создать новую систему акторов (контейнер для ваших акторов)
            var system = ActorSystem.Create("MySystem");

            // Создать вашего актора и получить ссылку на него.
            // Это будет "ActorRef", который не является
            // ссылкой на текущий экземпляр актора,
            // но является клиентом или прокси к нему.
            var greeter = system.ActorOf<GreetingActor>("greeter");

            // Отправить сообщение актору
            greeter.Tell(new Greet("World"));

            // Это блокирует выход из приложения
            // до тех пор, пока асинхронная работа
            // не будет выполнена.
            Console.ReadLine();
        }
    }
}

Таким образом ваш актор готов получить сообщения, отправленные из любого количества вызывающих потоков.

Обязательный Hello World!


Этот пример показывает как определить и использовать акторов в C# и F#.

Hello World, используя C# API


Определение сообщений:

// Создание (неизменяемого) типа сообщения, на которое ваш актор будет реагировать
public class Greet
{
    public Greet(string who)
    {
        Who = who;
    }
    public string Who { get;private set; }
}

Определение вашего актора, используя ReceiveActor API:

// Создание класса актора
public class GreetingActor : ReceiveActor
{
    public GreetingActor()
    {
        Receive<Greet>(greet => Console.WriteLine("Hello {0}", greet.Who));
    }
}

… или используя TypedActor API:

public class GreetingActor : TypedActor , IHandle<Greet>
{
    public void Handle(Greet greet)
    {
        Console.WriteLine("Hello {0}!", greet.Who);
    }
}

Использование:

// Создать новую систему акторов (контейнер для ваших акторов)
var system = ActorSystem.Create("MySystem");

// Создать вашего актора и получить ссылку на него.
// Это будет "IActorRef", который не является
// ссылкой на текущий экземпляр актора,
// но является клиентом или прокси к нему.
var greeter = system.ActorOf<GreetingActor>("greeter");

// Отправить сообщение актору
greeter.Tell(new Greet("World"));

// Это блокирует выход из приложения
// до тех пор, пока асинхронная работа
// не будет выполнена.
Console.ReadLine();

Смотрите также (п.п. на данный момент отсутствуют в самом оригинале):

  • [[Не типизированные акторы]]
  • [[Типизированные акторы]]

Hello World, используя F# API:

// Создание (неизменяемого) типа сообщения, на которое ваш актор будет реагировать
type Greet = Greet of string

let system = ActorSystem.Create "MySystem"

// Use F# computation expression with tail-recursive loop
// to create an actor message handler and return a reference
let greeter = spawn system "greeter" <| fun mailbox ->
    let rec loop() = actor {
        let! msg = mailbox.Receive()
        match msg with
        | Greet who -> printf "Hello, %s!\n" who
        return! loop() }
    loop()

greeter <! Greet "World"

Варианты использования и сценарии развертывания:

Консольное приложение
PM> install-package Akka
PM> install-package Akka.Remote

using Akka;
using Akka.Actor;
using Akka.Configuration;

namespace Foo.Bar
{
    class Program
    {
        static void Main(string[] args)
        {
            // configure remoting for localhost:8081
            var fluentConfig = FluentConfig.Begin()
                .StartRemotingOn("localhost", 8081)
                .Build();

            using (var system = ActorSystem.Create("my-actor-server", fluentConfig))
            {
                // start two services
                var service1= system.ActorOf<Service1>("service1");
                var service2 = system.ActorOf<Service2>("service2");
                Console.ReadKey();
            }
        }
    }
}


Подвал


Данная статья является очень вольным переводом Введение в Akka.NET.
Tags:
Hubs:
Total votes 26: ↑22 and ↓4+18
Comments9

Articles