TigerZF
🌐Español

19.2. Introducción a Queue Service

QueueService implementa el acceso a colas de mensajes disponibles como servicios locales o remotos. Las colas simples que soporta QueueService implementan un patrón de mensajería que permite que diferentes procesos intercambien mensajes de forma fiable y escalable. Un caso de uso común para dichas colas de mensajes es el despacho de trabajos, en el que un servidor web frontend añade un trabajo complejo a una cola para que un worker backend realice el procesamiento costoso. El servidor web frontend puede entonces devolver la página sin esperar a que se complete el trabajo.

La interfaz Zend_Cloud_QueueService_Adapter define los métodos que deben implementar los adaptadores concretos de servicios de cola. Los siguientes adaptadores se distribuyen con la Simple Cloud API:

19.2.1. Instanciar y configurar adaptadores de QueueService

Para instanciar un adaptador de QueueService, use el método estático Zend_Cloud_QueueService_Factory::getAdapter(), que acepta un array o un objeto Zend_Config. Tres parámetros se aplican a todos los adaptadores, mientras que el resto de parámetros son propiedades específicas del adaptador; estas propiedades específicas del adaptador a menudo contienen detalles de acceso.

Los parámetros generales son los siguientes:

  • queue_adapter especifica la clase de adaptador concreta;

  • message_class especifica la clase a usar para representar los mensajes de la cola; por defecto es Zend_Cloud_QueueService_Message; y

  • messageset_class especifica la clase a usar para representar colecciones de mensajes de la cola; por defecto es Zend_Cloud_QueueService_MesageSet.

Ejemplo 19.17. Instanciar un adaptador de Amazon SQS mediante la fábrica

$queues = Zend_Cloud_QueueService_Factory::getAdapter(array(
    Zend_Cloud_QueueService_Factory::QUEUE_ADAPTER_KEY  => 'Zend_Cloud_QueueService_Adapter_Sqs',
    Zend_Cloud_QueueService_Adapter_Sqs::AWS_ACCESS_KEY => $amazonKey,
    Zend_Cloud_QueueService_Adapter_Sqs::AWS_SECRET_KEY => $amazonSecret,
));

19.2.1.1. Opciones específicas del servicio

Tabla 19.4. Opciones de Zend_Cloud_QueueService_Adapter_Sqs

Clave de opción Descripción Usado en Requerido Por defecto
aws_accesskey Su clave de acceso de Amazon AWS Constructor Ninguno
aws_secretkey Su clave secreta de Amazon AWS Constructor Ninguno
http_adapter Adaptador HTTP a usar en todas las operaciones de acceso Constructor No Zend_Http_Client_Adapter_Socket
http_adapter Adaptador HTTP a usar en todas las operaciones de acceso Constructor No Zend_Http_Client_Adapter_Socket
visibility_timeout Tiempo de espera de visibilidad del mensaje receiveMessages() No 60

Tabla 19.5. Opciones de Zend_Cloud_QueueService_Adapter_WindowsAzure

Clave de opción Descripción Usado en Requerido Por defecto
storage_accountname Nombre de la cuenta de Windows Azure Constructor Ninguno
storage_accountkey Clave de la cuenta de Windows Azure Constructor Ninguno
storage_host Host de acceso de Windows Azure Constructor No queue.core.windows.net
storage_proxy_host Nombre de host del proxy Constructor No Ninguno
storage_proxy_port Puerto del proxy Constructor No 8080
storage_proxy_credentials Credenciales del proxy Constructor No Ninguno
http_adapter Adaptador HTTP a usar en todas las operaciones de acceso Constructor No Zend_Http_Client_Adapter_Socket
visibility_timeout Tiempo de espera de visibilidad del mensaje receiveMessages() No 60
prefix Filtra los resultados para incluir solo los nombres de cola que comiencen con el prefijo dado listQueues() No Ninguno
max_results Limita la lista de colas a un cierto número de resultados listQueues() No 5.000
ttl Establece el tiempo de vida (time-to-live) del mensaje sendMessage() No 7 días

Tabla 19.6. Opciones de Zend_Cloud_QueueService_Adapter_ZendQueue

Clave de opción Descripción Usado en Requerido Por defecto
adapter Adaptador concreto de Zend_Queue a usar. Vea la documentación de Zend_Queue para conocer los adaptadores soportados y sus opciones. Constructor No Filesystem
timeout Tiempo de espera de visibilidad para los mensajes createQueue(), receiveMessages() No 30

19.2.2. Conceptos básicos

Cada servicio de colas normalmente ofrece una o más colas. Cada cola puede almacenar cero o más mensajes. Un proceso puede enviar un mensaje a una cola, y otro proceso puede eliminarlo. Habitualmente los procesos eliminan el mensaje más antiguo de la cola, siguiendo una interfaz de cola de tipo primero en entrar, primero en salir (FIFO).

19.2.3. Excepciones

Si ocurre algún error dentro del servicio de almacenamiento, se lanza una Zend_Cloud_QueueService_Exception. Si la excepción fue causada por el driver del servicio subyacente, puede usar el método getClientException() para recuperar la excepción original.

Dado que los distintos proveedores de nube implementan diferentes conjuntos de servicios, algunos adaptadores no implementan ciertas funcionalidades. En este caso, se lanza la excepción Zend_Cloud_OperationNotAvailableException.

19.2.4. Crear una cola

El método createQueue() crea una cola de mensajes con el nombre indicado. Devuelve un identificador de cola, cuyo formato depende del servicio. Algunos servicios devuelven una URL como identificador de cola, mientras que otros devuelven un GUID a usar en operaciones futuras.

Ejemplo 19.18. Crear una cola

$queueId = $queues->createQueue('my-queue');

19.2.5. Eliminar una cola

El método deleteQueue() elimina la cola del servicio. Debe usar el identificador recibido de createQueue() al llamar a deleteQueue().

Ejemplo 19.19. Eliminar una cola

$queueId = $queues->createQueue('my-queue');

// ... haga otras cosas ...

$queues->deleteQueue($queueId);

[Note] Nota

Eliminar una cola puede tardar bastante tiempo en algunos servicios. Normalmente, no puede volver a crear una cola con el mismo nombre hasta que la cola original se haya eliminado por completo.

19.2.6. Listar colas

Para recuperar la lista de todas las colas del sistema, use el método listQueues().

Ejemplo 19.20. Listar colas

$names = $queues->listQueues();
foreach ($names as $name) {
    echo "Found queue $name\n";
}

19.2.7. Establecer metadatos de la cola

En algunos servicios, puede asociar un conjunto de pares clave-valor a la cola como metadatos de la cola. Para establecer los metadatos de la cola, use el método storeQueueMetadata():

Ejemplo 19.21. Establecer metadatos de la cola

$queues->storeQueueMetadata($queueId, array(
    'purpose'       => 'Operations',
    'administrator' => 'joe@example.com',
));

19.2.8. Obtener metadatos de la cola

Para recuperar los metadatos de la cola, use el método fetchQueueMetadata().

Ejemplo 19.22. Obtener metadatos de la cola

$metadata = $queues->fetchQueueMetadata($queueId);
foreac h($metadata as $key => $value) {
    echo "Metadata $key: $value\n";
}

19.2.9. Enviar un mensaje

Para añadir un mensaje a una cola, use el método sendMessage(). El mensaje se pasa como una cadena sin estructurar.

Ejemplo 19.23. Enviar un mensaje

$queues->sendMessage($queueId, "Hello world!");

19.2.10. Recibir un mensaje

Para recibir uno o más mensajes de la cola, use el método receiveMessages(). Este método devuelve por defecto una instancia de Zend_Cloud_QueueService_MessageSet, a menos que se configure de otra forma. Cada elemento del MessageSet es, por defecto, una instancia de Zend_Cloud_QueueService_Message, a menos que se configure de otra forma.

Ejemplo 19.24. Recibir un mensaje

// Get the first message
$messages = $queues->receiveMessages($queueId);
if (count($messages)) {
    foreach ($messages as $message) {
        echo "Message: " . $message->getBody();
        break;
    }
}

// Get two messages
$messages = $queues->receiveMessages($queueId, 2);

Cuando se recibe un mensaje, no es visible para otros clientes. Sin embargo, no se elimina de la cola hasta que el cliente que ha recibido el mensaje llama al método deleteMessage(). Si no se elimina durante el tiempo de espera de visibilidad especificado, volverá a ser visible para el resto de clientes. En otras palabras, todos los clientes podrán recuperar el mensaje con el método receiveMessages() si se supera el tiempo de espera de visibilidad.

19.2.11. Eliminar un mensaje

Para eliminar el mensaje de la cola, use el método deleteMessage(). Este método elimina el mensaje especificado.

Ejemplo 19.25. Eliminar un mensaje

// process and delete $max messages
$messages = $queues->receiveMessages($queueId, $max);
if (count($messages)) {
    foreach ($messages as $message) {
        process($message);
        $queues->deleteMessage($queueId, $message);
    }
}

19.2.12. Acceder a los adaptadores concretos

En ocasiones es necesario recuperar el adaptador concreto del servicio con el que trabaja la Queue API. Esto se puede lograr usando el método getAdapter().

[Note] Nota

Acceder al adaptador subyacente rompe la portabilidad entre servicios, por lo que debería reservarse únicamente para circunstancias excepcionales.

Ejemplo 19.26. Usar un adaptador concreto

// send the message directly with the SQS client library
$sqs = $queues->getAdapter();
$sqs->sendMessage("myQueue", "hello!");