Closed JJ closed 1 year ago
¿Cómo actualizarán la db los crawlers?, si estos se ejecutan periodicamente (y, en algunos casos, fallarán al extraer informacion) podría ser conveniente diseñar algun middleware (por ejemplo, algo basado en colas/cache) para gestionar esta actualizacion. Otra opción más simple, al menos para ir empezando, es que los crawlers modifiquen la db directamente
El 20 de julio de 2017, 17:39, Andrés notifications@github.com escribió:
¿Cómo actualizarán la db los crawlers?, si estos se ejecutan periodicamente (y, en algunos casos, fallarán al extraer informacion) podría ser conveniente diseñar algun middleware (por ejemplo, algo basado en colas/cache) para gestionar esta actualizacion. Otra opción más simple, al menos para ir empezando, es que los crawlers modifiquen la db directamente
También podemos crear una arquitectura de microservicios basada en eventos donde las modificaciones de la BD se propaguen a los diferentes clientes. Desde luego con muchísimos clientes escalará mucho mejor (y la optimización prematura es la madre de todos los vicios, ya lo sé)
Esto estaría de acuerdo con la opción 1. En este caso los crawlers actuan como servicios, mediante eventos (un middleware con rabbitmq por ejemplo) pueden actualizar la db. La verdad, no creo que el cuello de botella, o los problemas, se encuentren en la parte cliente/db, al final, esa parte es bastante estándar, con una api conectada a una db, que no debería ser un problema enorme de escalar, los crawlers sin embargo podrían llegar a dar muchos problemas si no se diseña bien esa parte
Piensa de todas formas que para que sea sostenible toda la infraestructura debería de meterse en hosting gratuitos tipo OpenShift o zeit.co. De todas las opciones, conviene elegir la más simple.
A ver que os parece estas opciones:
Probablemente, lo ideal es comenzar con la arquitectura más simple posible:
Esta arquitectura es útil como primera implementación, ya que no presenta ninguna complejidad al desplegarla (2 servicios, 1 con base de datos) y es relativamente facil de extender
Ñapa-diagram: Arquitectura v1
Idealmente (y si fuera necesario escalar en el futuro) se pueden dividir algunos servicios:
La cola de eventos permite tener mayor "reliability" en los mensajes, evitando perder información si alguno de los servicios está caido temporalmente, o si los webscrappers fallan.
Tener una api que únicamente lee base de datos debería simplificar el escalado, si hubiera muchos clientes.
Obviamente, está opción es considerablemente más compleja, intentar desarrollar algo como esto sin necesidad me parece overengineering
Arquitectura v2
En cualquier caso, a partir de la opción 1 es fácil pasar a la intermedia que propones
No se muy bien la diferencia entre scraper vs. crawler, y no se cual queremos implementar
No se muy bien la diferencia entre scraper vs. crawler, y no se cual queremos implementar
Un scraper extrae información de una sola página web. Un crawler te lleva hasta esa página web, incluyendo autenticación, navegación por el sitio, cosas así.
Con respecto a la arquitectura, propondría utilizar la V1, principal por velocidad: El acceso a una BBDD "cercana" al servicio web siempre será más rápido que hacer scraping bajo demanda (Además de que utilizará menos ancho de banda y recursos del servidor), además de que podremos aprovechar tecnologías de cacheo de contenido.
Los únicos contras que le veo es que habría que implementar una forma de detectar cambios de útlima hora en el contenido (¿quizás almacenando el checksum del fichero html analizado cuyos datos se han introducido en la BBDD y calculando cada dia de nuevo el checksum de la web para detectar cambios?)
@gDanix Ambas arquitecturas usan una DB, ninguna usa scrapping bajo demanda
La idea es que los scrapers actuen periodicamente (2~5 minutos?), la arquitectura 2 además contempla hacer peticiones bajo demanda (por ejemplo, si lleva mucho tiempo sin actualizarse o algo)
Cada scraper tendría que tener su periodicidad. Se programa y listo. Los del comedor no sé si es semanal o diaria.
@angrykoala cierto, malinterpreté la arquitectura. Ahora, si me lo permitís, cambio de opinión y voto por la opción 2. Quizás en un principio se pueda simplificar, pero creo que conforme crezca la aplicación nos resultará más útil.
@JJ Normalmente se actualiza un par de veces a la semana
@gDanix aunque la version 2 mola bastante, pienso (y lo pienso seriamente) que es overengineering, bien implementado quizás ni es necesario cambiarlo en el futuro, y si se hace bien, no deberia ser dificil pasar de V1 a V2 (o a cualquier otra opción que se nos ocurra en el futuro) ya que siempre es más facil pasar de algo más simple a otra cosa más compleja que al reves
Si comenzamos con la V1 y luego cambiamos, que no se nos olvide versionar las APIs, porque en el momento del cambio de arquitectura, la API también cambiará.
El 21 de julio de 2017, 17:39, Daniel Trujillo Viedma < notifications@github.com> escribió:
Si comenzamos con la V1 y luego cambiamos, que no se nos olvide versionar las APIs, porque en el momento del cambio de arquitectura, la API también cambiará.
Cierto...
No deberia cambiar la API, lo dicho, si se diseña bien, la api que cambiaria sería unicamente la interna (scrapers) la api externa a los clients, que es la importante, debería mantenerse.
De hecho, incluso la base de datos deberia mantenerse tambien
Propongo dividir la 1º iteracion del proyecto en 3 partes (milestones o kanbanes):
Ahora que ya tenemos medianamente desechada la arquitectura 2, tenemos estas 2 opciones para refinar la arquitectura 1:
Acceso directo a BBDD por parte de los scrapers:
API de mantenimiento para la comunicación de los scrapers:
Fuentes: diagramas arq v1 SerU.zip
Yo, personalmente, voto por la segunda. Permitiría simplificar los scrapers ya que, por lo general, creo que es más complejo acceder a bases de datos que hacer peticiones web. Además, seguimos la filosofía de otros servicios como Apache Solr.
Me parece que @gDanix ha colgado el mismo diagrama
La principal diferencia es añadir una API entre la BBDD y los scrapers, para que estos no accedan directamente
Coincido en que creo que esta es la mejor opción, generalmente es mejor desacoplar todo lo posible las base de datos de la lógica, más aun cuando los scrapers (potencialmente) pueden ser procesos dinámicos, personalizados o corriendo en una especie de "sandbox"
@angrykoala cierto. Ya está arreglado, siento muchísimo el error
No problem @gDanix , me gustan los diagramas que has puesto, ¿podriamos cambiar el nombre "Api de mantenimiento" a otra cosa? (scrapers API o lo que sea...)
Sin problema, hombre. Un buen trabajo. Sube también los fuentes cuando puedas. Me sigue gustando más la opción 1. Si tenéis alguna buena razón para la opción 2, estoy dispuesto a escucharla.
Ok, ya están subidos también los archivos fuente. Están comprimidos en zip porque GitHub no te deja adjuntar el tipo de archivos que he generado.
@angrykoala sin problema, lo llamé así por diferenciarlo de la API de consulta (o clientes o lo que sea), pero lo podemos llamar como querais.
@JJ En realidad, tanto en un modelo como en otro se pueden implementar las mismas medidas de seguridad, y se tiene la misma funcionalidad. Si bien es cierto que Solr utiliza una interfaz web, es porque realiza un indexado complejo que requiere cierto procesamiento, mientras que nuestra aplicación es mucho más sencilla, por lo que, siguiendo ese criterio, no sería estrictamente necesaria esa API.
@JJ
En general, son las ventajas que se pueden obtener de desacoplar cualquier sistema externo, cuantas menos interdependencias tengamos, más fácil es cambiarlo y testearlo
La principal desventaja de usar la opción 2 (al menos que yo vea, si hay alguna más comentadla) es que aumenta la complejidad de la api (hay que implementar un 2º "servicio" de la api) pero me da la impresión que la complejidad de implementar una API REST con CRUD es muchisimo menor que tener accesos a la BBDD en todos los scrapers.
No se si me he perdido algo por lo que no te parezca bien la opción 2 :(
Como queráis. Vosotros sois los pro :-)
Sólo os digo que nada simplifica la implementación de un scraper.
Si no te gusta es que habrá alguna cosa, mejor saber ahora las pegas que no descubrirlas a medio camino
Me imagino, por eso creo que es mejor quitar toda la complejidad de los scrapers que no sea exclusiva del propio scraping
Si se descubren a medio camino, se refactoriza y listo. Únicamente os repito lo de antes, ponéis el interfaz web como un bloque monolítico y no tiene por qué serlo. Pueden ser diferentes interfaces a diferentes servicios.
Esta nueva propuesta creo que soluciona los problemas de las otras dos:
Fuente: diagrama SerU V3.zip
Me parece estupendo.
¿Puedes subir la fuente al repo?
Un inicio sería