Научная статья на тему 'Akka. Net для построения высоконадежных и слабосвязанных Web- систем'

Akka. Net для построения высоконадежных и слабосвязанных Web- систем Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
1275
94
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
AKKA.NET / АКТОР / АКТОР-МОДЕЛЬ / ПОТОКОБЕЗОПАСТНОСТЬ / WEB-СЕРВИС / ПРОИЗВОДИТЕЛЬНОСТЬ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Артамошкин М. С.

Статья посвящена рассмотрению принципов актор-систем и решению проблем высоконагруженных сервисов при помощи библиотеки Akka.NET.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Akka. Net для построения высоконадежных и слабосвязанных Web- систем»

_МЕЖДУНАРОДНЫЙ НАУЧНЫЙ ЖУРНАЛ «СИМВОЛ НАУКИ» №4/2016 ISSN 2410-700Х_

ФИЗИКО-МАТЕМАТИЧЕСКИЕ НАУКИ

УДК 004.052.2

Артамошкин Максим Сергеевич

студент 4 курса ФГБОУ ВПО «МГУ им. Н.П. Огарёва», г.Саранск, РФ, E-mail: [email protected]

AKKA.NET ДЛЯ ПОСТРОЕНИЯ ВЫСОКОНАДЕЖНЫХ И СЛАБОСВЯЗАННЫХ WEB-СИСТЕМ

Аннотация

Статья посвящена рассмотрению принципов актор-систем и решению проблем высоконагруженных сервисов при помощи библиотеки Akka.NET.

Ключевые слова

Akka.NET, актор, актор-модель, потокобезопастность, web-сервис, производительность

Для 99% сложных технических проблем, с которыми разработчики сталкиваются сегодня, было найдено решение в начале 1970 году: модель акторов.

Предпосылка актор-модели заключается в том, что каждый компонент в этой системе есть «актор», и между акторами происходит общение, путем передачи сообщений между собой. Акторы имеют уникальные адреса внутри актор-системы, даже находясь на нескольких физических компьютерах, можно направить конкретное сообщение конкретному актору. У акторов также есть иерархия, родительские акторы контролируют дочерних, которые находятся на уровень ниже. Если дочерний актор внезапно выходит из строя, то родительский актор может принять решение о том, как поступить дальше.

Так чем же привлекательна модель актора? Основные преимущества:

1. Акторы очень «дешевые» — вы можете создать 10 миллионов с минимальными системными затратами.

2. Иерархия актора и наблюдение за дочерними, делает нашу систему самовосстанавливающейся и стабильной.

3. Актор-модель предоставляет простое API для параллельных вычислений.

4. Удаленное взаимодействие между актор-системами упрощает маршрутизацию данных для каждого пользователя в определенном месте.

5. Актор обрабатывает только одно сообщение из очереди.

Akka.NET предоставляет все эти возможности на языках C# и F#.

Устройство актора в Akka.NET включает себя поведение, «почтовый ящик», состояние, его «детей» и стратегию руководителя.

13141 Транспорт 5

Актор

Почтовый П И ящик КЯ Ei

Поведение

Состояние

Стратегия руководитель

Дети

Рисунок 1 - Устройство актора в Akka.NET.

_МЕЖДУНАРОДНЫЙ НАУЧНЫЙ ЖУРНАЛ «СИМВОЛ НАУКИ» №4/2016 ISSN 2410-700Х_

Актор должен быть защищен от воздействия извне. Таким образом, акторы доступны извне по ссылке, которые представлены объектом. Деление на внутренний и внешний объект обеспечивает прозрачность для всех операций. Но более важным аспектом является то, что нет возможности заглянуть во внутрь актора и получить его состояние снаружи. [1]

Состояние. Объекты актора, как правило, содержат переменные, которые отражают его состояния. Это могут быть самые разные данные, которые делают актора полезным.

Поведение. Каждое сообщение переданное на обработку, будет сравниваться с поведением актора. Поведение означает функцию, с определенными действиями, которые будут предприняты в ответ на сообщения, например, записать данные пользователя и отправить уведомление об успешной операции записи. Поведение может изменяться с течением времени. Однако, первоначальное поведение определяются во время строительства его объекта, после перезапуска его поведение вернется в первоначальное состояние.

«Почтовый ящик». Целью актора является обработка сообщений, и эти сообщения принимаются из других акторов (или из пределов актор-системы). Место, куда приходят сообщения от других акторов называется «почтовый ящик». Актор имеет только один «почтовый ящик», где сообщения ставятся в очередь точно в том же порядке в каком они были получены. Примером сообщения служит обычный класс C#.

«Дети». Каждый актор может стать руководителем. Если он создает детей, то он автоматически становится руководителем. Список «детей» хранится в контексте.

Стратегия руководителя. В последней части актора находится стратегия для обработки ошибок его «детей». Устранение неисправностей в Akka становится довольно прозрачным, применяя стратегию отписки наблюдения и мониторинга, для всех кто вышел из строя.

Рисунок 2 - Стратегия наблюдателя «один для одного».

Акторы в C# реализуются путем расширения класса ReceiveActor и настройки, что получает сообщения используя Receive<TMessage> метод.

Props это объект который используется для создания актора в главной ActorSystem или в рамках другого актора. [2]

Props sampleActorProps = Props.Create<SampleActor>();

При помощи Akka.NET построим систему явного подтверждения обработки сообщений. В точке входа в приложение создадим актор-систему, принимающий актор и актор доставки.

using (var actorSystem = ActorSystem.Create("DeliverySystem"))

{

var recipientActor = actorSystem.ActorOf(Props.Create(() => new RecipientActor()), "receiver");

var deliveryActor = actorSystem.ActorOf(Props.Create(0 => new DeHveryActor(recipientActor)), "delivery");

actorSystem .WhenTerminated.Wait(); }

Опишем типы сообщений.

public class DeliveryEnvelope<TMessage> {

public DeliveryEnvelope(TMessage message, long messageId) {

Message = message; MessageId = messageId;

}

public TMessage Message { get; private set; } public long MessageId { get; private set; }

}

public class DeliveryAck {

public DeliveryAck(long messageId) {

MessageId = messageId;

}

public long MessageId { get; private set; }

}

public class Write {

public Write(string content) {

Content = content;

}

public string Content { get; private set; }

}

Далее опишем принимающий актор.

public RecipientActor() {

Receive<DeliveryEnvelope<Write>>(write => {

Console.WriteLine("Получено сообщение {0} [id: {1}] от {2} - подтвердить?", write.Message.Content, write.MessageId, Sender);

var response = Console.ReadLine()?.ToLowerInvariant();

if (!string.IsNullOrEmpty(response) && (response^u^^^") || response.Equals('V))) {

// подтверждаем доставку

Sender.Tell(new DeliveryAck(write.MessageId));

Console.WriteLme($"Подтверждение сообщения {write.MessageId}",);

}

else {

Console.WriteLine($"Сообщение {write.MessageId} не подтверждено");

_МЕЖДУНАРОДНЫЙ НАУЧНЫЙ ЖУРНАЛ «СИМВОЛ НАУКИ» №4/2016 ISSN 2410-700Х_

}

});

}

Затем опишем актор доставки сообщений.

public class DeliveryActor : AtLeastOnceDeliveryReceiveActor {

public override string PersistenceId => Context.Self.Path.Name;

private int counter = 0;

private class DoSend { }

private class CleanSnapshots { }

private ICancelable messageSend;

private readonly IActorRef targetActor;

private ICancelable snapshotCleanup;

const string Characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public DeliveryActor(IActorRef targetActor) {

this.targetActor = targetActor;

// восстановим последнее состояние доставки

Recover<SnapshotOffer>(offer => offer.Snapshot is AtLeastOnceDeliverySnapshot, offer => {

var snapshot = offer.Snapshot as AtLeastOnceDeliverySnapshot; SetDeliverySnapshot(snapshot);

});

Command<DoSend>(send => {

Self.Tell(new Write("Сообщение " + Characters[this.counter++ % Characters.Length]));

});

Command<Write>(write => {

Deliver(this.targetActor.Path, messageId => new DeliveryEnvelope<Write>(write, messageId));

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

// сохраняем полное состояние SaveSnapshot(GetDeliverySnapshot());

});

Command<DeliveryAck>(ack => {

ConfirmDelivery(ack.MessageId);

});

Command<CleanSnapshots>(clean => {

// сохранить текущее состояние подтверждений SaveSnapshot(GetDeliverySnapshot());

Command<SaveSnapshotSuccess>(saved => {

var seqNo = saved.Metadata.SequenceNr; DeleteSnapshots(new SnapshotSelectionCriteria(seqNo, saved.Metadata.Timestamp.AddMilliseconds(-1))); //удалить все, кроме текущего состояния

}); }

protected override void PreStart()

{

this.messageSend =

Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(10), Self, new DoSend(), Self);

this.snapshotCleanup =

Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10), Self, new CleanSnapshots(), ActorRefs.NoSender);

base.PreStart();

}

protected override void PostStop()

{

this.snapshotCleanup?.Cancel(); this.messageSend?.Cancel();

base.PostStop();

}

} [3]

Подтверждено сообщение ID 12 Получено сообщение Message В [id:

2] от [akka://AtLeastOnceDeliveryOemo/user/delivery] - подтвердить?

Сообщение не подтверждено ID 2 Получено сообщение Message С [id:

3] от [akka://AtLeastOnceDeliveryDemo/user/delivery] - подтвердить?

Подтверждено сообщение ID 3 Получено сообщение Message D [id:

4] от [akka://AtLeastOnceDeliveryDemo/user/delivery] - подтвердить?

Сообщение не подтверждено ID 4 Получено сообщение Message Е [id:

5] от [akka://AtLeastOnceDeliveryDemo/user/delivery] - подтвердить?

Сообщение не подтверждено ID 5 Получено сообщение Message F [id:

6] от [akka://AtLeastOnceDeliveryDemo/user/delivery] - подтвердить?

Рисунок 3 - Результат выполнения программы.

Akka.NET — это благо для производительности, так как программирование ее моделей просты — вместо того, чтобы писать код, который, к примеру, пытается присвоить права компании для 100 000 пользователей параллельно, вместо этого мы можем написать не большую часть кода, который делает это определение для одного пользователя и запускает 100 000 экземпляров с минимальными затратами. [4]

Благодаря идеологии Akka.NET легко построить сложные, но надежные системы с простой реализацией, что гораздо облегчает дальнейшее их сопровождение.

_МЕЖДУНАРОДНЫЙ НАУЧНЫЙ ЖУРНАЛ «СИМВОЛ НАУКИ» №4/2016 ISSN 2410-700Х_

Список использованной литературы:

1. Actors // http://getakka.net/ URL: http://getakka.net/docs/concepts/actors#mailbox (дата обращения: 18.04.2016).

2. A Look At Akka.NET // http://www.codeproject.com/ URL: http://www.codeproject.com/Articles/1007161/A-Look-At-Akka-NET#Props—Creating-Child-Actors (дата обращения: 18.04.2016).

3. How to Guarantee Delivery of Messages in Akka.NET // Petabridge URL: https://petabridge.com/blog/akkadotnet-at-least-once-message-delivery/ (дата обращения: 20.04.2016).

4. Real-time Marketing Automation with Distributed Actor Systems and Akka.NET // http://blog.markedup.com/ URL: http://blog.markedup.com/2014/07/real-time-marketing-automation-with-distributed-actor-systems-and-akka-net/ (дата обращения: 17.04.2016).

© Артамошкин М.С., 2016

УДК 51

Бойкова Наталья Адамовна

к.ф-м.н., доцент СГУ, г. Саратов, Российская Федерация

ТОНКАЯ СТРУКТУРА ЭНЕРГЕТИЧЕСКИХ УРОВНЕЙ ДЛЯ ЭКЗОТИЧЕСКИХ АТОМОВ

Аннотация

Анализируются способы устранения инфракрасных особенностей при исследовании величины тонкого сдвига в водородоподобных и экзотических атомах. Обосновывается необходимость учета кинематической части квазипотенциала для корректного построения ряда теории возмущений.

Ключевые слова:

тонкий сдвиг, квазипотенциальный подход, теория возмущений, экзотический атом, кулоновский фотон,

амплитуда рассеяния.

Введение

Интерес к исследованию спектров водородоподобных и экзотических атомов не ослабевает. Опубликованы обзоры с анализом и систематизацией теоретических и экспериментальных результатов исследований атомных спектров [1, 633], [2, 233], [3, 63]. Одно из главных направлений исследований -изучение тонкой структуры спектральных линий. Интервал 2$1/2 —1£1/2 в атоме водорода измерен в

настоящее время с точностью до десятка Гц

3 = 2 466 061 413 187 103 (46) Гц. (1)

Прогресс, достигнутый в последних экспериментах лазерной спектроскопии, ставит перед теорией задачу повышения точности расчетов энергетических сдвигов в атомах, что тесно связано с решением проблем метрологии и развитием физики элементарных частиц [4, 1060].

Рассмотрим замкнутую систему двух фермионов. В системе центра масс энергия связанного состояния двух частиц представляется в виде:

Е = Б + Б = т + т2 + Ж, Ж = (2)

1212 2п2

Используем основное уравнение квазипотенциального подхода [5, 34] для определения собственных значений полной энергии Е :

(Е — ^ р Р)Ф) = / У(Р'Ч'Е)ф(ч)а 3 Я, (3)

i Надоели баннеры? Вы всегда можете отключить рекламу.