0

0

GAE 任务调度:跨服务执行任务的实现方案

心靈之曲

心靈之曲

发布时间:2025-07-14 15:42:17

|

765人浏览过

|

来源于php中文网

原创

gae 任务调度:跨服务执行任务的实现方案

本文档旨在解决 Google App Engine (GAE) 中任务调度跨服务执行的问题。核心在于如何将一个服务创建的任务,指定由另一个服务来执行。通过分析 dispatch.yaml 文件的路由规则,以及利用 HTTP 调用作为中介,提供两种可行的解决方案,帮助开发者实现灵活的任务调度策略,从而优化应用架构和资源利用。

在 Google App Engine (GAE) 中,使用任务队列可以将耗时或资源密集型任务异步执行,从而提高应用的响应速度和用户体验。默认情况下,任务由创建它的服务执行。然而,在某些场景下,我们可能需要将任务提交到一个服务,但由另一个服务来执行。本文将介绍两种实现这一目标的方法。

方法一:利用 dispatch.yaml 文件进行路由

dispatch.yaml 文件用于定义 GAE 应用的请求路由规则。如果你的 dispatch.yaml 文件仅基于路径进行路由,而没有涉及域名或子域名,那么可以直接在任务的 relative_uri 中指定目标服务的路径,从而将任务路由到目标服务。

示例:

假设你的 dispatch.yaml 文件包含以下路由规则:

dispatch:
  - url: "*/mobile/*"
    service: mobile-frontend

  - url: "*/work/*"
    service: static-backend

这意味着所有以 /mobile/ 开头的请求都将被路由到 mobile-frontend 服务,而所有以 /work/ 开头的请求都将被路由到 static-backend 服务。

现在,如果你想从 static-backend 服务提交一个任务,并让 mobile-frontend 服务来执行,你可以将任务的 relative_uri 设置为 /mobile/mobile_task。这样,任务队列会将任务路由到 mobile-frontend 服务,并执行 /mobile/mobile_task 对应的处理程序。

注意事项:

  • 这种方法的前提是 dispatch.yaml 文件仅基于路径进行路由。如果路由规则包含域名或子域名,则需要使用方法二。
  • 确保目标服务中存在与 relative_uri 对应的处理程序,否则任务将无法执行。

方法二:使用 HTTP 调用作为中介

如果你的 dispatch.yaml 文件路由规则包含域名或子域名,或者你想更明确地指定任务的执行服务,可以使用 HTTP 调用作为中介。

实现步骤:

百家CMS微商城
百家CMS微商城

百家CMS微商城从诞生开始,就坚持着简单实用的原则,基于目前最流行的WEB2.0的架构(php+mysql),拥有成熟、稳定的微电商技术解决方案。基于完整的会员等级制度,完善的微商城购物流程,订单管理、优惠券、搜索、购物车等功能。采用跨平台机制,可同时对接微信公众号平台和支付宝服务窗,兼容微博、手机QQ等平台;丰富的支付方式、支持微信支付、支付宝支付、货到付款、余额支付、网银支付等。并且拥有完整的

下载
  1. 在目标服务中创建一个 HTTP 端点,用于接收任务数据并将其提交到任务队列。
  2. 在源服务中,向目标服务的 HTTP 端点发起 HTTP 请求,并将任务数据作为请求体发送。
  3. 目标服务的 HTTP 端点接收到请求后,将任务提交到任务队列,并指定自身作为任务的执行服务。

示例:

假设你有一个服务部署在 blog.example.com,你想让这个服务来执行从 default 服务提交的任务。

  1. 在 blog.example.com 服务中,创建一个名为 /prep_task_invocation/ 的 HTTP 端点。

  2. 从 default 服务,向 blog.example.com/prep_task_invocation/ 发起一个 HTTP POST 请求,并将任务数据作为请求体发送。

  3. blog.example.com/prep_task_invocation/ 端点接收到请求后,将任务提交到任务队列,并指定 blog.example.com 服务自身作为任务的执行服务。

代码示例 (Python):

  • default 服务 (提交任务):
import requests
import json

task_data = {"message": "Hello from default service!"}
url = "http://blog.example.com/prep_task_invocation/"
headers = {'Content-type': 'application/json'}
response = requests.post(url, data=json.dumps(task_data), headers=headers)

if response.status_code == 200:
    print("Task submission request sent successfully!")
else:
    print(f"Error sending task submission request: {response.status_code}")
  • blog.example.com 服务 (接收任务并提交到队列):
from flask import Flask, request
from google.cloud import tasks_v2
import json

app = Flask(__name__)

@app.route('/prep_task_invocation/', methods=['POST'])
def prep_task_invocation():
    task_data = request.get_json()
    print(f"Received task data: {task_data}")

    # Create a client.
    client = tasks_v2.CloudTasksClient()

    # TODO: Fill in the queue path.
    queue = client.queue_path("[PROJECT_ID]", "[LOCATION_ID]", "[QUEUE_ID]")

    # Construct the request body.
    task = {
            "app_engine_http_request": {  # Specify the type of request.
                "http_method": "POST",
                "relative_uri": "/process_task", # Endpoint to actually process the task
                "body": json.dumps(task_data).encode() # Pass the data
            }
    }

    # Use the client to build and send the task.
    response = client.create_task(request={"parent": queue, "task": task})

    print(f"Created task {response.name}")

    return "Task submitted successfully!", 200

@app.route('/process_task', methods=['POST'])
def process_task():
    task_data = request.get_json()
    print(f"Processing task with data: {task_data}")
    # Your task processing logic here
    return "Task processed successfully!", 200

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080)

注意事项:

  • 确保目标服务的 HTTP 端点能够正确接收和处理任务数据。
  • 在生产环境中,建议对 HTTP 请求进行身份验证和授权,以确保安全性。

总结

本文介绍了两种在 Google App Engine 中实现任务调度跨服务执行的方法:利用 dispatch.yaml 文件进行路由和使用 HTTP 调用作为中介。选择哪种方法取决于你的应用架构和具体需求。使用 dispatch.yaml 文件进行路由更加简洁,但仅适用于简单的路由规则。使用 HTTP 调用作为中介更加灵活,但需要额外的代码来实现 HTTP 请求和任务提交。根据实际情况选择最适合你的解决方案,可以有效地优化你的 GAE 应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

223

2023.12.07

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

420

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2389

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2139

2024.08.16

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

10

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号