2012-04-26 14 views
7

Tengo un juego basado en el iPhone en línea, con muchos juegos corriendo al mismo tiempo. Estoy en el proceso de optimizar el código, ya que tanto el servidor como yo hemos fallado hoy.1.3M consultas/Hora. ¿Cómo construirías las consultas?

Esta es la configuración:

Ahora mismo tengo una tabla, "coincidencias" (70 campos de datos para cada fila de la estructura.), Que mantienen un registro de todos los partidos activos. Cada 7 segundos, el iphone se conectará, descargará todas las coincidencias en la tabla de "coincidencias" en la que esté activo y actualizará la interfaz de usuario en el iPhone.

Esto funcionó muy bien hasta que aproximadamente 1000 personas descargaron el juego y jugaron. El servidor se colgó.

Para optimizar, creo que puedo crear una nueva tabla llamada "matches_needs_update". Esta tabla tiene 2 filas; nombre e id. El "id" es el mismo que el partido en la tabla "coincidencias". Cuando se actualiza una coincidencia, se coloca en esta tabla.

Ahora, en lugar de buscar en toda la tabla de "coincidencias", la consulta solo verifica si el jugador tiene alguna coincidencia que deba actualizarse, y luego obtiene esas coincidencias de la tabla "coincidencias".

Mi pregunta es doble:

  1. Es esta la solución óptima?
  2. Si un jugador está activo en, digamos 10 partidos, hay una buena manera de obtener esos 10 partidos de la tabla de "partidos" al mismo tiempo, o necesito un bucle para hacer 10 consultas, una para cada partido:

    "SELECCIONAR * FROM coincide con WHERE id =?"

Gracias de antemano

+6

Si bien el problema es grave, este es uno de los mejores tipos de problemas que puede tener, si lo piensa. El bloqueo de demasiados usuarios reales es el mejor tipo de bloqueo. – Cyclone

+1

Una solución que utiliza las Notificaciones Push podría ser una mejor manera de evitar el problema de rendimiento. De esta manera no tendrá muchos controles de giro redundantes –

+1

Parece que una persona puede estar activa en varias coincidencias y varias personas pueden estar activas en una coincidencia. Sin duda debe tener 3 tablas? – DanRedux

Respuesta

6

Sugiero APC ...

... como estás en PHP, y supongo que estás haciendo esto desde una sola base de datos MySQL,

Es fácil de instalar, y será predeterminado desde PHP 6 en adelante.

Mantenga esta 1 tabla en la memoria y volará.

+0

Gracias por responder. ¿Debo actualizar todo mi código php para manejarlo o solo para instalarlo? Gracias – BlackMouse

+0

APC es 2 cosas. Es un caché de código de operación (almacena en caché el código PHP para que se cargue más rápido) y un almacén de memoria (es decir, clave-valor). La primera parte ocurre automáticamente y da un impulso de velocidad. Pero estás interesado en el segundo bit. Entonces sí, necesitas actualizar tu código. Lea la página del manual que he vinculado, y comience con apc_store para obtener la idea. – HappyTimeGopher

7

Se necesitan salir de la base de datos. Mira a Memcache o Redis.

2

Su base de datos parece realmente pequeña. Una tabla con 70 filas debería volver en milisegundos e incluso cientos de consultas por segundo deberían funcionar sin problemas.

Un par de punteros tradicionales

  • Asegúrese de que las conexiones de la piscina. Nunca debe tener que hacer la conexión cuando un cliente necesita los datos.
  • Asegúrese de que haya un índice en "el usuario está en coincidencia" para que el resultado se obtenga del índice.
  • Estoy seguro de que tienes suficiente memoria para mantener toda la estructura en la caché y con estas tablas pequeñas no se necesita configuración adicional.
  • Asegúrate de que tu esquema esté normalizado.Una tabla para cada usuario. Uno para cada partido Y uno para cada usuario en un partido.
1

Es hora de iniciar el almacenamiento en caché, por ejemplo, memcache y apc.

En cuanto a bucle a través de los partidos ... esa es la manera incorrecta de hacerlo.

¿Cómo se conecta un usuario a una coincidencia mediante una tabla de referencias externas? o la mesa de partido tiene algo así como player1, player2.

Looping aunque las consultas no son el camino correcto para indexar sus tablas y hacer un join para obtener todas las coincidencias activas de un usuario Id me haría más eficiente. Dando la cantidad de usuarios que también querrás (si no has) dividido las mesas para juegos activos e inactivos.

Si hay 6000 juegos activos y 3,000,000 inactivos es extremadamente beneficioso dividir estas tablas.

Cuestiones relacionadas