我有一个运行Web服务器环境和工作层环境的Elastic Beanstalk应用程序。我的目标是将一些参数传递给Web服务器中的端点,该端点向工作者提交请求,然后该请求将关闭并进行长时间计算并将结果写入S3存储桶。现在我忽略了“长计算”部分,只是编写了一个模拟工作流程的小型hello world应用程序。这是我的Flask应用程序:
from flask import Flask, request
import boto3
import json
application = Flask(__name__)
@application.route("/web")
def test():
data = json.dumps({"file": request.args["file"], "message": request.args["message"]})
boto3.client("sqs").send_message(
QueueUrl = "really_really_long_url_for_the_workers_sqs_queue",
MessageBody = data)
return data
@application.route("/worker", methods = ["POST"])
def worker():
data = request.get_json()
boto3.resource("s3").Bucket("myBucket").put_object(Key = data["file"], Body = data["message"])
return data["message"]
if __name__ == "__main__":
application.run(debug = True)
(请注意,我将工作人员的HTTP路径从默认的/
更改为/worker
。)我将此应用程序部署到Web服务器和工作者,它完全符合我的预期。当然,我必须进行通常的IAMS配置。
我不喜欢这样的事实是我必须将我的工作人员的SQS URL硬编码到我的Web服务器代码中。这使得更改工人轮询的队列变得更加复杂,并且添加额外的工作人员变得更加复杂,这两者在生产中都很方便。我想要一些代码,说“将此消息发送给X当前正在轮询的任何队列”。这显然不是什么大不了的事,但我想我会看到是否有人知道如何做到这一点。
答案 0 :(得分:0)
鉴于队列URL的性质,您可能希望尝试将它们保存在某些外部存储(可能是内存数据库或键值存储)中,这些存储将URL与当前使用它们的工作者的ID相关联。这样您就可以根据需要更新它们,而无需修改您的应用程序。 (缺点是您需要维护一些额外的数据源,并且您需要为服务器和工作人员编写接口代码。)