En PHP, ¿cómo codifica teniendo en cuenta la escalabilidad?

8

Sé que esta puede ser una pregunta general, pero ¿qué implica exactamente el escalado para todos los usuarios que encontrará, incluso si no en los próximos meses? Investigué un poco y la mayor parte de lo que se hace es del lado del servidor, con cachés y otras cosas similares. Cualquier punto en la dirección correcta sería útil.

Andy
fuente

Respuestas:

24

"Incluso si no en los próximos meses" huele a optimización prematura. No hagas eso:

  • Que no vale la pena. Muchas personas, al realizar un proyecto, creen que su proyecto será el segundo Facebook. Luego lo lanzan, y luego notan que diez visitantes por mes es lo mejor que pueden hacer. Gastar menos dinero y tiempo en la optimización para una mayor escalabilidad y más tiempo pensando en el proyecto en sí ayudaría.

  • Es como con los cuellos de botella y los perfiles: siempre tiene la impresión de que sabe perfectamente dónde está el cuello de botella y, en la mayoría de los casos, descubre que se equivocó al perfilar. Haz tu solicitud primero. Mira cómo se usa. Perfílalo. Recopilar datos de BI. Reúna métricas de rendimiento. Analízalo. Comprueba si tu análisis fue correcto. Realice las predicciones sobre el futuro, basándose en su análisis, luego optimice para la escalabilidad lo que realmente necesita optimizar.

Por ejemplo, una aplicación web escalable debe poder alojarse en varios servidores. El último proyecto que hice para mi cliente tenía la intención de ser escalable. Había una opción: o gastamos 1,5 meses más para hacer que la aplicación web funcione en varios servidores, o el cliente compra un servidor de alta calidad (solo una máquina) y la aplicación web está alojada solo en esta máquina. Era mucho menos costoso comprar un servidor costoso, contando tanto el costo directo (precio del servidor vs. precio de 1.5 meses de trabajo) como el ahorro a largo plazo (consumo de energía de un servidor de alta calidad vs. consumo de energía de varios -end servidores). Ahora, la aplicación se ejecuta durante unos meses y, según las métricas, si algún día hubiera un problema con la escalabilidad, en primer lugar, se trataría de la base de datos,

Ahora, una aplicación puede ser más o menos escalable en varios puntos:

  • Base de datos: según mi experiencia personal, la mayoría de los problemas relacionados con la escalabilidad provienen de la base de datos. Con suerte, hay muchas maneras de hacer que la base de datos sea escalable para cada motor de base de datos de grado industrial, e incluso antes de eso, hay muchas maneras de mejorar la estructura de la base de datos y optimizar las consultas . El almacenamiento en caché también ayuda.

  • Red: el ancho de banda puede ser un problema real en algunas configuraciones, y a veces no puede hacer nada al respecto sin hacer gastos que no puede pagar. Para evitar ser bloqueado en este nivel, puede optimizar el diseño visual del sitio web para tener menos imágenes o mejores imágenes comprimidas , optimizar el diseño de la página, reducir las solicitudes HTTP (a través de sprites CSS ), reducir la cantidad de HTML código enviado (a través de AJAX ), etc. La compresión HTTP es imprescindible. El almacenamiento en caché del navegador también, pero sus métricas pueden mostrar que muchos clientes tienen un caché vacío.

  • Uso de CPU y memoria: portar una aplicación para ser alojado por varios servidores también puede ser doloroso, tanto a nivel de infraestructura (hardware) como a nivel de aplicación (software). Para evitar esto, use un almacenamiento en caché extenso y perfile la aplicación, eliminando progresivamente los cuellos de botella .

Arseni Mourzenko
fuente
Muchas gracias. Actualmente no estoy desarrollando para eso en mente. Casualmente, en realidad voy a recopilar información para ver a dónde van las cosas. Tenía curiosidad por lo que otros saben, pero gracias por el consejo!
Andy
Veo. Modifiqué la respuesta para abordar mejor su preocupación.
Arseni Mourzenko
5

La escalabilidad es muy independiente del lenguaje, por lo que no hay nada específico de PHP para ello. El factor clave es haber desacoplado los subsistemas, comunicándose a través de protocolos independientes del lenguaje (por ejemplo, si tiene que llamar al servicio web desde su código PHP, no use PHP serialize, sino JSON, incluso si ambos componentes están actualmente implementados en PHP). Esto le permitirá reemplazar componentes con otras alternativas, tal vez desarrolladas en otras tecnologías.

Puede encontrar muchos ejemplos de arquitecturas escalables implementadas usando PHP en el blog highscalability.com

vartec
fuente
Ya veo lo que estás diciendo, así que esencialmente divide el trabajo. Agradezco el consejo.
Andy
Miré el documento php en serializar. No estoy muy familiarizado con eso. ¿Cuál es su propósito si no te importa que pregunte?
Andy
No vincularé publicaciones específicas porque podrían estar sesgadas, sino que solo haré una búsqueda en SOA (Arquitectura Orientada a Servicios) y Sistemas Distribuidos. En Internet faltan bibliotecas y pautas sobre PHP. La forma más fácil de comenzar es con una infraestructura de mensajería y un diseño dirigido por eventos.
andho
2
@Andy: el propósito de serializees serializar el estado del objeto en una cadena. Los sinónimos de serialización utilizados en otros idiomas son la clasificación o el decapado. El problema con ese tipo de serialización es que es específico del idioma. Es por eso que estándares bien definidos como JSON son mejores para pasar datos a servicios web.
vartec
Ah, sí, realmente me preguntaba cómo almacenaría cierto lado del servidor de información, y supongo que esto me ayuda en ese sentido. Solo para asegurarme, digamos que me gustaría almacenar el lado del servidor de información de cookies, la forma en que lo haría sería usar serializar. ¡Muchas gracias!
Andy
1

Probablemente no valga la pena preocuparse por la escalabilidad ahora: si su proyecto despega y alcanza la marca desde donde no puede escalar agregando más hardware, tendrá suficiente dinero en efectivo para financiar medidas más exhaustivas; si no es así, cualquier esfuerzo que haga ahora es una pérdida de tiempo y recursos.

Dicho esto, hay algunas cosas que puedes y debes hacer para mantener tu aplicación mantenible , y si sigues estas pautas, tener en cuenta la escalabilidad será mucho más fácil más adelante en el juego. Una solución ideal le permitirá intercambiar todo el código de almacenamiento de datos con solo cambios mínimos en la lógica del programa y ningún cambio en absoluto en el código de presentación.

tdammers
fuente