Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




JuAn4k4

#59460 Eso es pull va push de updates, los datos se actualizan alguna vez ? No poder servir 5k/sec es raro, que es un single instance mal hecho o como ? O tira directamente de la db ? Las queries son de lectura, porque dan problemas si puedes tener copias que quieras y donde quieras ?

La solución es poner 3 máquinas más o una 3 veces más tocha, ponerse la medalists ahora y barrer el problema para delante, para ponerte más medallas lo más pronto posible, pero no antes de que recuerden la anterior.

1 respuesta
PiradoIV

Un Varnish delante y pista.

1 respuesta
Kaledros

#59460 ¿Cuando dice "tournament update requests" se refiere a que se updatea el leaderboard o que los clientes piden actualizaciones?

Sea como sea, si lila es el cuello de botella, una solución sería replicar los datos cacheados. Tienes una fuente de la verdad que se va actualizando con datos del torneo y cada acualización updatea las cachés. Cuando un cliente pide los datos del torneo un load balancer los distribuye entre las réplicas.

1 respuesta
PiradoIV

Acabo de ver el JSON que devuelve el endpoint, da completamente igual que la petición venga autenticada. Varnish es la solución al problema que tienen. Le han puesto hasta un "Cache-Control: max-age=0", por las risas.

Encima, aunque el navegador no use la caché, sí que podrían cachearlo indefinidamente en Varnish y, cuando algún dato del torneo se modifique, se le pide a Varnish que invalide la caché concreta del torneo con su Xkey.

desu

#59461 #59463 es como funciona un servicio de lichess, para jugar torneos https://github.com/lichess-org/lila-http/blob/master/README.md

la arquitectura cada caja con un nombre es un servidor

asi que si, podria decirse que es un "single instance" mal provisionado xq es un monolito y no se puede escalar muy bien. aun asi, yo creo que se soluciona:

  • haciendo push de eventos, si es un torneo no necesitas hacer polling, cuando la partida termina haces push
  • teniendo una cache dedicada para los torneos mas grandes, fijaros en el diagrama como de lila-http va a una redis y de la redis a lila (que es el backend) y de ahi a db.

a mi esta solución me parece horrible, xq bien si desacoplas las peticiones HTTP de lila, el backend, pero estas golpeando la misma redis... y haciendo push en lugar de poll lo solucionas todo. si estas jugando un torneo te interesa saber los resultados de otras partidas, y entiendo que cada 4 segundos es para poder subscribirte a otras partidas y mirar como van, yo creo que esto es otro caso de uso.

1 1 respuesta
Kaledros

#59465 ¿Hacer broadcast desde el server de lila en este caso funcionaría? Rollo hacer fanout con un servicio de mensajería y quien quiera que lo pille.

1 respuesta
desu

#59466 no hace falta tanto, con hacer un push a una cache de los resultados/partidas del torneo es suficiente y luego habria que ver que otros cuellos de botella hay. como lo que comento de querer seguir las partidas de tu torneo... pero eso ya es otro caso de uso, el de espectador.

lo comparto porque liches lo lleva un tio y esta todo en Scala, y ahora también rust:

y me he mirado un poco las cosas y tampoco es que esten muy alla... esto mismo esta mal diseñado, de que te sirve meter rust??? si vas a hacer polling igual

#59462 si es tan fácil como tener una cache para los torneos en curso que se vaya limpiandono haciendo push desde el server... si total, todos los movimientos y partidas pasan por el server principal, no hace falta ni crear eventos, push directo a la cache del torneo y de ahi se lee.

1 respuesta
PiradoIV

#59467 Viendo el tinglado de lo que tienen montado, les va a resultar más sencillo despachar 5k peticiones puntuales que tener 5k conexiones abiertas y hacer push.

1 respuesta
desu

#59468 lo que dices no tiene sentido, q quieres decir "tener 5k conexiones abiertas y hacer push"? las conexiones tcp se re-utilizan y en este caso estarías pusheando a tu propia redis... escalas la redis o la cache que quieras poner y punto.

y para resolver los get al backend/db cambia el polling por un push, asi solo haces polling de la redis.

antes:

client => redis cache miss => lila => db (cada 4s)
client => redis cache hit

ahora:

client => redis <= lila push (cada 4s o cada evento importante como fin de una partida)

y es imposible que haya un miss si inicializas los torneos desde lila, no habra un torneo que no exista en la cache de torneos.

el problema es que el refresco de 4s no lo soporta su lila/db y ademas, intuyo que la redis se les queda pequeña y necesitaran escalar horizontal.

1 respuesta
Kaledros

¿Los torneos se actualizan por resultado final o por movimiento? Porque si es lo segundo igual cuando haya muchas partidas simultáneas habría que empezar a considerar otras cosas, si no puede con cinco mil partidas simultáneas menos va a poder con los movimientos simultáneos de cinco mil partidas.

1 respuesta
PiradoIV

#59469 Pensé que hablabas de hacer push del servidor al navegador, con WebSockets.

Edit: Pero vamos, que tienes el mismo problema. Alguien tiene que leer de ese Redis, cuando el JSON de respuesta es lo que podría estar cacheado y lo podría servir Varnish mucho más rápido.

Con Varnish puedes invalidar la caché y seguir sirviéndola mientras se regenera, generando una única petición al servidor de aplicación.

1 respuesta
desu

#59470 las partidas creo que van por websocket, por eso tiene dos servidores de websocket para escalar.

#59471 Bueno para mi varnish y redis responderían lo mismo. Hablo de una cache a nivel conceptual. Pero vamos, partidas y resultados son por muchos miles que haya no deja de ser unos kib de data...

Que por cierto me he fijado y veo que el redis es pub/sub, no cache como tal. Asi que quizás si que se esta subscribiendo a una cola de eventos. Donde cada torneo es un topic. Entonces lo que debería hacer es escalar el redis... si con 5k req se le peta lol.

1 respuesta
PiradoIV
#59472desu:

Bueno para mi varnish y redis responderían lo mismo.

Salvo que Varnish se lo respondería directamente al navegador, con mucho menos desperdicio de recursos.

Konishi

El programa de hoy ha sido patrocinado por VarnishIV.

Con una capa de VarnishIV, su servidor quedará protegido contra cualquier tipo de substancias, desde bilis de managers a las babas de FPeros.

No espere más y busque VarnishIV en su foro de Ofertas más cercano. O pruébelo a través de Xojo sin compromiso

2
PiradoIV

Redis es amor... pero es que Varnish es lo que necesitan para resolver el problema que tienen xD

vincen
1 respuesta
desu

#59476 las lineas pueden ser perpendiculares en N dimensiones, solo necesitas mas dimensiones...

desu

https://blog.cloudflare.com/making-waf-ai-models-go-brr/
https://blog.cloudflare.com/faster-workers-kv/
https://blog.cloudflare.com/reclaiming-cpu-for-free-with-pgo/

JuAn4k4

Si los 17K están pidiendo lo mismo cada 4s, varnish les vale, pero es que hasta un cloudfront les valdría si no quieren gestionar nada.

1 respuesta
desu

#59479 el estado de las partidas cambia en real time.

1 respuesta
JuAn4k4

#59480 Redis tiene client side redis que no es más que pub/sub sobre keys. Lo que pasa que claro expones un redis a pelo

PiradoIV

El endpoint lo consulta el navegador cada 4s, da igual la inmediatez, con Varnish les sobra.

1 respuesta
desu

#59482 Que pesado eres compañero con Varnish, que la solución primero es cambiar el push por polling en el backend. Da igual si usas Varnish o no si todo son cache misses.

1 respuesta
PiradoIV

#59483 No son todo misses. Tienes hit, miss y stale. La caché obsoleta se seguirá sirviendo para todas las conexiones mientras una única petición le va a llegar al backend para refrescarla.

1 respuesta
desu

#59484 Que las partidas son en tiempo real, en 4s si tienes cientos de partidas todo sera miss... no has jugado a blitz en tu vida no? una partida son 3 minutos, con incremento de +2 segundos por movimiento, pon que una partida te dura unos 5 minutos de media... con 4s ya es un buen average de tiempo por jugada, pero en los momentos finales de la partida que vas volando las partidas no puedes hacer nada.

Tanto al principio como al final de la partida donde tendrás varios movimientos por segundo si alguien esta en espectador se le congelara. Por eso comente que el problema de spectator es mejor tratarlo de otra manera y lo mejor es tener push del server a la cache del estado de las partidas.

Y en los momentos intermedios de la partida en medio juego donde mas vas a pensar, pon 10-20segundos incluso, entonces vas a hacer 4 polls que no valen nada que van a dar en la cache...

El problema a resolver es tener una cache para partidas en tiempo real eficiente y maximizar la UX. Ubicate fpero.

1 respuesta
PiradoIV

#59485 Da igual que sea en tiempo real, el endpoint lo consulta el navegador cada 4s y es un JSON normal y corriente cacheable.

Así no vas a salir de fpero. Échale un ojo a la documentación de Varnish, que igual aprendes algo esta semana.

1 respuesta
HeXaN

Os recuerdo que no por escribir "tochos" vais a llevar la razón. Un saludo y buen viernes.

1 1 respuesta
desu

#59486 Con lo que acabas de decir dejas claro que no has entendido el problema ha resolver ni después de que te lo re-explicase.

#59487 Yo al menos no escribo tochos, es que puedo razonar, explayar, explicar para un niño de 5 años, todo lo que digo. Es lo bueno de saber de lo que hablas. Te lo recomiendo algún día.

1 respuesta
PiradoIV

#59488 Yo que tú me leería el problema de nuevo. Es lo típico de juniors, les piden algo concreto y se ponen a soltar chorraditas genéricas del estilo “para mí Redis y Varnish es lo mismo”, “caché abstracta”.

Soluciones concretas a problemas reales.

1 respuesta
desu

#59489 Ahora soluciona el problema que te piden y no el unico que sabes.

Si filtro este hilo con tus mensajes solo hablas de Varnish....

El típico de tengo un martillo y todo es un clavo...

Tienes 40 años y no sabes resolver un problema de pushing vs polling... si si, tu pon Varnish.