И вот мы здесь! Добро пожаловать на первый урок.
В этом уроке вы создадите ваши первые акторы и будете введены в основы Akka.NET.
Основные понятия / предпосылки
В этом первом уроке вы узнаете основы создания консольного приложения с вашей первой системой акторов и простыми акторами внутри. Мы создадим два актора, один для чтения с консоли, и один для записи после некоторой простой обработки.
Что такое актор?
«Актор» на самом деле можно представить как аналог человека участвующего в системе. Это объект, который может что-то делать и общаться.
Мы будем считать, что вы уже знакомы с объектно-ориентированным программированием (ООП). Модель акторов очень похожа на объектно-ориентированное программирование (ООП), в моделе акторов все это акторы.
Повторяйте это постоянно для себя: все это акторы (everything is an actor). Все это акторы. Все это акторы! При разработке системы представляйте её как иерархию людей, где задачи разделяются и делегируются между ними до тех пор пока задача не станет настолько малой, чтобы её мог выполнить один актор.
На данный момент, мы предлагаем думать так: в ООП вы пытаетесь дать каждому объекту одну, вполне определенную цель, правильно? Что ж, модель акторов ничем не отличается, только теперь объекты, которым вы даете определенную цель называются акторы.
Так же можно почитать: What is an Akka.NET Actor?
Как акторы общаются?
Акторы общаются друг с другом так же как это делают люди, путем обмена сообщениями. Эти сообщения просто старые классы C#.
//this is a message!
public class SomeMessage
{
public int SomeValue {get; set}
}
О сообщения мы подробнее поговорим в следующем уроке, так что не волнуйтесь об этом сейчас. Все, что вам нужно знать, это то, что вы отправляете сообщения методом Tell() другому актору.
//send a string to an actor
someActorRef.Tell("this is a message too!");
Что акторы могут делать?
Все, что вы можете написать. Реально.
Вы программируете акторы для обработки сообщений, которые они получают и они могут делать с ними все что нужно, для работы. Обращайтесь к базе данных, пишите в файл, изменяйте внутренние переменные или еще что-нибудь, что вам надо.
Но в дополнение к обработке сообщений, которые он получает, акторы также могут делать другие действия:
- Создание других акторов
- Отправление сообщений другим акторам (например отправителю текущего сообщения)
- Изменение собственных поведений и процесса обработки следующих сообщений, которые они получат
Акторы по своей сути асинхронны (больше об этом в будущих уроках), и модель акторов ничего не говорит о том, какой из акторов что должен сделать или в каком порядке. Это вам решать.
Какие типы акторов существуют?
Все акторы унаследованы от UntypedActor, но не беспокойтесь об этом сейчас. Мы охватим различные типы акторов позже.
В первой части все ваши акторы будут унаследованы от UntypedActor.
Как вы можете создать актор?
Есть две основных вещи, которые надо знать при создании актора:
- Все акторы создаются в определенном контексте.
- Акторам необходим Props для создания. Props это все лишь объект который инкапсулирует формулу создания данного вида актора.
Мы более глубоко познакомимся с Props в третьем уроке, так что не беспокойтесь сейчас об этом. Мы предоставили Props для вас в исходном коде, так что вы должны просто выяснить как использовать Props, чтобы создать актора.
Что такое ActorSystem?
ActorSystem является ссылкой на лежащей в основе систему и Akka.NET фреймворк. Все акторы живут в контексте этой системы акторов. Вы должны будете создать свои первые акторы из контекста этого ActorSystem
Кстати, ActorSystem очень тяжелый объект: создавайте его только одного на приложение.
Иииииии… поехали! У вас достаточно концептуального материала сейчас, чтобы нырнуть и сделать свои первые акторы.
Упражнение
Давайте углубимся.
Примечание: В представленном коде есть секции с пометкой «YOU NEED TO FILL IN HERE» — найдите эти регионы кода и начните заполнять их соответствующей функциональностью, чтобы достичь цель.
Запуск пустой проект
Перейдите в папку DoThis и откройте WinTail в Visual Studio. Солюшен состоит из простого консольного приложения.
Вы будете использовать этот солюшен в течение всей первой части.
Установите последний Akka.NET пакет из NuGet'а
В консоли пакетного менеджера NuGet напишите следующую команду:
Install-Package Akka
Это установит последние библиотеки Akka.NET, которые вам понадобятся, чтобы скомпилировать этот пример.
Потом вы должны добавить using namespace в самый верх файла Program.cs
// in Program.cs
using Akka.Actor;
Создайте вашу первую ActorSystem
Перейдите в Program.cs и добавьте следующую строку:
MyActorSystem = ActorSystem.Create("MyActorSystem");
ПРИМЕЧАНИЕ: Когда вы создаете Props, ActorSystem или ActorRef вы будете очень редко видеть ключевое слово new. Эти объекты должны быть созданы через фабрику методов встроенную в Akka.NET. Если вы используете ключевое слово new возможно вы совершаете ошибку.
Создайте ConsoleReaderActor и ConsoleWriterActor
Сами классы акторов уже есть, но вам придется создать сами объекты.
Снова, в Program.cs добавьте чуть ниже где вы создали свою ActorSystem:
var consoleWriterActor = MyActorSystem.ActorOf(Props.Create(() => new ConsoleWriterActor()));
var consoleReaderActor = MyActorSystem.ActorOf(Props.Create(() => new ConsoleReaderActor(consoleWriterActor)));
Пусть ConsoleReaderActor отправляет сообщение актору ConsoleWriterActor
Самое время заставить ваши акторы работать.
Для этого вам необходимо сделать:
1. Пусть ConsoleReaderActor отправляет сообщение актору ConsoleWriterActor содержащее контент который мы только что прочли из консоли.
// in ConsoleReaderActor.cs
_consoleWriterActor.Tell(read);
2. Пусть ConsoleReaderActor отправляет сообщение самому себе после отправки сообщения ConsoleWriterActor. Это создаст цикл чтения консольных команд.
// in ConsoleReaderActor.cs
Self.Tell("continue");
3. Отправьте начальное сообщение в ConsoleReaderActor для того, чтобы начать чтение с консоли.
// in Program.cs
consoleReaderActor.Tell("start");
Шаг 5: Build and Run!
Когда вы закончите свои изменения, нажмите F5 для компиляции и запуска примера в Visual Studio.
Вы должны будете увидеть что-то вроде этого, если все сделали правильно:
Когда вы закончите
Сравните свой код с кодом в папке Completed чтобы увидеть инструкции включенные в этот пример.
Автор: Shersh