2013-03-14 11 views
6

La nostra applicazione serve un endpoint che riporta semplicemente os.environ ['CURRENT_VERSION_ID']. Lo usiamo per un tipo di monitoraggio che tiene traccia di quale versione è attualmente impostata come "versione predefinita".Versione app engine fornita da "default" sembra essere incoerente e thrash per un periodo dopo aver cambiato la versione predefinita

A partire dal pomeriggio del 5 marzo, abbiamo notato un comportamento strano quando si effettuavano richieste a questo endpoint. Poco dopo aver modificato la versione predefinita (tramite "appcfg.py set_default_version"), le richieste ripetute a questo endpoint si sarebbero invertite rispetto al valore predefinito precedente e al nuovo valore predefinito. Questo persiste per un periodo di circa 10 minuti, dopodiché tutte le richieste successive segnaleranno sempre la nuova versione predefinita corretta. Quindi sembra che durante questa finestra di 10 minuti, le richieste al nostro normale URL di default segnaleranno in modo incoerente la vecchia versione o quella nuova.

Questo sembra essere un cambiamento nel comportamento. La precedente modifica della versione predefinita per la nostra applicazione è avvenuta il 1 ° marzo e ogni altra modifica di versione precedente a tale data non mostrava questo comportamento di ribaltamento.

(Domanda rubato my teammate s' bug report)

risposta

10

Prima un po' di background:

  • App Engine esegue l'applicazione in un'infrastruttura distribuita: il traffico di più la vostra applicazione riceve, più istanze (appservers) che eseguirà il codice in qualsiasi momento
  • Per scalabilità/semplicità e molti altri motivi, App Engine non implementa il client < -> appiccicosità dell'appserver; di conseguenza qualsiasi richiesta alla versione di default app può essere gestito da qualsiasi AppServer

Dopo aver modificato la versione di default dell'applicazione, sia cambiando quale versione è contrassegnato come predefinito tramite la console di amministrazione, o per la distribuzione del la stessa versione principale che è attualmente l'impostazione predefinita, le informazioni su questa modifica vengono propagate attraverso l'infrastruttura App Engine. Man mano che i server delle app si rendono conto della nuova versione, iniziano a caricare la nuova versione del codice dell'applicazione. Una volta che un appserver è pronto, inizierà a servire la nuova versione del tuo codice.

C'è un certo periodo di tempo durante il quale alcuni server delle applicazioni serviranno la versione predefinita precedente mentre altri stanno già servendo la nuova versione predefinita. Pertanto, è previsto che qualsiasi app con una quantità di traffico non banale vedrà il comportamento che hai descritto.

Lavoriamo sempre sui modi per ridurre il tempo richiesto da queste modifiche di versione, ma la nostra principale preoccupazione è garantire che la transizione avvenga senza intoppi. Se l'applicazione ha un numero elevato di istanze che servono la versione precedente, App Engine deve garantire che ci sia sempre sufficiente capacità (che combina vecchi e nuovi server delle applicazioni) per servire tutto il traffico corrente. Le versioni precedenti e nuove dell'app possono richiedere un numero diverso di appserver (a causa delle differenze di prestazioni tra le versioni), che è un'altra ragione per cui la transizione non può essere eseguita in modo sicuro "istantaneamente".

Se desideri un maggiore controllo sul processo, puoi utilizzare la funzione Traffic Splitting di App Engine. In una certa misura, puoi aumentare la percentuale di traffico degli utenti che desideri indirizzare alla nuova versione. App Engine fornirà quindi la stickiness della versione in base all'indirizzo IP del client o a un cookie (per le app Web). È inoltre possibile utilizzare Traffic Splitting su "canary" una nuova versione dell'applicazione su una percentuale (ad esempio 1%) dei client.

+0

Grazie per le informazioni, Fred.Il comportamento che descrivi è quello che mi aspetterei da un sistema di grandi dimensioni come GAE. Quello che mi imbarazza è il motivo per cui non abbiamo mai visto questo comportamento prima del 5 marzo. Prima di tale distribuzione, tutte le modifiche al default sembravano avvenire "atomicamente" per noi, quindi sembra che qualcosa sia cambiato. Non sono sicuro che tu possa confermarlo o meno, ma è bene avere conferma che questo è almeno il comportamento previsto in corso –

+0

Qualche possibilità che stavi colpendo un "back-end" di App Engine in opposizione a un'istanza di frontend? Hai usato la divisione del traffico in qualsiasi punto del passato? Esistono diverse variabili che potrebbero influire sulla versione che desideri visualizzare dalla richiesta alla richiesta. Tuttavia, il comportamento che stai descrivendo è previsto e sicuramente qualcosa che ho visto prima. Dovrei anche notare che continuiamo a migliorare e apportare modifiche allo scheduler di App Engine, quindi un cambiamento nel comportamento osservato quando si verifica in un modo particolare non è del tutto inaspettato, anche se non riesco facilmente a spiegare perché non l'hai visto prima. –

+0

@FredSauer: No, abbiamo sicuramente suonato i frontend per tutto questo tempo. Ad un certo punto siamo riusciti ad attivare accidentalmente la divisione del traffico, ma non credo che l'abbiamo mai configurato per fare altro che passare il 100% del traffico a una singola versione; l'abbiamo spento perché averlo su sembra disabilitare la cache del frontend. Per quanto ne sappiamo, non abbiamo cambiato nulla che avrebbe causato questo comportamento. –

Problemi correlati