Celery使用者未从LocalStack上的SQS队列接收消息

时间:2019-11-13 09:57:40

标签: python pip celery amazon-sqs localstack

我在LocalStack服务器上有一个SQS队列,我想与Celery使用者一起使用来自它的消息。

它似乎表明使用者已正确连接到队列,例如队列sqs-test-queue,但是当我尝试使用aws命令发送消息时,它没有收到任何消息。

我的celeryconfig.py如下:

from kombu import (
    Exchange,
    Queue
)


broker_transport_options = {'region': REGION}
broker_transport = 'sqs'

accept_content = ['application/json']
result_serializer = 'json'
content_encoding = 'utf-8'
task_serializer = 'json'

worker_enable_remote_control = False
worker_send_task_events = False
result_backend = None

task_queues = (
    Queue('sqs-test-queue', exchange=Exchange(''), routing_key='sqs-test-queue'),
)

和我的tasks.py模块如下:

from celery import Celery
from kombu.utils.url import quote


AWS_ACCESS_KEY = quote("AWS_ACCESS_KEY")
AWS_SECRET_KEY = quote("AWS_SECRET_KEY")
LOCALSTACK = "<IP>:<PORT>"

broker_url = "sqs://{access}:{secret}@{host}".format(access=AWS_ACCESS_KEY,
                                                     secret=AWS_SECRET_KEY,
                                                     host=LOCALSTACK)

app = Celery('tasks', broker=broker_url, backend=None)
app.config_from_object('celeryconfig')


@app.task(bind=True, name='tasks.consume', acks_late=True, ignore_result=True)
def consume(self, msg):
    # DO SOMETHING WITH THE RECEIVED MESSAGE
    return True

试图用celery -A tasks worker -l INFO -Q sqs-test-queue执行它,并且一切正常:

...

[tasks]
  . tasks.consume

[... INFO/MainProcess] Connected to sqs://AWS_ACCESS_KEY:**@<IP>:<PORT>// 
[... INFO/MainProcess] celery@local ready

但是当我尝试使用aws sqs send-message --endpoint-url=http://<IP>:<PORT> --queue-url=http://localhost:<PORT>/queue/sqs-test-queue --message-body="Test message"发送消息时,什么也没发生。

我在做什么错?我可能错过了配置中的某些内容吗?

PS::如果我尝试运行命令aws sqs receive-message --endpoint-url=http://<IP>:<PORT> --queue-url=http://localhost:<PORT>/queue/sqs-test-queue,我将收到消息。

注意:

我正在使用Python 3.7.0,而我的pip freeze看起来像这样:

boto3==1.10.16
botocore==1.13.16
celery==4.3.0
kombu==4.6.6
pycurl==7.43.0.3
...

2 个答案:

答案 0 :(得分:1)

我正在经历与你相同的事情。要解决此问题,我做了几件事:

  • 我在本地堆栈中设置了gridApi.getSelectedNodes()HOSTNAME_EXTERNAL env变量
  • 根据需要将HOSTNAME设置为broker_url
  • 请确保芹菜工作者的sqs://{access}:{secret}@{host}:{port}不包括配置项:broker_transport_options,因为这会导致2020年2月7日(check issue here)的本地堆栈错误。

一旦我做了这两件事,它就会开始起作用,希望对您有所帮助。

答案 1 :(得分:0)

Celery不能向任何消息队列系统发布或使用任意消息。为此使用kombu-这也是Celery在幕后使用的方式。