google-app-engine - 什么谷歌云组件用于我的客户端-服务器发布/订阅?
问题描述
我正在谷歌云上构建一个应用程序来记录用户的录音。用户将录制 1 个或多个音频剪辑并将它们上传到后端,后端将处理剪辑,运行我构建的机器学习预测模型,并将每个上传的音频的整数返回给用户。处理和预测一段音频大约需要 10 秒。用户一次可以上传 20 个音频。
到目前为止,我所拥有的是:
- 客户端的 HTML、Javascript、css。上传功能是异步的,使用 fetch 并返回一个 Promise
- 后端正在运行 Google AppEngine (python3.7)、Firebase 身份验证、Google CLoud 存储和云日志记录
- 处理和预测在 Google Cloud Function 上运行。
我的问题如下:由于处理完成可能需要 200-300 秒,一旦用户点击上传按钮,我应该如何处理任务?简单的请求响应就足够了吗?
我调查了以下内容:
- 谷歌云任务。这似乎不合适,因为客户端实际上需要知道处理何时完成。任务完成后真的没有回调
- 谷歌云发布订阅。当工作完成(订阅)时会有一个回调,但它是服务器端的。这似乎更适合服务器到服务器的通信,而不是客户端-服务器。
在这种情况下使用什么合适的技术?
解决方案
有办法改善用户体验。
首先,在处理上,可以进行并行处理。所有预测都应由相同的 Cloud Functions 处理。在 App Engine 中,您应该有一个多线程处理,它只为一个音频剪辑调用您的云函数,并并行执行 20 次。我不知道如何在 Python 中使用 async 来实现这一点,但我知道你可以
然后,如果您实现了这一点,您将等待所有音频剪辑处理结束,以向您的用户发送响应。总时间应在 15 - 20 秒之间。
如果您使用 Cloud Run,则可以使用流式传输(或部分 HTTP 响应)。因此,当您从云函数获得响应时,您可以发送部分响应,无论音频剪辑是谁(第三个可以在第一个之前完成)。
推荐阅读
- javascript - 如果用户输入了不可接受的内容,我该如何重置程序?
- primefaces - CDI Flow Scope Bean 不适用于包含/组合 xhtml 标记
- regex - 评估字符串中的 RegEx 模式
- typescript - 对象字面量只能指定已知属性,并且“RatesWhereUniqueInput”类型中不存在“clientId”
- firebase - 方法 'toInt' 不能被无条件调用,因为接收者在 Dart 中可以是 'null'
- python - Amazon SP API:Feeds API 处理报告神秘错误代码和消息
- linux - 升级过程消息和端口号
- r - 在 R 中使用 tidyverse lubridate 过滤日期
- node.js - 不带参数的 Firestore 管理员分页(Node.js)
- excel - 用于将 2 更改为上标的 VBA(当它位于已定义的字符串中时)