_МЕЖДУНАРОДНЫЙ НАУЧНЫЙ ЖУРНАЛ «СИМВОЛ НАУКИ» №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));
// сохраняем полное состояние 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)