Celery: Понимание узлов и current_app.control.inspect (). Stats () - PullRequest
1 голос
/ 20 апреля 2020

Celery предоставляет прекрасную статистику через интерфейс Inspect. Но это не особенно хорошо задокументировано (пока). Вот что мы имеем:

https://docs.celeryproject.org/en/stable/reference/celery.app.control.html#celery .app.control.Inspect.stats

https://docs.celeryproject.org/en/stable/userguide/workers.html#worker -статистика

Мне нравится то, что я вижу:

stats = current_app.control.inspect().stats()

, но структура немного загадочная. Многое из этого хорошо задокументировано выше, но, очевидно, не , каков верхний уровень этого возвращенного диктата. Это пример того, что я вижу:

{
    <node id>: {
        'total': {
            <task name>: 1
        },
        'pid': 1233,
        'clock': '467',
        'pool': {
            'max-concurrency': 8,
            'processes': [1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242],
            'max-tasks-per-child': 'N/A',
            'put-guarded-by-semaphore': False,
            'timeouts': [0, 0],
            'writes': {
                'total': 1,
                'avg': '100.00%',
                'all': '100.00%',
                'raw': '1',
                'strategy': 'fair',
                'inqueues': {
                    'total': 8,
                    'active': 0
                }
            }
        },
        'broker': {
            'hostname': '127.0.0.1',
            'userid': <user id>,
            'virtual_host': <virtual host name>,
            'port': 5672,
            'insist': False,
            'ssl': False,
            'transport': 'amqp',
            'connect_timeout': 4,
            'transport_options': {},
            'login_method': 'AMQPLAIN',
            'uri_prefix': None,
            'heartbeat': 120.0,
            'failover_strategy': 'round-robin',
            'alternates': []
        },
        'prefetch_count': 32,
        'rusage': {
            'utime': 1.271573,
            'stime': 0.171316,
            'maxrss': 59800,
            'ixrss': 0,
            'idrss': 0,
            'isrss': 0,
            'minflt': 60288,
            'majflt': 0,
            'nswap': 0,
            'inblock': 0,
            'oublock': 0,
            'msgsnd': 0,
            'msgrcv': 0,
            'nsignals': 0,
            'nvcsw': 632,
            'nivcsw': 54
        }
    }
}

В этой структуре я озадачен тем, что есть.

В настоящее время я работаю в режиме отладки, и я запускаю только одного работника с:

$ celery worker -A my_app -l INFO

и я вижу одну такую ​​запись, как указано выше. Если я запускаю второго работника (в другом терминале на той же машине, с той же командой), то до тех пор, пока я вижу только один узел в sats.

Я могу видеть тот же идентификатор узла следующим образом:

$ celery -A Library status
<node id>: OK

1 node online.

Этот идентификатор узла принимает форму 'celery@myhostname'.

Если у меня работает один или два работника, это говорит мне, что у меня есть один узел в сети.

Пример pstree:

$ pstree -lp 7813
gnome-terminal-(7813)─┬─bash(4319)───[celeryd: celer(9896)─┬─[celeryd: celer(9900)
                      │                                    ├─[celeryd: celer(9901)
                      │                                    ├─[celeryd: celer(9902)
                      │                                    ├─[celeryd: celer(9903)
                      │                                    ├─[celeryd: celer(9904)
                      │                                    ├─[celeryd: celer(9905)
                      │                                    ├─[celeryd: celer(9906)
                      │                                    └─[celeryd: celer(9910)
                      ├─bash(4404)───pstree(10229)
                      └─bash(7820)───[celeryd: celer(9995)─┬─[celeryd: celer(9997)
                                                           ├─[celeryd: celer(9998)
                                                           ├─[celeryd: celer(9999)
                                                           ├─[celeryd: celer(10000)
                                                           ├─[celeryd: celer(10001)
                                                           ├─[celeryd: celer(10002)
                                                           ├─[celeryd: celer(10003)
                                                           └─[celeryd: celer(10004)

Где я могу ясно видеть двух рабочих и их процессы пула. Но это один узел (что неудивительно).

Итак, что меня озадачивает:

  1. Что такое узел в точности?
  2. что значит иметь больше чем 1?
  3. Как получить больше, чем 1?
  4. Как я могу получить имена узлов программно (в Python не в командной строке)?

1 Ответ

0 голосов
/ 20 апреля 2020

Что касается дальнейшего чтения и исследований, я думаю, что могу ответить на свой вопрос здесь.

Оказывается, что узлы Celery здесь косвенно задокументированы:

https://docs.celeryproject.org/en/latest/reference/celery.bin.multi.html#celery .bin.multi.MultiTool.MultiParser.Node

Короче Celery использует набор терминов, которые полезно понять при построении системы распределенной работы.

  • Клиент - приложение, которое хочет видеть выполненную работу
  • Работник - Приложение, которое выполняет работу

Термины вокруг тех, которые помогают планировать вещи включают в себя:

  • Брокер - средство, с помощью которого Клиент просит работника выполнить работу.
  • Приложение - экземпляр класса Celery

На этом этапе обратите внимание, что Клиент, Брокер и Работник могут находиться на разных компьютерах, и на самом деле их может быть несколько. Клиенты на разных компьютерах и несколько рабочих на разных машинах, если они используют один и тот же брокер.

Неудивительно, что в типичном приложении для брокера настроен URL-адрес. То есть все приложения, во всех клиентах и ​​рабочих, использующих один и тот же URL-адрес брокера, используют одного и того же брокера.

Клиенты отправляют (производят) сообщения через брокера, запрашивая выполнение задач, рабочие читают (использовать) эти сообщения.

Теперь все эти термины имеют место:

  • Пул выполнения
  • Кластер
  • Узел

Каждый работник может обрабатывать несколько задач одновременно, поддерживая пул выполнения. Этот пул может быть потоками или (по умолчанию) это подпроцессы. Таким образом, работник может использовать несколько процессов пула как детей.

Одним из разочарований (у меня есть) с Celery является то, что вы можете свободно общаться с рабочими, но не с запущенными задачами в пуле выполнения рабочих (по этой причине я создаю новый класс задач для интерактивных задач, но он все еще развивается).

Узел - это просто работник в кластере. Короче узел = рабочий. Кластер - это несколько рабочих, работающих параллельно (с использованием celery multi согласно документу, с которым я познакомился). Кластер - это просто удобный способ запуска, остановки и управления несколькими работниками на одном компьютере.

Может быть много кластеров, выполняющих задачи от одного и того же брокера, и они могут находиться на одном компьютере (хотя один интересно почему) или на разных машинах.

И это то, что представляет собой узел сельдерея ... (в его наиболее полном контексте).

Более важно, что узлы имеют имена, определенные по умолчанию как celery<n>@hostname, где 1, 2, 3, ... и hostname - это имя хоста, на котором он работает. Они могут быть сконфигурированы с использованием -c и --hostname аргументов celery multi и не имеют особого значения, и я не могу найти какой-либо способ их гадания, кроме как проверить ключи current_app.control.inspect().stats(), который обнаруживает одну запись на узел.

Что еще неясно, так это то, надежно ли эти статистические данные возвращают статистику для узлов в кластерах на разных машинах (работающих с использованием одного и того же брокера и серверной части). Короче говоря, как далеко может видеть звонок на current_app.control.inspect().stats().

Если у кого-то есть опыт или мудрость, это остается открытым вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...