繁体   English   中英

使用来自 Celery 的 SQS 消息

[英]Consume SQS messages from Celery

我的 Python 应用程序中有一个 Celery 实现。 我使用的经纪人是 SQS。 发送到 SQS 的消息来自不同的应用程序,通过 Boto3 的 send_message() api。 现在我的困惑是如何触发 Celery 选择来自 SQS 的消息进行处理。 将有一些任务将在 Celery 中运行,这些任务应该正确处理来自 SQS 的消息。 我的要求类似于Celery Consumer SQS Messages

根据我的理解,芹菜轮询 SQS 直到消息到达那里。 有人可以帮我解决这个问题吗?

我每 20 秒调用一次此任务:

@app.task(name='listen_to_sqs_telemetry')
def listen_to_sqs_telemetry():
    logger.info('start listen_to_telemetry')
    sqs = get_sqs_client()
    queue_url = 'https://sqs.us-east-2.amazonaws.com/xxx'
    logger.info('Using ' + queue_url)

    keep_going = True
    num = 0
    while keep_going:
        keep_going = False
        try:
            response = sqs.receive_message(
                QueueUrl=queue_url,
                AttributeNames=[
                    'SentTimestamp',
                ],
                MaxNumberOfMessages=5,
                MessageAttributeNames=[
                    'All'
                ],
                WaitTimeSeconds=20
            )
            # logger.info(response)
            if 'Messages' in response:
                keep_going = True
                for rec in response['Messages']:
                    # Process message
                    sqs.delete_message(
                        QueueUrl=queue_url,
                        ReceiptHandle=rec['ReceiptHandle']
                    )
                    num = num + 1
            else:
                pass
                # logger.info(response)
        except Exception as e:
            logger.error(str(e))
    logger.info('done with listen_to_sqs_telemetry')
    return "Processed {} message(s)".format(num)

如果我理解您,请尝试将工作程序作为守护程序运行。 使用诸如 supervisord 之类的工具来做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM