Что такое 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

Затем необходимо добавить 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.