In un contesto in cui si distribuisce un ruolo Web su più istanze e si richiede di pianificare un'attività che deve essere eseguita da una sola istanza (come l'invio di una e-mail al sito admin con alcune statistiche), quanto è affidabile l'uso di RoleEnvironment.CurrentRoleInstance.Id
per far sì che l'attività venga eseguita su una sola istanza (come se fosse stata eseguita solo se l'Id termina con IN_0
)? Se qualcuno lo avesse mai fatto, sarei interessato al suo feedback.Uso di CurrentRoleInstance.Id per eseguire un'attività in una sola istanza
risposta
non userei ID istanza. Cosa succede se l'istanza 0 viene riavviata (cosa che accade almeno una volta al mese)? Ora il tuo programmatore o task-runner è offline.
Una soluzione alternativa consiste nell'utilizzare un tipo di mutex che si estende su istanze. Quello a cui sto pensando è un contratto di blob. È possibile acquistare un contratto di locazione su un BLOB per iscritto (e può esserci un solo lease-holder). È possibile tentare di ottenere un lease blob prima di eseguire un'attività. Se lo ottieni, esegui l'attività. Se non lo fai, non eseguirlo.
Una leggera variazione: in una discussione (diciamo avviata dal metodo Run()
), tentare di acquisire un lease e, in caso di esito positivo, avviare un'attività di pianificazione (magari un thread o qualcosa del genere). Se non riesci ad ottenere il contratto di locazione, dormi per un minuto e riprova. Alla fine, l'istanza con il lease verrà riavviata (o scomparirà per qualche altro motivo). Dopo pochi secondi, un'altra istanza acquisirà il contratto di locazione abbandonato e avvierà una nuova attività di pianificazione.
Steve Marx ha scritto un blog post sulla concorrenza utilizzando i leasing. Tyler Doerksen ha anche un good post sui leasing.
È possibile che un codice di blocco di esecuzione venga eseguito una sola volta se si dispone di più istanze, ad esempio controllando l'ID dell'istanza di ruolo corrente in cui si sta eseguendo.
si potrebbe ottenere lo stesso risultato con altre soluzioni, ma quelli potrebbe richiedere un po 'più di lavoro, come il disaccoppiamento l'attività dalla propria istanza
sì, si può utilizzare l'InstanceId se necessario specificatamente
<Startup>
<Task commandLine="StartUpTasks\WindowService\InstallWindowService.bat" executionContext="elevated" taskType="background" >
<Environment>
<Variable name="InstanceId">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>
</Variable>
</Environment>
</Task>
</Startup>
sarà di forma seguente
<deployment Id>.<Application Name>.<Role Name>_IN_<index>
Example mostly MyRole_IN_0, MyRole_IN_1
accedere alla variabile environmet in file batch come questo
%InstanceId%
È canna quindi usare la sottostringa o l'ultimo indice di _ per ottenere l'indice da InstanceId. se questa istanza con indice 0 avrà lo stesso indice anche dopo un riavvio.
Maggiori dettagli http://blogs.msdn.com/b/cclayton/archive/2012/05/17/windows-azure-start-up-tasks-part-2.aspx
http://msdn.microsoft.com/en-us/library/windowsazure/hh404006.aspx
- 1. Creazione di una classe Python per "una sola istanza"?
- 2. È possibile aggiungere una sola istanza di ScriptManager alla pagina
- 3. variabili di istanza del modello django per uso transitorio
- 4. La classe <SomeObject> ha una sola istanza?
- 5. Nessuna istanza per (Fractional Int) derivante da un uso di `/ '
- 6. È possibile eseguire FindBug contro una sola classe Java?
- 7. Uso di variabili di sola lettura negli script di shell
- 8. python regex: abbinare una stringa con una sola istanza di un personaggio
- 9. Crea una sola tabella in mysql di sola lettura
- 10. Creazione di una singola istanza per system tray in java
- 11. Rake una sola migrazione
- 12. Sta usando una proprietà statica in una cattiva pratica di forma sapendo che esiste una sola istanza del modulo?
- 13. getElementsByTagName per due tag in una sola volta
- 14. iOS quando uso variabile di istanza o metodo getter
- 15. sqlite3.Warning: È possibile eseguire una sola istruzione alla volta
- 16. Uso di setInterval() per eseguire il polling continuo semplicistico
- 17. Cercando di impostare il separatore decimale per la lingua corrente, ottenendo "Istanza è di sola lettura"
- 18. Eccezione blocco Gradle: Gradle in uso da un'altra istanza Gradle
- 19. output di stampa in una sola riga
- 20. Come eseguire l'override di django edit_inline/tabular.html per una sola app?
- 21. Come ottenere una funzione javascript per eseguire una sola volta su Dom pronto
- 22. Uso di variabili in una query MySQL
- 23. Come eseguire l'override di una sola proprietà: coppia di valori in Qt StyleSheet
- 24. Uso di Grunt.js per eseguire i test della moka
- 25. Ottieni istanza per istanza-id
- 26. Aggiunta di una nuova istanza in weka
- 27. Disattiva layout per una sola azione
- 28. Uso di Linq per eseguire un metodo su una raccolta di oggetti?
- 29. Ignora controller AutorizzaAttributo per una sola azione
- 30. BigQuery l'esecuzione di una sola query
Grazie per la risposta, ho già passato attraverso post sul blog di smarx. Tuttavia, non ho completamente compreso il punto sul riavvio dell'istanza. Dopo il riavvio, avrà ancora lo stesso ID di istanza, giusto? In tal caso, sarebbe possibile far fronte alla situazione quando viene riavviato esattamente quando l'attività deve essere eseguita (eseguendola subito dopo il riavvio, ad esempio). – ThomasWeiss
Il mio punto è che si desidera sempre un programma di pianificazione in esecuzione. Se dipendi da un'istanza specifica, hai il tempo di inattività garantito. Inoltre: cosa succede se riduci * in basso *? Non è possibile specificare quale istanza rimuovere.Cosa succede se l'istanza rimossa è quella a cui fai sempre riferimento? –
Vero. Implementerò l'opzione di leasing blob. Grazie. – ThomasWeiss