En un contexto en el que está implementando una función web en varias instancias y necesita programar una tarea que solo debe realizar una instancia (como enviar un correo electrónico al sitio admin con algunas estadísticas), ¿qué tan confiable es usar RoleEnvironment.CurrentRoleInstance.Id
para hacer que la tarea se ejecute solo en una instancia (como si solo se ejecutara si el Id termina con IN_0
)? Si alguien alguna vez ha hecho esto, me interesaría su opinión.Uso de CurrentRoleInstance.Id para ejecutar una tarea en una sola instancia
Respuesta
yo no usaría ID de instancia. ¿Qué sucede si se reinicia la instancia 0 (que ocurre al menos una vez al mes)? Ahora su planificador o su tarea-corredor está fuera de línea.
Una solución alternativa es utilizar un tipo de exclusión mutua que abarca instancias. El que estoy pensando es un arrendamiento de blobs. En realidad, puede adquirir un contrato de arrendamiento en un blob por escrito (y solo puede haber un titular de arrendamiento). Podría intentar obtener un arrendamiento blob antes de ejecutar una tarea. Si lo obtiene, ejecute la tarea. Si no lo haces, no lo ejecutes.
Una pequeña variación: en un hilo (digamos empezado desde su método Run()
), intente adquirir un contrato de arrendamiento y, si tiene éxito, inicie una tarea de programador (tal vez un hilo o algo así). Si no puede adquirir el contrato, duerma un minuto y vuelva a intentarlo. Eventualmente, la instancia con el arrendamiento se reiniciará (o desaparecerá por algún otro motivo). Después de unos segundos, otra instancia adquirirá el arrendamiento abandonado y comenzará una nueva tarea del programador.
Steve Marx escribió un blog post sobre la concurrencia mediante arrendamientos. Tyler Doerksen también tiene un good post sobre arrendamientos.
Es posible hacer que un bloque de código de ejecución solo se ejecute una vez si tiene varias instancias, por ejemplo, verificando el ID de la instancia de rol actual en la que está ejecutando.
que podría lograr el mismo resultado con otras soluciones, pero los que pueden requerir más trabajo, al igual que la tarea de desacoplamiento de la instancia
sí se puede utilizar el InstanceId si es necesario específicamente dirigidos
<Startup>
<Task commandLine="StartUpTasks\WindowService\InstallWindowService.bat" executionContext="elevated" taskType="background" >
<Environment>
<Variable name="InstanceId">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>
</Variable>
</Environment>
</Task>
</Startup>
será de la forma siguiente
<deployment Id>.<Application Name>.<Role Name>_IN_<index>
Example mostly MyRole_IN_0, MyRole_IN_1
acceder a la variable environmet en archivo por lotes como éste
%InstanceId%
Usted Entonces, use subcadena o el último índice de _ para obtener el índice de InstanceId. si esta instancia que tiene el índice 0 tendrá el mismo índice incluso después de reiniciar.
Más detalles 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. Asegurar una sola instancia de una aplicación en Linux
- 2. ¿Ejecutar SQL en una tarea de Gradle?
- 3. ¿Ejecutar incondicionalmente una tarea en hormiga?
- 4. Asegurar una sola instancia de aplicación
- 5. "frameworks de sitios" en una sola instancia de django
- 6. ¿Cómo ejecutar diferentes aplicaciones en una sola instancia de Tomcat detrás de diferentes puertos?
- 7. Para ejecutar comandos sudo en una instancia de ec2
- 8. ¿Cómo adjuntar una tarea personalizada para ejecutar antes de la tarea de prueba en sbt?
- 9. ¿Cómo ejecutar una tarea diariamente desde Java?
- 10. En bash cómo uso ls para listar una sola carpeta
- 11. Ejecutar una tarea predeterminada en ANT en caso de falla
- 12. Cómo ejecutar solo una instancia de aplicación
- 13. ¿Qué es idiomático Clojure para "eliminar" una sola instancia de muchas en una lista?
- 14. Ejecutar una tarea Ant antes de depurar en Eclipse
- 15. TinyIoC: Registrar múltiples interfaces en una sola instancia
- 16. ¿Cómo puedo iniciar una instancia de tarea de continuación?
- 17. Cómo forzar una excepción de una tarea para ser observada en una tarea de continuación?
- 18. ¿Es posible ejecutar FindBugs contra una sola clase de Java?
- 19. Ejecutar una instancia única de una aplicación utilizando Mutex
- 20. Múltiples modelos enviados a una sola instancia de vista
- 21. Cómo ejecutar varios sitios en una instancia de apache
- 22. ejecutar una tarea a intervalos específicos en Python
- 23. ¿Es posible ejecutar muchos procedimientos almacenados en una sola operación?
- 24. Ejecutar tarea una vez a la semana en Heroku
- 25. Ejecutar fondo Tarea En Javascript
- 26. ¿Alguien ha creado una tarea de Hudson o Jenkins para implementarla en una instancia de AWS Beanstalk?
- 27. ¿Cómo uso "obtiene" en una tarea de rake?
- 28. ¿Cómo ejecutar periódicamente una tarea dentro de emacs?
- 29. ¿Se puede ejecutar una tarea de SSIS desde .net?
- 30. Cómo combinar mvn clean y mvn install en una sola tarea?
gracias por la respuesta, ya pasaron por el blog de Smarx. Aún así, no entiendo completamente su punto sobre la instancia que se reinicia. Después del reinicio, aún tendrá la misma ID de instancia, ¿verdad? Si es así, sería posible hacer frente a la situación cuando se reinicia exactamente cuando se debe ejecutar la tarea (ejecutándola justo después del reinicio, por ejemplo). – ThomasWeiss
Mi punto es que siempre quieres que se ejecute un planificador. Si depende de una instancia específica, se garantiza que tendrá tiempo de inactividad. Además, ¿qué sucede si escala * hacia abajo *? No puede especificar qué instancia eliminar.¿Qué sucede si la instancia eliminada es a la que se refiere todo el tiempo? –
Es cierto. Implementaré esa opción de arrendamiento blob. Gracias. – ThomasWeiss