2008-09-07 10 views
10

Estamos intentando aligerar la carga de nuestra página tanto como sea posible. Como ViewState a veces puede llegar a 100k de la página, me encantaría eliminarlo por completo.Moviendo ViewState fuera de la página?

Me encantaría escuchar algunas técnicas que otras personas han usado para mover ViewState a un proveedor personalizado.

Dicho esto, algunas advertencias:

  • Nos sirven un promedio de 2 millones de visitantes únicos por hora.
  • Debido a esto, las lecturas de la base de datos han sido un problema grave en el rendimiento, por lo que no quiero almacenar ViewState en la base de datos.
  • También estamos detrás de un equilibrador de carga, por lo que cualquier solución tiene que funcionar con el usuario que rebota de máquina a máquina por devolución de datos.

ideas?

+1

2 millones de visitantes únicos por hora? ¡Guauu! ¿Es este Intercambio de Expertos o algún otro sitio pr0n? ;-) – splattne

+0

pr0n seguro :))))))) (es broma Jonathan) –

+0

100k para ViewState? Esto no puede ser normal. –

Respuesta

2

He probado muchas maneras de eliminar el estado de carga de vista de la página y entre todos los hacks y algunos programas de software, lo único que realmente es escalable es el StrangeLoops As10000 appliance. Transparente, sin necesidad de cambiar la aplicación subyacente.

2

Como previously stated, he utilizado la base de datos para almacenar el ViewState en el pasado. Aunque esto nos funciona, no nos acercamos a los 2 millones de visitantes únicos por hora.

creo que una solución de hardware es definitivamente el camino a seguir, si el uso de los productos o StrangeLoop otro producto.

0

Debido a la hinchazón típica de organización, solicitando nuevo hardware lleva millones de años, y solicitando hardware que implicaría un nuevo cableado completo de nuestra configuración actual, probablemente conseguir un poco de resistencia severa del departamento de ingeniería.

que realmente necesitan para llegar a una solución de software, porque ese es el único mundo que tengo cierto control sobre.

Yay de Empresa :(

0

He tratado de encontrar algunos de los productos que había investigado en el pasado que funciona igual que StrangeLoops (pero software basado) Parece que se fueron todos a la quiebra, la Lo único de mi lista que todavía existe es ScaleOut pero están especializados en el almacenamiento en caché del estado de la sesión

Entiendo lo difícil que es vender soluciones de hardware a la alta gerencia, pero siempre es una buena idea, al menos, lograr que la administración Acepto escuchar el representante de ventas del hardware. Estoy prefiriendo poner un hardware que me presente una solución inmediata porque me permite (o comprar m e algún tiempo) para hacer otro trabajo real.

entiendo, lo que realmente apesta pero la alternativa es cambiar el código para la optimización y que sería tal vez costar mucho más que conseguir un aparato.

Avíseme si encuentra otra solución basada en software.

0

Voy a ver si puedo encontrar una manera de aprovechar nuestro servidor Estado actual y que el estado de vista en la memoria, yo debería ser capaz de utilizar el ID de sesión de usuario para mantener las cosas sincronizadas entre máquinas.

Si se me ocurre una buena solución, eliminaré cualquier código de protección IP y lo pondré a disposición del público.

+0

¿Alguna razón específica por la que no está utilizando la función integrada SessionPageStatePersister? http://msdn.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx – Mike

0

Oh no, red tape. Bueno, esto va a ser una tarea difícil de llenar. Mencionó here que utiliza un servidor de estado para atender su estado de sesión. ¿Cómo tienes esta configuración? ¿Quizás puedas hacer algo similar aquí también?

Editar

Awh @ Jonathan, you posted mientras yo estaba escribiendo esta respuesta hacia arriba. Creo que ir por esa ruta podría ser prometedor. Una cosa es que definitivamente requerirá mucha memoria.

@Mike No creo que almacenarlo en la información de la sesión sea una buena idea, debido a la intensidad de la memoria de viewstate y también a la cantidad de veces que necesitará acceder al viewstate. Se accede a SessionState con mucha menos frecuencia que viewstate. Yo mantendría los dos separados.

Creo que la mejor solución sería almacenar el ViewState en el cliente de alguna forma y tal vez valga la pena mirarlo. Con Google Gears, esto podría ser posible ahora.

5

¿Cómo se maneja el estado de la sesión? Existe un proveedor integrado "store the viewstate in the state". Si está almacenando el estado de la sesión en algún sistema fuera de proc rápido, esa podría ser la mejor opción para viewstate.

de edición: para hacer esto, agregue el código siguiente a la clase de su clases de página/base página global

protected override PageStatePersister PageStatePersister { 
     get { return new SessionPageStatePersister(this); } 
    } 

también ... esto es de ninguna manera una solución perfecta (o incluso bueno) a un gran viewstate. Como siempre, minimice el tamaño de viewstate tanto como sea posible. Sin embargo, SessionPageStatePersister es relativamente inteligente y evita almacenar un número ilimitado de viewstates por sesión, así como también evita almacenar solo un viewstate por sesión.

+0

Lo he usado en una aplicación de producción de claves en una página que solo tenía un puñado de usuarios. Fue un gran éxito (después de probar muchas alternativas fallidas) ... SIN EMBARGO, no escala. ¡Asegúrate de hacer los cálculos sobre esto! –

+0

Esto es lo que estaba buscando. – Przemek

+0

Es mejor utilizar un PageAdapter personalizado ya que no tiene que hacer que sus páginas hereden de una clase base. – mcintyre321

0

¿Ha considerado si realmente necesita todo ese estado de visualización? Por ejemplo, si llena una cuadrícula de datos de una base de datos, todos los datos se guardarán en viewstate de manera predeterminada. Sin embargo, si la cuadrícula es solo para presentar datos, no necesita un formulario de all, y por lo tanto no viewstate.

Solo necesita viewstate cuando hay alguna interacción con el usuario a través de devoluciones, e incluso entonces los datos del formulario pueden ser suficientes para recrear la vista. Puede desactivar viewstate de forma selectiva para los controles en la página.

Tiene una IU muy especial si realmente necesita 100K de viewstate. Si reduce ViewState a lo que es absolutamente necesario, podría ser más fácil y más escalable para mantener ViewState en la página.

2

Los siguientes funciona bastante bien para mí:

string vsid; 

protected override object LoadPageStateFromPersistenceMedium() 
{ 
    Pair vs = base.LoadPageStateFromPersistenceMedium() as Pair; 
    vsid = vs.First as string; 
    object result = Session[vsid]; 
    Session.Remove(vsid); 
    return result; 
} 

protected override void SavePageStateToPersistenceMedium(object state) 
{ 
    if (vsid == null) 
    { 
    vsid = Guid.NewGuid().ToString(); 
    } 
    Session[vsid] = state; 
    base.SavePageStateToPersistenceMedium(new Pair(vsid, null)); 
} 
0

que podría tener una solución sencilla para que en otro post. Es una clase simple de incluir en su aplicación y algunas líneas de código en la página asp.net. Si lo combina con un sistema de almacenamiento en caché distribuido puede ahorrar una gran cantidad de pasta ya que ViewState es grande y costoso. La velocidad de Microsoft podría ser un buen producto para adjuntar este método también. Si lo usa y ahorra una tonelada de dinero, me encantaría mencionarlo un poco. Además, si no está seguro de algo, hágamelo saber y puedo hablar con usted en persona.

Aquí está el enlace a mi código. link text

Si le preocupa la escala, el uso del token de sesión como identificador único o el almacenamiento del estado en sesión tiene más o menos la garantía de que funcionará en un escenario de granja de servidores web.

0

Almacena viewstate en un objeto de sesión y utiliza un caché distribuido o un servicio de estado para almacenar la sesión separada de los servidores we, como microsofts velocity.

0

Sé que esto es un poco duro, pero he estado trabajando durante un par de días en un código abierto "dispositivo virtual" por medio de calamares y ECAP a:

1.) gzip 2.) manejar SSL 3.) reemplazar viewstate con un token a petición/respuesta 4.) Memcache para el almacenamiento en caché de objetos

De todos modos, parece bastante prometedor. Básicamente, se sentaría frente a los loadbalancers y realmente debería ayudar al rendimiento del cliente. Tampoco parece ser muy difícil de configurar.

0

blogged sobre este hace un tiempo - la solución está en http://www.adverseconditionals.com/2008/06/storing-viewstate-in-memcached-ultimate.html

Esto le permite cambiar el proveedor de ViewState a uno de su elección sin tener que cambiar cada una de sus clases de página, mediante el uso de un PageAdapter personalizado. Almacena el ViewState en memcached. En retrospectiva, creo que es mejor almacenarlo en una base de datos o en un disco: llenamos los archivos de Memcached muy rápidamente. Es una solución de baja fricción.

1

Siempre se puede comprimir ViewState para que pueda obtener los beneficios de ViewState sin tanta hinchazón:

public partial class _Default : System.Web.UI.Page { 

    protected override object LoadPageStateFromPersistenceMedium() { 
    string viewState = Request.Form["__VSTATE"]; 
    byte[] bytes = Convert.FromBase64String(viewState); 
    bytes = Compressor.Decompress(bytes); 
    LosFormatter formatter = new LosFormatter(); 
    return formatter.Deserialize(Convert.ToBase64String(bytes)); 
    } 

    protected override void SavePageStateToPersistenceMedium(object viewState) { 
    LosFormatter formatter = new LosFormatter(); 
    StringWriter writer = new StringWriter(); 
    formatter.Serialize(writer, viewState); 
    string viewStateString = writer.ToString(); 
    byte[] bytes = Convert.FromBase64String(viewStateString); 
    bytes = Compressor.Compress(bytes); 
    ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes)); 
    } 

    // ... 

} 

using System.IO; 
using System.IO.Compression; 

public static class Compressor { 

    public static byte[] Compress(byte[] data) { 
    MemoryStream output = new MemoryStream(); 
    GZipStream gzip = new GZipStream(output, 
         CompressionMode.Compress, true); 
    gzip.Write(data, 0, data.Length); 
    gzip.Close(); 
    return output.ToArray(); 
    } 

    public static byte[] Decompress(byte[] data) { 
    MemoryStream input = new MemoryStream(); 
    input.Write(data, 0, data.Length); 
    input.Position = 0; 
    GZipStream gzip = new GZipStream(input, 
         CompressionMode.Decompress, true); 
    MemoryStream output = new MemoryStream(); 
    byte[] buff = new byte[64]; 
    int read = -1; 
    read = gzip.Read(buff, 0, buff.Length); 
    while(read > 0) { 
     output.Write(buff, 0, read); 
     read = gzip.Read(buff, 0, buff.Length); 
    } 
    gzip.Close(); 
    return output.ToArray(); 
    } 
} 
0

No hay necesidad de comprar o vender cualquier cosa para eliminar la hinchazón estado de vista. Solo necesita extender HiddenFieldPageStatePersister. Los 100-200 KB de ViewState permanecerán en el servidor y enviarán solo un token de 62 bytes en la página.

Aquí está un artículo detallado acerca de cómo se puede hacer esto:

http://ashishnangla.com/2011/07/21/reducing-size-of-viewstate-in-asp-net-webforms-by-writing-a-custom-viewstate-provider-pagestatepersister-part-12/

Cuestiones relacionadas