Python 芹菜消费者未从LocalStack上的SQS队列接收消息

Python 芹菜消费者未从LocalStack上的SQS队列接收消息,python,pip,celery,amazon-sqs,localstack,Python,Pip,Celery,Amazon Sqs,Localstack,我在LocalStack服务器上有一个SQS队列,我正试图使用芹菜消费者从中获取消息 它表明消费者已正确连接到队列,例如队列sqs测试队列,但当我尝试使用aws命令发送消息时,它未收到任何消息 我的celeryconfig.py如下所示: from kombu import ( Exchange, Queue ) broker_transport_options = {'region': REGION} broker_transport = 'sqs' accept_con

我在LocalStack服务器上有一个SQS队列,我正试图使用芹菜消费者从中获取消息

它表明消费者已正确连接到队列,例如队列
sqs测试队列
,但当我尝试使用
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'),
)
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
boto3==1.10.16
botocore==1.13.16
celery==4.3.0
kombu==4.6.6
pycurl==7.43.0.3
...
我的
tasks.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'),
)
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
boto3==1.10.16
botocore==1.13.16
celery==4.3.0
kombu==4.6.6
pycurl==7.43.0.3
...
但是当我尝试使用
aws sqs send message--endpoint url=http://:--queue url发送消息时=http://localhost:/queue/sqs-测试队列--message body=“test message”
,不会发生任何事情

我做错了什么?我是否在配置中遗漏了一些东西

PS:如果我尝试运行命令
aws sqs receive message--endpoint url=http://:--queue url=http://localhost:/queue/sqs-测试队列
,我能够获取消息

注意:

我使用的是
python3.7.0
,我的
pip-freeze
如下所示:

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'),
)
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
boto3==1.10.16
botocore==1.13.16
celery==4.3.0
kombu==4.6.6
pycurl==7.43.0.3
...

芹菜不能向任何消息队列系统发布或消费任意消息。用kombu来做这件事——这也是芹菜在幕后的用途。

我和你经历了同样的事情。为了解决这个问题,我做了两件事:

  • 我在localstack中设置
    HOSTNAME\u外部
    HOSTNAME
    env变量
  • broker_url
    设置为
    sqs://{access}:{secret}@{host}:{port}
    (如您所用)
  • 确保芹菜工人的
    broker\u transport\u选项
    不包括配置项:
    wait\u time\u seconds
    ,因为这会导致自2020年2月7日起localstack出现错误()

一旦我做了这两件事,它就开始工作了,希望能有所帮助。

您如何使用sqs消息。consume方法中的任何代码都不会被执行。我需要调用另一个任务吗?