Salve ho questo progetto da reallizzare :A fronte di un’analisi dei dati della CDN e dell’uso fatto dai clienti dei film memorizzati
nella CDN, questa funzionalità propone piani di allocazione dei contenuti sui
server al fine di non sovraccaricare il traffico di richieste di visualizzazione dei film.
studiare e implementare una funzionalità che stimi i potenziali
sovraccarichi di un server, e suggerisca spostamenti di contenuti da un server
per non sovravvaricarlo, indicando un server di destinazione.
abbiamo pensato che possiamo assegnare a rotazione un utente attivo a ogni server della stessa nazione fino alla capacità massima , in questo modo il carico sarà equamente distribuito all 80% del suo carico per ogni server. i server per nazione sono 5.
questa la procedura:
DELIMITER //
CREATE PROCEDURE BilanciamentoCarico()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE userId VARCHAR(255);
DECLARE nationId INT;
DECLARE serverId INT;
DECLARE serverCapacity DECIMAL(10, 2);
DECLARE currentServerIndex INT DEFAULT 1;
DECLARE cur CURSOR FOR
SELECT un.UtenteCodiceAlfanumerico, un.Nazione, un.ServerID, un.capacita
FROM utenti_nazione_server un
INNER JOIN utenti u ON un.UtenteCodiceAlfanumerico = u.CodiceAlfanumerico
WHERE u.Attivo = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO userId, nationId, serverId, serverCapacity;
IF done THEN
LEAVE read_loop;
END IF;
-- Qui inseriamo la logica per assegnare il server all'utente nella tabella servercdn_utilizzatipernazione
-- Assumiamo che la tabella servercdn_utilizzatipernazione abbia una colonna auto-incrementale `ID`
-- Verifica se l'utente ha già un server assegnato
SELECT COUNT(*) INTO @userServerCount
FROM servercdn_utilizzatipernazione
WHERE UtenteCodiceAlfanumerico = userId AND Nazione = nationId;
IF @userServerCount = 0 THEN
-- Inserisci l'assegnazione del server all'utente nella tabella servercdn_utilizzatipernazione
INSERT INTO servercdn_utilizzatipernazione (ServerID, UtenteCodiceAlfanumerico, Nazione, CapacitaUsata, ContatoreUtenti)
VALUES (serverId, userId, nationId, serverCapacity, 1);
-- Aggiorna la capacità utilizzata nella tabella servercdn_utilizzatipernazione
UPDATE servercdn_utilizzatipernazione
SET CapacitaUsata = CapacitaUsata + serverCapacity,
ContatoreUtenti = ContatoreUtenti + 1
WHERE ServerID = serverId AND Nazione = nationId;
END IF;
SET currentServerIndex = currentServerIndex % 5 + 1;
END LOOP;
CLOSE cur;
END;
//
DELIMITER ;
e queste le tabelle interessate
'CREATE TABLE `utenti_nazione_server` ( `UtenteCodiceAlfanumerico` varchar(255) NOT NULL, `Nazione` int NOT NULL, `ServerID` int NOT NULL, `capacita` decimal(10,2) DEFAULT NULL, `carico` int DEFAULT NULL, PRIMARY KEY (`UtenteCodiceAlfanumerico`,`Nazione`,`ServerID`), KEY `Nazione` (`Nazione`), CONSTRAINT `utenti_nazione_server_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) )
'CREATE TABLE `utenti` ( `CodiceAlfanumerico` varchar(255) NOT NULL, `Nome` varchar(255) DEFAULT NULL, `Cognome` varchar(255) DEFAULT NULL, `Email` varchar(255) DEFAULT NULL, `Password` varchar(255) DEFAULT NULL, `Nazione` int DEFAULT NULL, `DataNascita` date DEFAULT NULL, `Attivo` tinyint DEFAULT NULL, PRIMARY KEY (`CodiceAlfanumerico`), KEY `Nazione` (`Nazione`), CONSTRAINT `utenti_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) )
'CREATE TABLE `servercdn_utilizzatipernazione` ( `ID` int NOT NULL AUTO_INCREMENT, `ServerID` int DEFAULT NULL, `UtenteCodiceAlfanumerico` varchar(255) DEFAULT NULL, `Nazione` int DEFAULT NULL, `CapacitaUsata` decimal(5,2) DEFAULT NULL, `ContatoreUtenti` int DEFAULT NULL, `Timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`ID`) )
'CREATE TABLE `servercdn` ( `Posizione` varchar(255) DEFAULT NULL, `LarghezzaBanda` int DEFAULT NULL, `CapacitaMassima` int DEFAULT NULL, `Nazione` int DEFAULT NULL, `ID` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`ID`), KEY `Nazione` (`Nazione`), CONSTRAINT `servercdn_ibfk_1` FOREIGN KEY (`Nazione`) REFERENCES `nazione` (`ID`) )
la procedura ha questo risultato:
User # ID ServerID UtenteCodiceAlfanumerico Nazione CapacitaUsata ContatoreUtenti Timestamp 911 6 CDE901 2 400.00 4 2023-08-11 00:14:48 912 1 FGH123 1 300.00 3 2023-08-11 00:14:48 913 6 IJK456 2 300.00 3 2023-08-11 00:14:48 914 6 MNO345 2 200.00 2 2023-08-11 00:14:48 915 1 STU901 1 200.00 2 2023-08-11 00:14:48 916 11 YZA567 3 200.00 2 2023-08-11 00:14:48
tutti gli utenti attivi vengono inseriti ma i server assegnati non ruotano.
qualcuno può darmi un consiglio o corregre la procedura per assegnare a rotazione gli utenti attivi a server della stessa nazione (che sono 5) in modo da distribuire il carico sino all'80% della capacità dei server