У нас есть настройка, где у нас есть веб-интерфейс, запрограммированный в Django
и бэкэнд, написанный на C++
который анализирует данные для нас.
Интерфейс использует Celery
в комбинации с Redis
для асинхронных задач.
Поскольку в некоторых ситуациях это было бы удобно, мне было интересно сегодня, можно ли Celery
задача изнутри C++
,
Так как есть Redis
клиент доступен для C++
Я вполне уверен, что это возможно, если правильные сообщения отправляются Redis
однако я нигде не смог найти никакой информации по этому вопросу.
Моим следующим шагом будет попытка выкопать необходимую информацию из Celery
исходный код, но прежде чем я это сделаю:
Есть ли у кого-нибудь какая-либо информация на эту тему, которая могла бы помочь мне или начать меня, или есть кто-то, кто делал это раньше?
Любая помощь приветствуется. (Также, если у вас есть причина, почему это не сработает.)
Спасибо.
У меня была похожая необходимость вызвать задачу сельдерея из logstash. По сути, мне пришлось создать сообщение, которое выглядело примерно так:
{
"body": "base_64_encoded_string (see below)",
"content-type": "application/json",
"properties": {
"body_encoding": "base64",
"correlation_id":"f009c9e0-0ca6-42a6-a046-3d0e53e06060",
"reply_to":"e1eb91f0-6780-4c34-b633-7ef9a46baf5e",
"delivery_mode":2,
"delivery_tag": "7788b924-a7fe-4c9a-839e-1c7ca602dbba",
"delivery_info": {
"priority":0,
"routing_key":"default",
"exchange":"default"}
}
}
В этом случае декодированное тело преобразуется в:
{
"args": ["meta_val","doc_value"],
"task":"goldstone.compliance.tasks.process_fim_event",
"id":"23deb69e-49c1-4a61-8639-d4627d0fc591"}
Если у вас есть kwargs в вашей задаче, вы можете добавить kwargs: {"key": "value", ...}
к твоему телу.
Тело над картами запускает задачу под названием process_fim_event
, Определение задачи выглядит так:
@task()
def process_fim_event(meta, doc):
...
Самый простой способ сделать это, о котором я знаю, это использовать цветок, HTTP Celery API. С помощью flower вы можете создать задачу из всего, что может сделать HTTP-запрос. Один пример из Github Readme:
$ curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/tasks.add
Таким образом, идея заключается в том, что ваше приложение на языке c ++ сделает HTTP-запрос к API-интерфейсу цветка, который затем вставит задачу в вашу очередь Redis.