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:
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_adapterespecifica la clase de adaptador concreta;message_classespecifica la clase a usar para representar los mensajes de la cola; por defecto esZend_Cloud_QueueService_Message; ymessageset_classespecifica la clase a usar para representar colecciones de mensajes de la cola; por defecto esZend_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,
));
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 | Sí | Ninguno |
| aws_secretkey | Su clave secreta de Amazon AWS | Constructor | Sí | 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 | Sí | Ninguno |
| storage_accountkey | Clave de la cuenta de Windows Azure | Constructor | Sí | 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 |
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).
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.
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.
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);
![]() |
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. |
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";
}
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',
));
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";
}
Para añadir un mensaje a una cola, use el método sendMessage(). El
mensaje se pasa como una cadena sin estructurar.
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.
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);
}
}
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().
![]() |
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!");
![[Note]](images/note.png)