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

Що таке 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
Ви також можете використовувати NuGetimage

Потім необхідно додати 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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.