Запуск нескольких задач в Python - PullRequest
0 голосов
/ 12 июля 2020

У меня несколько серверов, которыми пользуются 10 000 клиентов по всему миру. Каждый клиент может инициировать задачу, выполнение которой на сервере занимает около 5 минут. И если сервер полностью занят, задача должна быть поставлена ​​в очередь.

Вопрос в том, какая правильная архитектура библиотек может поддерживать эту проблему? Конкретно цели ниже:

  1. Мониторинг и параллельное выполнение нескольких задач
  2. Мониторинг ресурсов и выбор задач из очереди, только когда ресурсов достаточно

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вам необходимо настроить брокера сообщений, например RabbitMQ или Redis. Если данные очередей должны быть постоянными, я рекомендую вам использовать RabbitMQ. Для отправки и получения задач вы можете использовать Celery, который позволяет вам как отправлять задачи в очередь, так и запускать их в воркерах Celery. Для мониторинга очереди существует Flower. В настоящее время очень хорошая практика - реализовать всю вашу архитектуру с помощью docker. Я покажу вам пример docker -compose.yml, который устанавливает 3 контейнера: кролик, цветок и сельдерей. единственное, что вам нужно сделать, это запустить команду docker-compose up -d:

version: '3.3'
services:
  rabbit:
    image: rabbitmq:3-management-alpine
    restart: always
    environment:
      RABBITMQ_ERLANG_COOKIE: cookie
      RABBITMQ_DEFAULT_USER: Admin 
      RABBITMQ_DEFAULT_PASS: 1234
    ports:
      - 5672:5672
      - 15672:15672

  celery:
    build: 
      context: .
    volumes: 
      - ./src:/app
    command: celery -A appendapp worker --loglevel=debug
    environment: 
      RABBITMQ_HOST: rabbit

  flower:
    image: mher/flower
    restart: always
    ports:
      - 5555:5555
    command:
      - "--broker=amqp://Admin:1234@rabbit//"

Код ./src/appendapp.py прочитать список из файла json, затем добавить элемент и, наконец, сохраните обновленный список в файл. код выглядит так:

from celery import Celery
import os, json, time

# Where the downloaded files will be stored
BASEDIR="./hola.json"

RABBIT_HOST = os.getenv("RABBITMQ_HOST") or "localhost"

# Create the app and set the broker location (RabbitMQ)
app = Celery('appendapp',
             backend='rpc://',
             broker=f'pyamqp://Admin:1234@{RABBIT_HOST}//')

@app.task
def add_item(item):
    #time.sleep(2.5)
    file = open(BASEDIR)
    data = json.load(file)
    data.append(item)
    file.close()
    wfile = open(BASEDIR, "w")
    json.dump(data, wfile)
    wfile.close()
    return f"Se agrego {item}"
0 голосов
/ 12 июля 2020

Ну, это может быть случай использования сельдерея и мониторинга с помощью цветка .

Сельдерей - это простой, гибкий и надежный распределенный система для обработки огромного количества сообщений, обеспечивая при этом операции с инструментами, необходимыми для поддержки такой системы. Это очередь задач с акцентом на обработку в реальном времени, а также поддержку планирования задач.

Celery позволяет удовлетворить оба требования. Хотя это может быть немного больше работы, но можно масштабировать и уменьшать как процессор, так и использование оперативной памяти, когда система простаивает или вам нужно потреблять меньше оперативной памяти.

Я укажу несколько ссылок об этом топе c :

Сельдерей - минимизация потребления памяти

https://www.vinta.com.br/blog/2018/dealing-resource-consuming-tasks-celery/

https://medium.com/@alaminopu.me / resolve-rabbitmq- high-cpu-memory-usages-problem-with-celery-d4172ba1c6b3

Также, если вы хотите интегрировать его с apache -kafka check , этот вопрос о переполнении стека

...