- PVSM.RU - https://www.pvsm.ru -
Мы верим, что написание корректных, параллельных, отказоустойчивых и масштабируемых приложений это сложно.
В большинстве случаев это связано с тем, что мы используем неправильные инструменты и неправильный уровень абстракции. Akka создана для того, чтобы изменить это.
Используя модель акторов, мы повышаем уровень абстракции и обеспечиваем лучшую платформу для создания масштабируемых, устойчивых и гибких приложений (см. Reactive Manifesto [1] для подробностей).
Для обеспечения отказоустойчивости мы используем модель «позволь этому упасть», которая с большим успехом используется в телекоммуникационной индустрии для создания самовосстанавливающихся приложений и систем, которые никогда не должны останавливаться. Акторы также обеспечивают прозрачный уровень абстракции для распределенности и базу для действительно масштабируемых и отказоустойчивых приложений.
Akka.NET это проект с открытым исходным кодом и доступный по лицензии Apache 2 License [2] — поясненной здесь [3].
Акторы дают вам:
Всё в Akka предназначено для работы в распределенной среде: любое взаимодействие между акторами использует простую передачу сообщений и всё является асинхронным.
Поддержка кластеризации в настоящий момент находится в бета состоянии. См. здесь для деталей [6].
Akka.Persistence на данный момент в бета состоянии и очень активно развивается. (п.п. в документации ссылка битая, а на гитхабе просто написано, что "еще не реализовано").
Akka.NET обеспечивает масштабируемую, распределенную обработку транзакций в реальном времени.
Akka.NET это единая среда выполнения и модель программирования для:
Akka.NET является очень масштабируемым куском ПО; не только в контексте производительности, но также в размере приложений, для которых она используется. Ядро Akka.NET, Akka.NET-actor, очень маленькое и его можно с легкостью положить в существующий проект, в котором вам необходима асинхронность и не блокирующая конкуренция.
Мы видим как Akka.NET используется многими крупными организациями в широком спектре индустрий:
Акторы позволяют вам управлять сбоями (руководители), управлять нагрузкой (стратегии откладывания, тайм-ауты и изоляция процессов), а также горизонтальной и вертикальной масштабируемостью (добавить больше ядер и/или добавить больше машин).
Вот что некоторые из пользователей Akka говорят [7].
Этот туториал является введением в использование Akka.NET. Здесь создается простой Greeter (Приветствующий) актор, используя C#.
Запустите visual studio и создайте новое консольное приложение C#. После откройте консоль диспетчера пакетов и введите:
PM> Install-Package Akka
Затем необходимо добавить 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();
}
}
}
Таким образом ваш актор готов получить сообщения, отправленные из любого количества вызывающих потоков.
Этот пример показывает как определить и использовать акторов в C# и F#.
Определение сообщений:
// Создание (неизменяемого) типа сообщения, на которое ваш актор будет реагировать
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 [8].
Автор: TrueNoob141
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/237156
Ссылки в тексте:
[1] Reactive Manifesto: http://www.reactivemanifesto.org/
[2] Apache 2 License: http://www.apache.org/licenses/LICENSE-2.0
[3] поясненной здесь: https://www.tldrlegal.com/l/apache2
[4] куче: https://ru.wikipedia.org/wiki/Куча_(память)
[5] Отказоустойчивость: http://getakka.net/docs/Fault%20tolerance
[6] См. здесь для деталей: https://github.com/akkadotnet/akka.net/pull/400
[7] говорят: http://stackoverflow.com/questions/4493001/good-use-case-for-akka
[8] Введение в Akka.NET: http://getakka.net/docs/
[9] Источник: https://habrahabr.ru/post/320396/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.