Cómo construir un sistema distribuido simple con Python
Descripción general de los rastreadores distribuidos
¿Qué es un rastreador distribuido?
En términos simples, un rastreador distribuido son múltiples máquinas y múltiples arañas
spider
para múltiples
url
maneja problemas al mismo tiempo y el método distribuido puede mejorar en gran medida la eficiencia de rastreo del programa.
Cuestiones a considerar al crear un rastreador distribuido
(1) ¿Cómo garantizar que varias máquinas rastreen la misma URL al mismo tiempo?
(2) Si un nodo se cuelga, ¿afectará a otros nodos? ¿Cómo continuará la tarea?
(3) Dado que está distribuida, ¿cómo garantizar la escalabilidad y expansibilidad de la arquitectura? ¿Cómo asignar y programar recursos para tareas de rastreo con diferentes prioridades?
Basado en los problemas anteriores, elegí utilizar el apio como una herramienta de programación de tareas distribuidas, que es el módulo central de la programación de tareas y recursos en rastreadores distribuidos. Enviará todas las tareas a cada nodo distribuido para su ejecución a través de la cola de mensajes, de modo que pueda garantizar que la URL no se rastree repetidamente cuando detecte que el trabajador cuelga, intentará volver a enviarla a otros trabajadores. esta información de la tarea, por lo que el segundo problema también se puede resolver; el apio viene con el enrutamiento de tareas, y podemos ejecutar diferentes tareas de rastreo en diferentes nodos de acuerdo con la situación real (hablaré de ello en el capítulo práctico). Este artículo lo lleva principalmente a comprender todos los aspectos del apio (los estudiantes y expertos con experiencia relacionada con el apio pueden omitirlo directamente)
Reserva de conocimientos sobre el apio
Explicación básica del apio
Según la introducción en el sitio web oficial de apio
Celery
es un sistema distribuido simple, flexible y confiable que maneja grandes cantidades de mensajes y proporciona las herramientas necesarias para mantener dicho herramienta. Es una cola de tareas centrada en el procesamiento en tiempo real y también admite la programación de tareas.
Los siguientes son algunos puntos de conocimiento básicos sobre el apio
Broker: Traducido, se llama intermediario. Es un middleware de transmisión de mensajes y puede entenderse como un buzón. Siempre que una aplicación llame a la tarea asincrónica de apio, se enviará un mensaje al intermediario y luego el trabajador de apio recibirá el mensaje y ejecutará el programa correspondiente. En realidad, este es el puente entre consumidores y productores.
backend:
Por lo general, el mensaje enviado por el programa finaliza después de ser enviado y es posible que la otra parte no sepa cuándo ha sido aceptado. Para ello, celery implementa un backend para almacenar estos mensajes, así como algunos mensajes y resultados ejecutados por celery.
Trabajador:
Una instancia de la clase Apio, que se utiliza para realizar diversas tareas. Tenga en cuenta que Windows no admite el trabajador de apio
después de celery3.1.25.
productor:
Envía la tarea y pásala al intermediario.
ritmo:
Apio implementa la tarea programada. Puede entenderse como un productor, porque también envía periódicamente tareas a los trabajadores para su ejecución a través de llamadas de red.
Tenga en cuenta que Celery no admite tareas programadas en Windows.
El siguiente es un diagrama esquemático de la arquitectura del apio. Debería entenderse mejor si se combina con el texto anterior.
Dado que el apio es solo una cola de tareas, no un mensaje real. cola, no tiene La función de almacenar datos, por lo que el corredor y el backend deben usar herramientas de terceros para almacenar información. Celery recomienda oficialmente RabbitMQ y Redis. Además, mongodb también se puede usar como corredor o backend. ser muy estable. Elegimos Redis como corredor y backend aquí.
Ejemplo real
Instalar apio primero
pip
instalar
apio
Usamos el ejemplo dado en el sitio web oficial para ilustrarlo y ampliarlo. Primero, en el directorio raíz del proyecto, aquí creo un nuevo proyecto llamado celerystudy, luego cambio al directorio del proyecto, creo un nuevo archivo task.py y luego ingreso el siguiente código.
Aquí lo haré Hable sobre el código en detalle: Primero cree una instancia de un objeto de apio a través de app=Celery(). En este proceso, especificamos su intermediario, que es db
2 de redis, y su backend, que es db3 de redis. ,
La forma de conexión del broker y el backend es más o menos así
redis://:contraseña@nombredehost:puerto/número_db
Luego se agrega una función de adición. definido, el punto clave es @app.task. En mi opinión, su función es registrar add()
como algo similar a un servicio después de decorar la función que solo se puede llamar localmente. , puede ser red para llamar. La aplicación en task.py es un trabajador. Puede tener muchas tareas, como la función de tarea agregar aquí. Luego cambiamos al directorio raíz del proyecto en la línea de comando y ejecutamos
celery
-A
tasks
worker
-l
info
Después de un inicio exitoso, se verá como la imagen a continuación
Aquí hablaré sobre el significado de cada parámetro. -A especifica que es el módulo de archivo donde se encuentra la aplicación (es decir, la instancia de Celery). Nuestra aplicación está ubicada en task.py, por lo que aquí
tasks trabajador significa que actualmente se está ejecutando como trabajador. ¿Hay alguna otra manera? Sí, por ejemplo, cuando ejecuta una tarea programada, no necesita especificar la palabra clave del trabajador;
-l
info indica que el nivel de registro del nodo trabajador es info. Más parámetros sobre cómo iniciar el trabajador (por ejemplo, -c, -Q y otros de uso común), utilice
apio
trabajador
--help p>
para ver
Después de iniciar el trabajador, podemos llamar a la función agregar a través de la red. También utilizamos este método para distribuir y consumir URL en la posterior construcción del rastreador distribuido. Primero cambie al directorio raíz del proyecto en la línea de comando y luego abra el terminal interactivo de Python
desde
tareas
importar
addrs
=
add.delay(2,
2)
El add.delay aquí es para enviar la tarea al trabajador donde se ubica add a través de llamadas de red Ejecución, en este momento podemos ver las tareas recibidas y los resultados del cálculo en la interfaz del trabajador.
Esta es una llamada asincrónica. Si necesitamos el resultado devuelto, tenemos que esperar a que el estado listo de rs sea verdadero. No hay ningún efecto de agregar aquí, pero imagínese, si llamamos a una tarea io que lleva mucho tiempo, entonces la tarea asincrónica será más valiosa
Lo anterior trata sobre llamar a la función agregar desde la terminal interactiva de Python, ¿qué pasa si queremos llamarlo desde otro archivo py? Además de importar y luego agregar.delay(), también podemos usar send_task(). Creamos un nuevo archivo py en el directorio raíz del proyecto llamado
excute_tasks.py y escribimos en él el siguiente código.
desde
tareas
importar
addif
__name__
==
'__main__':
add.delay(5,
10)
En este momento, puede utilizar la interfaz del trabajador de apio Ver los resultados de la ejecución
Además, también podemos llamarlo a través de send_task() y cambiar excute_tasks.py a esto
Este método también es posible. send_task() también puede recibir tareas que no están registradas (es decir, decoradas con @app.task. En este momento, el trabajador ignorará este mensaje
Tareas programadas
). La sección anterior habla sobre cómo iniciar trabajadores y funciones relacionadas que llaman a los trabajadores. Aquí hablaremos sobre las tareas programadas de apio.
Debido a su particularidad, es posible que los rastreadores necesiten realizar un rastreo incremental a intervalos regulares, o pueden necesitar realizar inicios de sesión simulados a intervalos regulares para evitar la caducidad de las cookies, y el apio implementa con precisión la función de tareas programadas. Con base en lo anterior, cambiamos el archivo task.py al siguiente contenido
Luego detenemos el trabajador anterior mediante Ctrl c. Debido a que nuestro código ha sido modificado, debemos reiniciar el trabajador para que surta efecto. . Iniciamos nuevamente el trabajador con el comando apio
-A
tareas
trabajador
-l
información.
En este momento, acabamos de abrir el trabajador. Si queremos que el trabajador realice tareas, también debemos enviarlo regularmente a través de Beat. Abrimos otra línea de comando, cambiamos al directorio raíz del proyecto y. pasar
Esto significa que la tarea programada ha comenzado a ejecutarse.
Los estudiantes con visión aguda pueden ver que la versión de celery aquí es 3.1.25. Esto se debe a que la versión más alta de Windows compatible con celery es 3.1.25. Dado que el trabajador de mi rastreador distribuido de Weibo también está implementado en Windows, elegí usar
3.1.25. Si es todo un sistema Linux, se recomienda utilizar celery4.
Además, hay otro punto a tener en cuenta. Después de celery4, las tareas programadas (las programadas mediante programación serán así y las programadas mediante crontab se ejecutarán inmediatamente) ejecutarán la primera tarea en el momento actual. después del intervalo programado, por ejemplo, el intervalo que configuré aquí es de 60 segundos, entonces la primera ejecución de add será después de que pasemos apio
beat
-A
tareas p>
-l
info ejecutará la tarea programada 60 segundos después de su inicio. celery3.1.25 ejecutará la tarea inmediatamente
;