1. Introducción a Akka e introducción a las API comunes

Introducción a Akka

Akka es un conjunto de herramientas para crear aplicaciones de alta concurrencia, distribuidas y tolerantes a fallas en la plataforma de la máquina virtual Java. Akka está escrito en lenguaje Scala y también proporciona interfaces de desarrollo para Scala y Java.

Akka se puede utilizar de dos formas diferentes

  • En forma de biblioteca: se utiliza en aplicaciones web, se coloca en WEB-INF / lib o se coloca en la ruta de clase como un paquete Jar normal.
  • En forma de microkernel: puede poner su aplicación en un kernel separado. Tengo una clase principal para inicializar el sistema Actor.

Varias características de Akka

  1. Aplicaciones distribuidas y paralelas fáciles de construir (Simultaneidad y distribución)

    Akka adopta la comunicación asincrónica y la arquitectura distribuida al diseñar, y abstrae la capa superior, como Actores, Futuros, STM, etc.

  2. Tolerancia a fallas (resistente por diseño)

    El sistema tiene capacidad de autocuración y monitorea local y remotamente.

  3. Alto rendimiento

    En una sola máquina, se pueden enviar 50 millones de mensajes por segundo. La huella de memoria es pequeña, se pueden almacenar 2,5 millones de actores en 1 GB de memoria.

  4. Elástico, descentralizado (elástico - descentralizado)

    Auto-adaptable responsable del equilibrio, el enrutamiento, la partición y la configuración

  5. Extensible

    Puede utilizar el paquete de extensión Akka para la extensión.

En el mundo de Akka, solo hay un contenido que debe aprenderse y gestionarse, con una alta cohesión y una semántica de alta coherencia. Akka es un software altamente escalable, no solo en términos de rendimiento, sino también en el tamaño de la aplicación a la que se aplica. El núcleo de Akka, Akka-actor es muy pequeño y se puede colocar fácilmente en su aplicación para proporcionar las funciones paralelas asincrónicas sin bloqueo que necesita sin ningún problema. Puede elegir cualquier parte de Akka para integrarla en su aplicación, o puede utilizar el paquete completo: microkernel Akka, que es un contenedor independiente que puede implementar directamente su aplicación Akka. Con el creciente número de núcleos de CPU, incluso si solo usa una computadora, Akka también se puede usar como una opción para proporcionar un rendimiento excelente. Akka también proporciona una variedad de paradigmas de concurrencia, lo que permite a los usuarios elegir la herramienta adecuada para completar el trabajo.

Akka es fácil de usar

Utilice IDEA + Maven para crear un entorno de desarrollo Akka.

  1. Importar dependencias de Maven

    <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <encoding>UTF-8</encoding>
            <scala.version>2.11.8</scala.version>
            <scala.compat.version>2.11</scala.compat.version>
            <akka.version>2.3.6</akka.version>
        </properties>
    
        <dependencies>
            <!-- 添加scala的依赖 -->
            <dependency>
                <groupId>org.scala-lang</groupId>
                <artifactId>scala-library</artifactId>
                <version>${
          
          scala.version}</version>
            </dependency>
            <!-- 添加akka的actor依赖 -->
            <dependency>
                <groupId>com.typesafe.akka</groupId>
                <artifactId>akka-actor_${
          
          scala.compat.version}</artifactId>
                <version>${
          
          akka.version}</version>
            </dependency>
            <!-- 多进程之间的Actor通信 -->
            <dependency>
                <groupId>com.typesafe.akka</groupId>
                <artifactId>akka-remote_${
          
          scala.compat.version}</artifactId>
                <version>${
          
          akka.version}</version>
            </dependency>
        </dependencies>
    
  2. Java implementa la demostración del actor

    /**
     * @author li.pan
     * @version 1.0.0
     * @Description TODO
     * @createTime 2020年12月22日 20:18:00
     */
    public class JavaPongActor extends AbstractActor {
          
          
    
        /**
         * AbstractActor 类有一个 receive 方法,其子类必须实现这个方法或是通过构造函数调用该方法。
         *
         * @return 返回的类型是PartialFunction(偏函数), 这个类型来自Scala API。在Java中
         * Akka为我们提供了一个抽象的构造方法类ReceiveBuilder,用于生成 PartialFunction 作为返回值。
         */
        @Override
        public PartialFunction receive() {
          
          
            return ReceiveBuilder
                    // matchEquals和matchAny用来匹配消息
                    .matchEquals("Ping", s ->
                            sender().tell("Pong", ActorRef.noSender()))
                    .match(String.class, s ->
                            System.out.println("It's a string: " + s))
                    .matchAny(x ->
                            sender().tell(
                                    new Status.Failure(new Exception("unknown message")), self()))
                    .build();
        }
    }
    

    El código Java anterior muestra cómo utilizar la API de Java correspondiente en Akka. El significado de cada API específica es el siguiente:

    método sentido
    Recibir La clase AbstractActor tiene un método de recepción y sus subclases deben implementar este método o llamar al método a través del constructor. El tipo devuelto por el método de recepción es PartialFunction, que proviene de la API de Scala. En Java, no existe un método nativo para construir Scala PartialFunction (función parcial), por lo que Akka nos proporciona una clase de constructor abstracto
    ReceiveBuilder Utilice principalmente el método Build para devolver PartialFunction
    Fósforo Similar a la coincidencia de patrones en Scala, se utiliza para la coincidencia de mensajes:
    coincidencia (clase, función) : describe cómo responder a cualquier ejemplo de este tipo que aún no se haya emparejado.
    match(String.class, s -> {if(s.equals("Ping")) respondToPing(s);})
    coincidencia (clase, predicado, función) : describe cómo responder a un tipo específico de mensaje donde la función de condición de predicado es verdadera.
    match(String.class, s -> s.equals("Ping"), s -> respondToPing(s))
    matchEquals (objeto, función) : describe cómo responder a un mensaje igual al primer parámetro pasado.
    matchEquals("Ping", s -> respondToPing(s))
    matchAny (función) : esta función coincide con todos los mensajes no coincidentes. En términos generales, la mejor práctica es devolver mensajes de error o al menos registrar los mensajes de error para ayudar a depurar errores durante el proceso de desarrollo.
    Remitente Devuelve la respuesta al mensaje recibido El objeto de la respuesta puede ser un Actor o una solicitud desde fuera del sistema Actor.
    Decir La función sender () devuelve ActorRef. En el ejemplo anterior, llamamos sender (). Tell (). tell () es el modo de transmisión de mensajes unidireccional más básico. El primer parámetro es el mensaje que queremos enviar al buzón de la otra parte. El segundo parámetro es el remitente que desea que vea el otro actor.
    Preguntar Envía un mensaje al actor y devuelve un futuro. Cuando el actor devuelva una respuesta, el futuro se completará. No se devolverá ningún mensaje al buzón del remitente.
    Adelante Envíe el mensaje recibido a otro actor. Todas las respuestas enviadas al remitente () se devolverán al remitente del mensaje original.
    Tubo Se usa para devolver el resultado del futuro al remitente () u otro actor. Si está utilizando Ask o procesando un futuro, entonces el uso de Pipe puede devolver correctamente el resultado del futuro.
  3. Scala implementa la demostración de actor

    class ScalaPongActor extends Actor {
          
          
      override def receive: Receive = {
          
          
        case "Ping" => sender() ! "Pong"
        case _ => sender() ! Status.Failure(new Exception("unknown message"))
      }
    }
    

    El código anterior usa el lenguaje Scala para implementar un actor simple. La mayor parte de su API tiene el mismo significado que en Java. Algunas de las diferencias en el uso son las siguientes:

    método sentido
    Recibir Anula el método de recepción de la clase base en Actor. Y devuelve PartialFunction. Cabe señalar que el tipo de retorno del método de recepción es Recibir. Recibir es solo un tipo de definición, lo que significa scala.PartialFunction [scala.Any, scala.Unit].
    Remitente Devuelve la respuesta al mensaje recibido El objeto de la respuesta puede ser un Actor o una solicitud desde fuera del sistema Actor.
    ! En Scala, el método tell es llamado por "!". En Scala, el remitente del mensaje se pasa implícitamente, por lo que no es necesario pasar explícitamente la referencia del remitente del mensaje. En la firma del método del método tell "!", Hay un parámetro ActorRef implícito. Si el método tell se llama fuera del Actor, el valor predeterminado de este parámetro se establecerá en noSender. Aquí está la firma del método:
    def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
    ? "?" en scala significa preguntar.
    Falla Cuando se recibe un mensaje desconocido, se devuelve akka.actor.Status.Failure. El propio actor no devolverá el fallo por sí mismo bajo ninguna circunstancia (incluso si el propio actor tiene un error). Por lo tanto, si queremos notificar al remitente de un error que se ha producido, debemos enviar activamente un Fallo a la otra parte. Enviarlo de nuevo a Fallido hará que el futuro del solicitante se marque como fallido.

    Otra cosa a tener en cuenta es que hay una variable implícita self en Actor en Scala, y Actor obtiene el valor del remitente del mensaje a través de self. Por lo tanto, el remitente del mensaje del método tell en Actor es siempre self.

    implicit final val self = context.self
    

¡Preste atención a la cuenta oficial 数据工匠记y concéntrese en los productos secos técnicos en tiempo real y fuera de línea en el campo de big data para compartir con regularidad! Sitio web personal www.lllpan.top
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/lp284558195/article/details/111567913
Recomendado
Clasificación