Хотите узнать об AKKA, высокопроизводительной отказоустойчивой распределенной среде?

Java

Введение в структуру

AKKA — это высокопроизводительная, отказоустойчивая распределенная и параллельная среда приложений. Она следует лицензии с открытым исходным кодом Apache2 и основана на классической модели параллелизма актеров. Нижний уровень реализован на языке Scala и предоставляет API Java и Scala.

  • Параллелизм и параллелизм. Обеспечивает высокий уровень абстракции для параллелизма и параллелизма.
  • Асинхронная неблокировка: обмен сообщениями Akka-Actor основан на асинхронной неблокировке.
  • Высокая отказоустойчивость: обеспечивает надежную обработку отказоустойчивости для распределенных моделей между несколькими JVM, известную как Never Down.
  • Постоянство: состояние или сообщения, переносимые субъектом, могут сохраняться, чтобы можно было восстановить состояние после сбоя JVM.
  • Легкий: каждый Актер занимает всего около 300 байт, а память 1G может вместить почти 3 миллиона Актеров.



Почтовый ящик: у каждого Актера есть свой почтовый ящик, и сообщения, отправленные другими Актерами, будут поступать в этот почтовый ящик. Akka поставляется с различными типами почтовых ящиков, а также предоставляет интерфейс для настраиваемых почтовых ящиков. (Тип почтового ящика по умолчанию — UnboundedMailbox, нижний уровень — ConcurrentLinkedQueue, неблокирующая, неограниченная очередь)

Маршрутизация: сообщения в дополнение к прохождению через обычных Актеров Помимо отправки, его также можно отправить маршрутизацией. Стратегии маршрутизации включают опрос, широковещание и т. д. Маршрут также может быть Актером.

Сохранение состояния: журналы на основе кучи в памяти, хранилище моментальных снимков на основе локальной файловой системы и журналы на основе LevelDB.

Сеть: используется для реализации удаленных субъектов и распределенных кластеров, включая ввод-вывод, сетевую связь (TCP/UDP), последовательную конфигурацию, протокол распределенной связи (Gossip), управление узлами, сегментирование кластера и т. д.

Модуль HTTP: Akka предоставляет простой в использовании модуль HTTP, поддерживает полную разработку HTTP-сервера и клиента, а также быстро создает высокопроизводительные веб-сервисы Rest.

Актер Модель

Актер — это модель распределенного параллельного программирования, предложенная в 1973 году. Дизайн основан на управлении сообщениями и неблокировке. Думайте, что все является Актером.

Актер — это основная концепция Akka и самая основная исполнительная единица. Актер считает, что наименьшая единица параллельных вычислений — это экземпляр Актера, и у каждого экземпляра есть свое состояние и поведение.В большой системе могут быть тысячи экземпляров Актера, и они общаются друг с другом с помощью сообщений.Актеры могут отправлять сообщения и получать сообщения от других Актеров.

Справочная статья:

https://www.jianshu.com/p/d803e2a7de8eActor

Особенности актера

Ссылка: вы не можете напрямую создать объект Актера традиционным «новым» способом, через ActorOf Или же ActorSelection и другие методы возвращают объект ActorRef, который может существовать локально или в удаленных узлах.

Состояние: Актеры могут иметь разные состояния в разное время.Эти состояния представлены переменными и могут быть сохранены.

Поведение: Актер Он может получать и отправлять сообщения. Всякий раз, когда он получает сообщение, он может выполнять бизнес-операцию, а также может пересылать сообщение другим узлам для обработки.

Стратегия надзора: Система Акторов представляет собой иерархическую структуру, когда Актор распределяет задачи дочерним Акторам. Когда родительский Актер обязан контролировать дочернего Актера. При наблюдении нам необходимо выбирать различные решения для обработки (такие как остановка, перезапуск, восстановление или отслеживание сбоя) и стратегии в соответствии с различными ситуациями.

Безопасность потоков: Актеры Работая поверх пула потоков, AKKA абстрагирует облегченный «поток» выполнения для каждого Актера, поэтому один Актер всегда является потокобезопасным и по своей сути последовательным при обработке полученных сообщений.

Легкий: в Акке каждый Актер занимает всего 300 Байты или около того, поддерживает распределенный режим.

Определение актера

В Akka Актеры условно делятся на две категории:

  • UntypedActor: На основе классической реализации модели Актера, управляемой сообщениями, рекомендуется использовать ее для определения Актера.
  • TypedActor: обычный код ООП упакован в асинхронно исполняемый объект Actor, который больше соответствует логике вызова API программиста, но процесс использования немного сложнее, поэтому в этот раз я не буду его обсуждать.

Определите Актера, наследуя UntypedActor.Метод onReceive используется для получения и обработки сообщений и сопоставления типа сообщения.Если соответствующий тип сообщения не может быть сопоставлен, используйте необработанный для обработки.


Создание актера

Сначала загрузите необходимые зависимости

<dependency>    
    <groupId>com.typesafe.akka</groupId>    
    <artifactId>akka-actor_2.11</artifactId>  
    <version>2.4.1</version>
</dependency>
<dependency>
    <groupId>com.typesafe.akka</groupId>   
    <artifactId>akka-remote_2.11</artifactId>   
    <version>2.4.1</version>
</dependency>

Актеры создаются с помощью метода actOf системы ActorSystem:

ActorSystem system = ActorSystem.create(“hiseePS”); ActorRef actorRef = system.actorOf(Props.create(ActorDemo.class),"actorDemo");

  • ActorOf возвращает не сам Актер, а ActorRef, ссылку на Актера, через который мы обмениваемся сообщениями.
  • Если у конструктора Актера есть параметры, их можно передать через метод create.
  • Созданный ActorSystem — это Актер верхнего уровня (то есть ветвь Актера под /user).Если вы хотите создать иерархическую сеть Актеров, задача передается дочернему Актеру для обработки, а родитель отвечает за контроль над ребенок. Дочерние акторы могут быть созданы с помощью getContext в Actors.

ActorRef childActor = getContext().actorOf(Props.create(ChildActor.class ),"childActor");


Каждый Актер имеет свой собственный путь после создания, который следует за ActorSystem. Иерархия:akka://mysys/user/parentActor/childActor akka.tcp://mysys@l27.0.0.1:2554/user/parentActor/childActor

mysys — это имя ActorSystem, /user — корневой узел по умолчанию для Актера, созданного пользователем, а parentActor и childActor — родительский и дочерний Актеры соответственно.

Сообщения актера

Есть два способа связи с Актером через объект ActorRef. Пишите сообщения, рассказывайте и спрашивайте. Все они отправляют сообщения асинхронно, разница в том, что первые возвращаются сразу после отправки, а вторые ожидают возврата результата, и если в течение установленного времени (Timeout) результат возврата не получен, отправитель получит исключение тайм-аута. любой актер Отправленные сообщения принимаются через метод Receive.

метод tell:actorRef.tell("Здравствуйте! Акка", ActorRef.noSender());

Первый параметр — это «сообщение», которое может быть любыми сериализуемыми данными или объектом, а второй параметр представляет отправителя, который является другим Актером. Ссылка на noSender() означает отсутствие отправителя (актер системы deadLetters по умолчанию). Если вы хотите получить отправителя сообщения внутри Актера, вы можете вызвать метод getSender(). После вызова метода tell Актер Сообщение будет обработано асинхронно без блокировки выполнения последующего кода.

Метод ask: Когда нам нужно получить возвращаемый результат от Актера, мы можем использовать ask, который является типичным шаблоном «запрос-ответ». Метод ask поместит возвращенный результат в scala.concurrent.Future (который можно понимать как поток режима Future), который может (блокировать) получить это значение или получить это значение с помощью асинхронной функции обратного вызова.Учитывая проблемы с производительностью, мы часто используют последнее.

Спросите тест метода


Пересылка сообщений актера

пересылка сообщений:

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


Другое использование

1. Для существующего Актера мы можем искать по пути

ActorSelection=[ActorSystem/ActorContext].actorSelecton([path]);

2. Переключение поведения актера: пример кода (BecomeActor)

3. Жизненный цикл актера

Актеры проходят различные этапы во время выполнения, такие как создание, запуск, перезапуск и уничтожение и т. д. Эта последовательность процессов или состояний называется жизненным циклом.

4. Надзор и отказоустойчивость

5. Автоматический выключатель

Я не буду вводить их по одному, заинтересованные студенты могут узнать сами.

Что ж, краткое введение в AKKA здесь. Я пишу это впервые. Если письмо не очень хорошее, пожалуйста, дайте мне несколько советов.