¿Por qué el tutorial de EF 6 utiliza llamadas asincrónicas?
El último tutorial de EF que explica cómo usar EF 6 con MVC 5 parece inclinarse hacia el uso de llamadas asych a la base de datos como:
Department department = await db.Departments.FindAsync(id);
¿Es este el nuevo estándar/mejor práctica?
No estoy seguro de cuál es el beneficio de este estilo de desarrollo con ASP.NET MVC.
¿Alguien puede comentar sobre este patrón? ¿Es este el nuevo estándar que promueve MS?
Para decidir si desea sincronizar o sincronizar, compare los beneficios y costos:
Asíncrono:
- Casi nunca agota el grupo de subprocesos con async (las circunstancias tendrían que ser extremas)
- Niveles de concurrencia bastante arbitrarios (solicitudes y operaciones concurrentes)
- Ahorra 1 MB de memoria por cada subproceso guardado
- Simultaneidad intra-solicitud segura gracias a la
SynchronizationContext
- Puede aumentar el rendimiento en porcentajes bajos de dos dígitos para casos de alta carga debido a la reducción de la sobrecarga de programación del sistema operativo. Dicho esto, casi ninguna aplicación de producción tiene una carga alta de CPU porque, si lo estaba, estaba cerca de no estar disponible (en caso de un pico de carga, la aplicación comienza a descartar solicitudes).
Sincronización:
- Código más simple: await hace que el 99% de los casos (casi) sean tan simples como el código sincrónico. Dicho esto, las más de 10 preguntas asíncronas cada día en Stack Overflow hablan un idioma diferente. Los casos extremos surgen cuando te desvías del camino simple. También cuando se utilizan bibliotecas heredadas que, por ejemplo, requieren que les entregue una devolución de llamada sincrónica
- Menos trabajo de codificación y depuración
- Compatible con generadores de perfiles (puede perfilar la aplicación o simplemente pausar el depurador y ver qué está haciendo la aplicación en este momento. No es posible con async).
- Interopera perfectamente con código y bibliotecas heredados.
Elija async con ASP.NET si llama a servicios de alta latencia. Es probable que un servicio web tenga una latencia alta. Una base de datos OLTP casi siempre tiene baja latencia.
Elija async si su aplicación se beneficia de niveles muy altos de simultaneidad (más de 100). La mayoría de las aplicaciones no tienen niveles tan altos o sus servicios de back-end no soportarían tal cantidad de carga. No tiene sentido hacer que la aplicación web escale sino sobrecargar el back-end. Todos los sistemas en la cadena de llamadas deben beneficiarse de un alto grado de concurrencia para que asíncrono sea beneficioso.
Servicios típicos de alta latencia (buenos casos para asíncrono):
- Servicios web
- Esperando (por ejemplo, dormir)
- Limitación (
SemaphoreSlim
, ...) - Algunos servicios en la nube (Azure)
- Consultas de larga duración a la base de datos (por ejemplo, informes o ETL)
Servicios típicos de baja latencia (buenos casos para sincronización):
- Llamadas a bases de datos: la mayoría de las consultas OLTP tienen baja latencia porque se puede asumir que el servidor de la base de datos no está sobrecargado. No tiene sentido lanzarle cientos de consultas simultáneas. No hace que se completen más rápido.
- Sistema de archivos: Igual que las bases de datos.
Estos se clasifican según el caso típico . Todos estos también pueden estar en la categoría opuesta.
Puedes combinar sincronización y asíncrono en la misma aplicación. Utilice async cuando esté en su punto óptimo.
Entonces, ¿por qué Microsoft y el equipo de Entity Framework promueven el uso asíncrono? Aquí viene la parte subjetiva de esta respuesta: podría ser la política interna de Microsoft. Es posible que anticipen el uso de EF en aplicaciones cliente (para las cuales async es excelente). O no se dan cuenta de que las llamadas asíncronas a bases de datos son casi siempre una pérdida de tiempo para los desarrolladores sin beneficios. La mayoría de la gente no se da cuenta de esto porque async es el camino a seguir en estos días.
En ASP.NET, debe utilizar API asíncronas para cualquier cosa relacionada con E/S, incluido el acceso a bases de datos y llamadas a servicios web.
El uso async
permite a ASP.NET aprovechar al máximo el grupo de subprocesos, lo que genera beneficios de escalabilidad no triviales.
Lo ideal es que todo lo que implique un periodo de espera se haga de forma asincrónica. Una consulta de base de datos normalmente debe llamar a un servidor remoto, enviar la consulta y luego esperar a que el servidor responda con los resultados. Eso lo convierte en un candidato principal para asíncrono, ya que toda la parte de "esperar a que el servidor responda" es una variable que no puede tener en cuenta en su aplicación.
El uso de async permite que el servidor web reutilice el hilo actual para responder a otras solicitudes web mientras su código espera que se complete la operación asincrónica. Cuando se completa, se devuelve un hilo a su aplicación para continuar con el procesamiento. Si ejecuta la sincronización, mientras espera la base de datos o cualquier otro proceso de ejecución prolongada, el subproceso se bloquea y no está disponible para el grupo del servidor web. Si hace esto lo suficiente, el servidor web puede quedarse sin subprocesos disponibles y debe comenzar a poner en cola más solicitudes. Async mitiga esto liberando subprocesos cuando simplemente están esperando algo, lo que aumenta la carga potencial que su servidor web puede manejar.