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