Condividi tramite


Gestione degli errori di connettività temporanei in Database di Azure per PostgreSQL

Questo articolo descrive come gestire gli errori temporanei durante la connessione alle istanze di server flessibili di Azure Database per PostgreSQL.

Errori temporanei

Un errore temporaneo, noto anche come errore temporaneo, è un errore che si risolve. Questi errori generalmente si manifestano come una connessione al server di database che viene interrotta. Inoltre non è possibile aprire nuove connessioni a un server. Gli errori temporanei possono verificarsi, ad esempio, quando si verifica un errore hardware o di rete. Un altro motivo potrebbe essere una nuova versione di un servizio PaaS in fase di implementazione. Il sistema attenua automaticamente la maggior parte di questi eventi in meno di 60 secondi. Una procedura consigliata per la progettazione e lo sviluppo di applicazioni nel cloud è la previsione di errori temporanei, presupponendo che possano accadere in qualsiasi componente e in qualunque momento e che si disponga della logica appropriata per affrontare tali situazioni.

Gestione degli errori temporanei

Gli errori temporanei devono essere gestiti usando la logica di ripetizione dei tentativi. Situazioni da considerare:

  • Si verifica un errore quando si tenta di aprire una connessione
  • Una connessione inattiva viene eliminata sul lato server. Se si prova a eseguire un comando, non si riesce a eseguirlo
  • Una connessione attiva che sta attualmente eseguendo un comando viene eliminata.

Il primo e il secondo caso sono abbastanza semplici da gestire. Provare ad aprire di nuovo la connessione. Dopo che il sistema riduce l'errore temporaneo, è possibile connettersi. È possibile usare di nuovo l'istanza del server flessibile di Database di Azure per PostgreSQL. È consigliabile attendere prima di riprovare a effettuare la connessione. Interrompere temporaneamente l'operazione se i tentativi iniziali hanno esito negativo. In questo modo il sistema può usare tutte le risorse disponibili per superare la situazione di errore. È consigliabile seguire questa procedura:

  • Attendere 5 secondi prima di riprovare.
  • Per ogni tentativo successivo, aumentare l'attesa in modo esponenziale, fino a 60 secondi.
  • Impostare un numero massimo di tentativi nel punto in cui l'applicazione considera l'operazione non riuscita.

Quando una connessione con una transazione attiva ha esito negativo, è più difficile gestire correttamente il ripristino. Esistono due casi: se la transazione è di sola lettura, è possibile riaprire la connessione e ripetere la transazione. Se invece la transazione stava anche scrivendo nel database occorre stabilire se è stata sottoposta a rollback o se è riuscita prima che si verificasse l'errore temporaneo. In tal caso, potrebbe non essere stato ricevuto il riconoscimento del commit dal server di database.

Un modo per superare il problema consiste nel generare un ID univoco sul client usato per tutti i tentativi. Passare questo ID univoco come parte della transazione al server e archiviarlo in una colonna con un vincolo univoco. In questo modo è possibile riprovare a eseguire la transazione in tutta sicurezza. Ha esito positivo se è stato eseguito il rollback della transazione precedente e l'ID univoco generato dal client non esiste ancora nel sistema. Non riesce a indicare una violazione della chiave duplicata se l'ID univoco è stato archiviato in precedenza perché la transazione precedente è stata completata correttamente.

Quando il programma comunica con il server flessibile di Database di Azure per PostgreSQL tramite middleware di terze parti, chiedere al fornitore se il middleware contiene la logica di ripetizione dei tentativi per gli errori temporanei.

Verificare di testare la logica di retry. Ad esempio, provare a eseguire il codice mentre si ridimensionano le risorse di calcolo dell'istanza del server flessibile di Database di Azure per PostgreSQL. L'applicazione deve gestire senza problemi il breve tempo di inattività che si verifica durante questa operazione.

Che cos'è Database di Azure per PostgreSQL?