elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?  (Leído 6,025 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
[Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« en: 13 Junio 2020, 22:26 pm »

Básicamente tengo un sistema de versiones (v0.0.1, v.1.5.2, etcétera) que al agregar una quiero que se les envíe una notificación a todos los usuarios avisándoles, pero quiero hacerlo de la mejor forma posible para que el sistema no vaya lento o se "atasque"...

imaginemos una aplicación con 1 millón de usuarios...

Código
  1. $id_version = versiones::Agregar($x);
  2. notificaciones::Agregar($id_user, $id_version, 'versiones.php');
  3.  

se me ocurre hacer un for por medio de la cantidad de usuarios en total registrados, pero como dije un for con 1 millón de iteraciones no me parece una buena solución...

Código
  1. $id_version = versiones::Agregar($x);
  2.  
  3. for($i = 0; $i < count($usuarios_total); $i++)
  4. {
  5.        notificaciones::Agregar($id_user, $id_version, 'versiones.php');
  6. }
  7.  

Gracias!


En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #1 en: 14 Junio 2020, 05:16 am »

Pues lo ideal sería que usara concurrencia y paralelismo. Por ejemplo, podrías dividir la carga entre 4 diferentes procesos (250,000 registros por proceso) aunque ahí también va a depender del scheduler del sistema operativo.

Realmente, 1 millon de usuarios conectados al mismo tiempo a un solo servidor es bastante de por sí... Ni se diga que tienes que cargar 1 millon de registros. Imagina que son 250 bytes de información por registro, 1 millon de registros es cerca de 250MB en RAM.


En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #2 en: 14 Junio 2020, 10:44 am »

Pues lo ideal sería que usara concurrencia y paralelismo. Por ejemplo, podrías dividir la carga entre 4 diferentes procesos (250,000 registros por proceso) aunque ahí también va a depender del scheduler del sistema operativo.

Realmente, 1 millon de usuarios conectados al mismo tiempo a un solo servidor es bastante de por sí... Ni se diga que tienes que cargar 1 millon de registros. Imagina que son 250 bytes de información por registro, 1 millon de registros es cerca de 250MB en RAM.

Estaba pensando algo parecido, pero lo dejé como una utopía... pero ahora que vos también lo comentas veré si no hago algo como eso.

No tengo del todo claro como debería hacerlo igualmente...
En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #3 en: 14 Junio 2020, 12:47 pm »

Y hacer una pagina UltimaVersion.html y que los clientes le hagan GET? Si cambia haces un alert. Así cachean, cuando la modifiques cambias la url para evitar cachear y que se actualice:

<?php echo "<img src='example.com/UltimaVersion.html?'".$VERSION.">"; ?>

Mientras el valor de $VERSION no cambie, no recibirás peticiones más de una vez a ella porque se cachea el archivo.

Podrías meter dentro del hexadecimal de la imagen tu código javascript raw, fetchearlo y extraerlo. Es una técnica conocida para esconder exploits escritos en js.
https://blog.malwarebytes.com/threat-analysis/2019/12/new-evasion-techniques-found-in-web-skimmers/amp/
« Última modificación: 14 Junio 2020, 12:52 pm por @XSStringManolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #4 en: 16 Junio 2020, 00:16 am »

Estaba pensando en hacerlo con una consulta SQL,
no se si se podrá, que dicha consulta diga de agregar una notificación a todos los usuarios registros en lugar de usar un for en php, no se si será el mismo gasto la verdad...
En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #5 en: 16 Junio 2020, 07:21 am »

Estaba pensando en hacerlo con una consulta SQL,
no se si se podrá, que dicha consulta diga de agregar una notificación a todos los usuarios registros en lugar de usar un for en php, no se si será el mismo gasto la verdad...

Hacelo de forma inversa. Crea un tabla donde guardas las notificaciones a medida que los usuarios son notificados...

Así cuando un user entra, revisas en esa tabla si ya se notifico de X versión, si lo está no haces nada, si no lo esta, le mostras la notificación y luego creas el registro. entonces tu tabla no tendría un millón de registro de entrada, sino que se iría poblando a medida que van entrando los usuarios y solo se notificará a los usuarios activos.

Todo esto es en teoria, pero en un escenario real yo no usaría una base SQL para eso, mejor usaria una base como Redis que es mucho más eficiente y rápida y es el estándar de la industria para el realtime o cosas que necesiten mucha velocidad y el menor consumo manejando un volumen gigante de datos. Trabaja sobre la memoria ram, pero si tenes un sistema con un millón de usuarios supongo que tendrás un servidor con sobrados GB's de ram....  :silbar:

Otra forma que se me ocurre, un poco mas cutre, seria usar algun servicio de archivos estáticos con un cdn global, como Github.

Simplemente tendrías que crear un archivo json e ir metiendo ahí tus versiones. Entonces sería el cliente el que tendría que consultar el contenido de dicho archivo. Asi podes sacar toda la lógica de negocio de tu propia infraestructura, y a github un millón de peticiones no le hacen ni cosquillas...
« Última modificación: 16 Junio 2020, 07:32 am por [u]nsigned » En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #6 en: 16 Junio 2020, 22:53 pm »

Probastes lo de github? Igual chapan con un 301
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #7 en: 17 Junio 2020, 05:43 am »

Probastes lo de github? Igual chapan con un 301

Con la version 'raw' no debería tener problemas.

Código
  1. curl -H "Accept: application/json" https://raw.githubusercontent.com/LearnWebCode/json-example/master/animals-1.json
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: [Pregunta]: ¿Una forma eficiente de hacer algo como esto?
« Respuesta #8 en: 17 Junio 2020, 08:10 am »

Con la version 'raw' no debería tener problemas.

Código
  1. curl -H "Accept: application/json" https://raw.githubusercontent.com/LearnWebCode/json-example/master/animals-1.json

Ostraaas, y se puede fetchear cross origen. Pensaba que hacían lo mismo que con los .js a pesar de ser json.

Código
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <body>
  6. <script>
  7. function PeticionGET(url, callback) {
  8.  var peticion = new XMLHttpRequest();
  9.  peticion.open("GET", url , true);
  10.  peticion.send();
  11.  peticion.onreadystatechange = function() {
  12.    if (peticion.readyState == 4) {
  13.      if (peticion.status == 0 || peticion.status == 200) {
  14.        callback(peticion.responseText);
  15.      }
  16.    }
  17.  }      
  18. }
  19.  
  20. PeticionGET("https://raw.githubusercontent.com/LearnWebCode/json-example/master/animals-1.json", function(respuesta) {
  21.  try {
  22.   document.write(JSON.stringify(respuesta));
  23.  } catch (err) {
  24.    alert(err);
  25.  }
  26. });
  27. </script>
  28. </body>
  29. </html>
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como puedo hacer algo komo esto???
Multimedia
incog 7 3,498 Último mensaje 30 Junio 2005, 20:40 pm
por incog
como hacer q funcione algo descargado d 1 forma.
Multimedia
34danis 3 1,983 Último mensaje 17 Enero 2006, 14:49 pm
por Songoku
quiero hacer algo como esto...
Electrónica
peib0l 2 4,680 Último mensaje 18 Junio 2007, 11:27 am
por lu8emw
[Resuelto] [Pregunta]: ¿Es posible hacer algo como esto?
Desarrollo Web
Leguim 5 3,797 Último mensaje 25 Agosto 2019, 19:54 pm
por @XSStringManolo
[Pregunta]: ¿algo como esto?
Desarrollo Web
Leguim 2 3,020 Último mensaje 2 Marzo 2020, 08:15 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines