Consulta sobre arquitectura de software

Hola que tal?

En esta oportunidad tengo la necesidad de consultarles una propuesta de solución a un problema que tengo que resolver, pero no sé si es la mejor manera de solucionarlo.

El tema es así, tengo una aplicación cliente/servidor desarrollada en symfony2. Por otra parte se debe desarrollar una aplicación en android para que se conecte con el servidor de aplicación para consultar datos y para generar otros.

El tema es que ésto debe ser en tiempo real, para ser un poco más claro la idea es que un profesor se pueda conectar al servidor a través de un navegador web, en el cual pueda dar de alta cuestionarios diversos, por otro lado los alumnos de un curso a través de un código X se deben poder conectar (desde la aplicación en android) para ver los cuestionarios disponibles y poder empezar a responderlos, es una necesidad que en cuanto se finalice el cuestionario, al profesor que está visualizando todos los cuestionarios desde el navegador, le aparezca el progreso o se valla refrescando el progreso de la cantidad de alumnos que ya han terminado de responder el cuestionario.

Por otro lado también se desea que los alumnos desde la aplicación en android puedan realizar consultas y que éstas aparezcan en la pantalla de profesor (en el navegador web).

Para poder dar solución a ésto lo que se me ocurre es desarrollar una api rest para que la aplicación en android se pueda conectar con el servidor, ver los cuestionarios, responderlos, y generar consultas.

Y por otro lado se me ocurre que desde un controllador (de un proyecto hecho en symfony), a través de sockets se comunique X información (porcentaje de alumnos que ya terminaron de responder el cuestionario, consultas realizadas por los alumnos) al cliente (navegador Web).

¿Qué opinan sobre ésta solución al problema planteado?

¿Es una solución correcta y más sencilla de llevar a cabo?

¿Existe alguna otra solución mejor que ignoro?

Desde ya muchas gracias por su ayuda!

Respuestas

#1

@MrXXX0323 tu propuesta se ve interesante. Si lo logras y nunca lo has hecho, aprenderás bastante. En cuanto a si será sencilla, depende. Generalmente esto depende de cuánta experiencia tengas con las herramientas que necesitamos. Si dominas Symfony, Android y el protocolo de sockets será muy fácil. Si no es así, te va a costar un poco. No te asustes. Al final, el gran ganador serás tú.

Espero puedas compartir en algún momento el proyecto. :D...

Saludos!

#2

@cristian_angulo

Muchas gracias por tu respuesta, tengo conocimientos en symfony y en rest, en cuanto a android y sockets, debo admitir que son temas un poco desconocidos para mí, pero no implica que no valla a acetar el desafío es más creo que se podría decir que ya lo acepté porque estoy dispuesto a hacerlo con todo lo que implica.

De lo que no estoy del todo seguro es de si la solución que propongo es la más correcta para la situación planteada.

)

#3

Necesitas una sistema que notifique a los clientes conectados cuando se realice un cambio en los datos.

Firebase es una buena opción.

#4

@MrXXX0323 en desarrollo, soluciones para un problema hay muchos... será bastante difícil acertar qué sea lo correcto. Al final, lo da la experiencia que tengas desarrollando.

La propuesta de @ZaoIsmael es interesante. Firebase te da la posibilidad de tener un backend casi listo para usar. Sólo tendrás que ocuparte en crear tu modelo (de una forma bastante fácil). Firebase te genera servicios JSON que tendrás que consumir. Ya no usarías Symfony. De hecho, reemplazaría a Symfony como Back...

Saludos!

#5

Hola la arquitectura que propones parece ser viable. Si no quieres usar un servicio externo como Firebase, o alguna otra tecnología que haga push, te recomiendo separar el sistema de notificaación del proyecto symfony.

  • Tendrías una API REST en Symfony.
  • Tendrías tu App en Android conectado a un Websocket
  • Tendrías el servicio Websocket (que puede ser en Symfony también)

La ventaja de tener un servicio de notificación aparte del servicio de datos (REST), es que puedes escalar los dos de acuerdo a sus necesidades. Esto no quiere decir que estén en máquinas separadas, pueden ser inicialmente en el mismo servidor.

Si quieres ir en grande, entonces con esta distribución pondrías poner Load Balancers por separados para los dos servicios.

Para el tema de resultados y preguntas, podrías utilizar un sistema de Base de Datos en tiempo real como rethinkdb. Si ya tienes todo el modelo de datos implementado en otro servidor, podrías conectar el servicio REST del servicio Websocket a través de un sistema de notificación de Redis (Pub/Sub).

De todos modos va de acuerdo a tus necesidades. Ya que si la concurrencia es poca entonces bastaría que el servicio de Websocket consultara directamente a la BD cada cierto tiempo.

Espero haber ayudado.