Ejemplo de demostración del sistema de cola PHP + RabbitMQ

RabbitMQ es un sistema de mensajería de nivel empresarial implementado sobre la base de AMQP. Lo que es un sistema de mensajes es un sistema de cola de mensajes. La cola de mensajes es un representante típico del "modelo consumidor-productor". Un extremo escribe continuamente mensajes en la cola de mensajes, mientras que el otro extremo puede leer o suscribirse a los mensajes en la cola. .

que? Modelo de consumidor-productor? Eso es correcto! Es el "modelo consumidor-productor" en el curso del sistema operativo de la universidad. Recuerdo que este problema me enfrentó en ese momento.

En el proyecto, se extraen algunas operaciones que no requieren un retorno inmediato y operaciones que consumen mucho tiempo y se realizan operaciones asincrónicas, y este método de procesamiento asincrónico ahorra en gran medida el tiempo de solicitud del servidor, mejorando así el rendimiento del sistema. Y no afecta al servidor para hacer otros correspondientes, no monopolice los recursos del servidor.

Por ejemplo, este servicio para usuarios registrados se puede desacoplar en varios servicios independientes (verificación de cuenta, código de verificación de correo electrónico, código de SMS de teléfono móvil, etc.). Actúan como consumidores, esperando que los usuarios ingresen datos. Después de enviar los datos de front-end, se descomponen y se envían a la url donde se encuentra cada servicio. El rol distribuido es equivalente al productor. Es posible que los consumidores no puedan procesar los datos una vez que los obtienen, por lo que cada uno tiene una cola de solicitud, que es el búfer de memoria. El marco para hacer este trabajo se llama colas de mensajes.

Otro ejemplo: el sistema de procesamiento de pedidos en el sistema de comercio electrónico, el modo de procesamiento tradicional es: al realizar un pedido, el sistema de pedidos puede llamar a la interfaz del sistema de inventario, por lo que existe una seria dependencia entre los dos sistemas, si el sistema de inventario está inactivo, Entonces todo el proceso se verá afectado. En la actualidad, los métodos de procesamiento de la mayoría de las empresas son: introducir una cola de mensajes, hacer un pedido, el sistema de pedidos completa el procesamiento de persistencia, escribir el mensaje en la cola de mensajes y devolver el pedido del usuario con éxito.

Para el sistema de inventario, el método de extracción / inserción se utiliza para obtener información del pedido, y el sistema de inventario realiza operaciones de inventario basadas en la información del pedido. Esto logra el desacoplamiento entre los dos sistemas.

El sistema de inventario no se puede usar normalmente incluso al realizar un pedido. No afecta la colocación normal de la orden, porque después de que se realiza la orden, el sistema de órdenes escribe en la cola de mensajes y ya no se preocupa por otras operaciones posteriores.

 Dar un diagrama estructural:

Varias descripciones de conceptos:

Broker: En pocas palabras, es la entidad del servidor de la cola de mensajes.
  Intercambio: Intercambio de mensajes, que especifica las reglas por las cuales los mensajes se enrutan a qué cola.
  Cola: portador de la cola de mensajes, cada mensaje se colocará en una o más colas.
  Enlace: Enlace, su función es vincular el intercambio y la cola de acuerdo con las reglas de enrutamiento.
  Clave de enrutamiento: clave de enrutamiento, el intercambio entrega mensajes basados ​​en esta clave.
  vhost: un host virtual. Se pueden configurar múltiples vhosts en un intermediario para separar los permisos de diferentes usuarios.
  productor: Un productor de mensajes es un programa que entrega mensajes.
  consumidor: un consumidor de mensajes es un programa que recibe mensajes.
  canal: canal de mensajes En cada conexión del cliente, se pueden establecer múltiples canales y cada canal representa una tarea de sesión.

El proceso de uso de la cola de mensajes es aproximadamente el siguiente:

(1) El cliente se conecta al servidor de la cola de mensajes y abre un canal.
  (2) El cliente declara un intercambio y establece propiedades relacionadas.
  (3) El cliente declara una cola y establece propiedades relacionadas.
  (4) El cliente utiliza la clave de enrutamiento para establecer una relación vinculante entre el intercambio y la cola.
  (5) El cliente entrega el mensaje al intercambio.

Después de que el intercambio recibe el mensaje, lo enrutará de acuerdo con la clave del mensaje y el enlace que se ha establecido, y entregará el mensaje a una o más colas.

También hay varios tipos de intercambio. La entrega directa se basa en la clave. Por ejemplo, cuando la clave de enlace se establece en "abc" durante el enlace, los mensajes enviados por el cliente solo se entregarán a la clave establecida en "abc". Cola El intercambio de claves se denomina Cambio de tema después de la coincidencia de patrones, el símbolo "#" coincide con una o más palabras y el símbolo "*" coincide exactamente con una palabra. Por ejemplo, "abc. #" Coincide "abc.def.ghi" y "abc. *" Solo coincide con "abc.def". También hay uno sin llave llamado Switch Fanout, que adopta el modo de transmisión. Cuando llega un mensaje, se entrega a todas las colas vinculadas al switch.

RabbitMQ admite la persistencia de los mensajes, es decir, los datos se escriben en el disco. En aras de la seguridad de los datos, creo que la mayoría de los usuarios elegirán la persistencia. La persistencia de la cola de mensajes incluye 3 partes:
  (1) persistencia de intercambio, especifique durable => 1 en el momento de la declaración
  (2) persistencia de la cola, especifique durable => 1 en el momento de la declaración
  (3) persistencia de mensaje, especificada en el momento de la entrega delivery_mode => 2 (1 no es persistente)

Si tanto el intercambio como la cola son persistentes, entonces el enlace entre ellos también es persistente. Si hay una persistencia entre el intercambio y la cola, y no persistente, no se permite establecer un enlace.

 

Bien, después de tanto hablar sobre los escenarios básicos de aplicación y los beneficios de RabbitMQ, practiquemos en la plataforma de Windows, veamos RabbitMQ de manera más intuitiva

Luego instalaré el entorno RabbitMQ + PHP:

1. Instalar RabbitMQ

 Antes de instalar RabbitMQ, primero debe instalar el kit de desarrollo del lenguaje Erlang, la dirección de descarga: http://www.erlang.org/download/otp_win32_R15B.exe se puede instalar de forma predeterminada

   Configure la variable de entorno ERLANG_HOME C: \ Archivos de programa (x86) \ erl5.9 

      Añadir a la RUTA% ERLANG_HOME% \ bin;

 Descargue e instale RabbitMQ, dirección de descarga: http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.4/rabbitmq-server-3.3.4.exe 

      Configure la variable de entorno C: \ Archivos de programa (x86) \ RabbitMQ Server \ rabbitmq_server-2.8.0

      Añadir a RUTA% RABBITMQ_SERVER% \ sbin;

  Luego, cambie al directorio RabbitMQ en dos, ejecute rabbitmq-plugins.bat, habilite rabbitmq_management y, una vez completada la instalación, inicie rabbitmq como administrador: ingrese el comando:

  rabbitmq-service.bat stop

  instalación de rabbitmq-service.bat

  Inicio de rabbitmq-service.bat

Luego, ingrese: 127.0.0.1: 15672 en el navegador, el nombre de usuario y la contraseña son invitados, si puede iniciar sesión, significa que la instalación se realizó correctamente.

 

 

2. A continuación, instale la extensión php amqp

En primer lugar () phpinfo información Ver versión de php, y , informaciones

Finalmente, descargue la versión de amqp correspondiente de acuerdo con la información anterior: http://pecl.php.net/package/amqp

De acuerdo con la información anterior, somos una versión no segura para subprocesos de 32 bits

Después de la presurización:

Copie php_amqp.dll en php / ext y agregue el siguiente código a php.ini:

[amqp]  

extension = php_amqp.dll 

Luego copie rabbitmq.1.dll al directorio raíz de php C: / xampp / php /, modifique el archivo de configuración de apache httpd.conf y agregue el siguiente código:

# rabbitmq

LoadFile "C: /xampp/php/rabbitmq.1.dll"  

Finalmente reinicie para ver si se ha cargado el módulo amqp:

 

--------------------------------- Hasta aquí, la instalación ha terminado ---------- ---------------------------------------

 

Ejemplo de visualización de RabbitMQ + PHP

Nuevo rabbit_consumer.php como consumidor

<?php 
//配置信息 
$conn_args = array( 
    'host' => '127.0.0.1',  
    'port' => '5672',  
    'login' => 'guest',  
    'password' => 'guest', 
    'vhost'=>'/' 
);   
$e_name = 'e_linvo'; //交换机名 
$q_name = 'q_linvo'; //队列名 
$k_route = 'key_1'; //路由key 
 
//创建连接和channel 
$conn = new AMQPConnection($conn_args);   
if (!$conn->connect()) {   
    die("Cannot connect to the broker!\n");   
}   
$channel = new AMQPChannel($conn);   
 
//创建交换机    
$ex = new AMQPExchange($channel);   
$ex->setName($e_name); 
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型  
$ex->setFlags(AMQP_DURABLE); //持久化 
echo "Exchange Status:".$ex->declare()."\n";   
   
//创建队列    
$q = new AMQPQueue($channel); 
$q->setName($q_name);   
$q->setFlags(AMQP_DURABLE); //持久化  
echo "Message Total:".$q->declare()."\n";   
 
//绑定交换机与队列,并指定路由键 
echo 'Queue Bind: '.$q->bind($e_name, $k_route)."\n"; 
 
//阻塞模式接收消息 
echo "Message:\n";   
while(True){ 
    $q->consume('processMessage');   
    //$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答  
} 
$conn->disconnect();   
 
/**
 * 消费回调函数
 * 处理消息
 */ 
function processMessage($envelope, $queue) { 
    $msg = $envelope->getBody(); 
    echo $msg."\n"; //处理消息 
    $queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答 
}
?>

 

 Crea rabbit_publisher.php como productor

<?php
//配置信息 
$conn_args = array( 
    'host' => '127.0.0.1',  
    'port' => '5672',  
    'login' => 'guest',  
    'password' => 'guest', 
    'vhost'=>'/' 
);   
$e_name = 'e_linvo'; //交换机名 
//$q_name = 'q_linvo'; //无需队列名 
$k_route = 'key_1'; //路由key 
 
//创建连接和channel 
$conn = new AMQPConnection($conn_args);   
if (!$conn->connect()) {   
    die("Cannot connect to the broker!\n");   
}   
$channel = new AMQPChannel($conn);   
 

 
//创建交换机对象    
$ex = new AMQPExchange($channel);   
$ex->setName($e_name);   
date_default_timezone_set("Asia/Shanghai");
//发送消息 
//$channel->startTransaction(); //开始事务  
for($i=0; $i<5; ++$i){ 
    sleep(1);//休眠1秒
    //消息内容 
    $message = "TEST MESSAGE!".date("h:i:sa");   
    echo "Send Message:".$ex->publish($message, $k_route)."\n";  
} 
//$channel->commitTransaction(); //提交事务 
 
$conn->disconnect();
?>

 

Pruébalo:

Inicie una ventana y cambie al directorio php, ingrese: php c: /xampp/htdocs/RabbitMQ/rabbit_consumer.php

Consumidor corriente

 

Luego abra una ventana de DOS, cambie al directorio raíz de php, ingrese el siguiente comando: php c: /xampp/htdocs/RabbitMQ/rabbit_publisher.php

Productor corriente

El consumidor recibe el mensaje

 

 Esto simula el procesamiento de mensajes por la cola RabbitMQ.

 Aquí está la guía de uso de php del sitio web oficial: http://www.rabbitmq.com/tutorials/tutorial-one-php.html

Publicado 23 artículos originales · ganó 2 · vistas 5253

Supongo que te gusta

Origin blog.csdn.net/bianlitongcn/article/details/93887467
Recomendado
Clasificación