PHP Classes

File: example/Monitoramento.php

Recommend this page to a friend!
  Classes of Matheusz Maydana   Docker Compose Auto Scaling Service   example/Monitoramento.php   Download  
File: example/Monitoramento.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Docker Compose Auto Scaling Service
Manage the deployment of services using Docker
Author: By
Last change:
Date: 1 month ago
Size: 2,985 bytes
 

Contents

Class file image Download
#!/usr/bin/php
<?php

declare(strict_types=1);

use
PhpAmqpLib\Connection\AMQPStreamConnection;

// Verifica se o arquivo de autoload existe
$pathVendor = __DIR__ . '/vendor/autoload.php';
if (!
is_file($pathVendor)) {
    echo
"O arquivo {$pathVendor} não foi encontrado. Execute o comando composer install para instalar as dependências.";
    exit;
}

require_once
$pathVendor;

// Configurações do RabbitMQ
$host = 'localhost';
$port = 5672;
$user = 'guest';
$pass = 'guest';
$vhost = '/';
$queueName = 'lancar_foguete';

// Intervalo entre as verificações (em segundos)
$intervalo = 10;

// Função para obter o tamanho da fila
function getQueueSize($channel, $queueName)
{
    try {
       
// Obtem o número de mensagens na fila
       
$result = $channel->queue_declare($queueName, true);
        return
$result[1];
    } catch (
Exception $e) {
        echo
"Erro ao obter o tamanho da fila: {$e->getMessage()}\n";
        return -
1;
    }
}

// Função para calcular o número de réplicas com base na quantidade de mensagens na fila
function calculateReplicas($queueSize)
{
   
// Define os limites para o número de réplicas
   
$minReplicas = 1;
   
$maxReplicas = 50;

   
// Calcula o número de réplicas com base na quantidade de mensagens
   
if ($queueSize <= 10) {
       
$replicas = $minReplicas;
    } else {
       
$replicas = ceil($queueSize / 10); // Aumenta 1 réplica para cada 10 mensagens adicionais na fila
   
}

   
// Limita o número de réplicas ao máximo permitido
   
return min($replicas, $maxReplicas);
}

// Função para atualizar o número de réplicas do serviço
function updateServiceReplicas($replicas)
{
   
// Comando para atualizar réplicas do serviço (exemplo)
   
shell_exec("docker-compose up -d --scale worker-lanca-foguete={$replicas}");
    echo
"Atualizando réplicas do serviço para: $replicas\n";
}

// Conecta-se ao RabbitMQ
try {
   
$connection = new AMQPStreamConnection($host, $port, $user, $pass, $vhost);
   
$channel = $connection->channel();
} catch (
Exception $e) {
    echo
"Erro ao conectar-se ao RabbitMQ: {$e->getMessage()}\n";
    exit;
}

$numeroReplicaAtual = 0;

// Loop principal
while (true) {
   
// Verifica o tamanho da fila
   
$queueSize = getQueueSize($channel, $queueName);
    if (
$queueSize < 0) {
       
// Aguarda o intervalo antes de verificar novamente
       
sleep($intervalo);
        continue;
    }

    echo
"Número de mensagens na fila: $queueSize\n";

   
// Calcula o número de réplicas com base na quantidade de mensagens e atualiza
   
$newReplicas = calculateReplicas($queueSize);

    if(
$newReplicas != $numeroReplicaAtual and $newReplicas <= 50){
       
$numeroReplicaAtual = $newReplicas;
       
updateServiceReplicas($newReplicas);
    }

   
// Aguarda o intervalo antes de verificar novamente
   
sleep($intervalo);
}

// Fecha a conexão com o RabbitMQ (não será alcançado enquanto o loop estiver em execução)
$channel->close();
$connection->close();