当前位置: 首页 > 知识库问答 >
问题:

谷歌应用引擎-添加

裴兴言
2023-03-14

我正在app engine上构建一个web应用程序。在我的例子中,这是建立在django Nonl的基础上的,但关键是它使用的是谷歌的数据存储。

我喜欢这样一个事实,即我不需要处理复制、分片、备份等,但有一件事总是妨碍我,那就是最终的一致性,这似乎妨碍了实现一个通用的Web应用程序模式,我称之为“添加

假设我有一个项目管理应用程序。项目是它的中心模型。现在有一个网页页面,我可以在其中看到所有项目的列表,可以添加一个项目,然后我会反映所有项目的列表,其中应该包括我刚刚添加的项目(假设没有错误)。

所以模式是这样的:

  1. 获取并显示现有项目的列表
  2. 用户添加新项目(使用该页面上的表单)
  3. 已创建新项目
  4. 作为响应,获取并显示现有项目的列表(现在包括新项目)

现在的问题是,由于最终的一致性,当我在添加新项目后立即获得所有项目的列表时,不能保证我会得到那个新项目。现在,如果当另一个请求(例如另一个用户:用户B)在第一个用户(用户A)添加项目后一秒钟请求项目列表时发生这种短暂的不一致,那就没问题了,但当用户A执行操作时,并没有看到他的操作的结果,因此没有得到反馈。

我已经习惯了这样做来解决这个问题:

def create_project(request):
    response_context = {}
    new_project = Project(name=request.POST['name'])
    project.save()
    response_context['projects'] = Project.get_serialized_projects()
    # on GAE, eventual consistency means we are not guaranteed to see the
    # new projects while querying for all projects, therefore we might need 
    # to add it manually...
    if project.serialize() not in response_context['projects']:
        response_context['projects'].append(project.serialize())
    return render('projects.html', response_context)

问题是,这种情况在我的代码中的许多地方都会发生,所以我想我可能遗漏了一些东西,因为这种模式是如此基本的web应用程序模式。

有没有其他处理方法的建议?

共有1个答案

廖令
2023-03-14

是的,这是一个常见的问题。不,没有魔法修复。在客户端,一旦知道提交成功,就可以在本地保存项目(全局或存储),然后在从数据存储查询时合并保存的数据。给它设定一个期限,这样它是暂时的。让它在所有情况下都能工作并不是一件小事(比如说添加了一个项目,然后删除/重命名了它,所以还要更新缓存等)。从服务器端,通常将最近保存的内容缓存在memcache中,并与查询合并。

 类似资料:
  • 是否有人有链接或可以提供Java谷歌应用程序引擎项目的代码,该项目只是与谷歌日历交互。假设从日历中获取活动。 Google Sample calendar-app engine-Sample在从HG检出后无法编译,我曾尝试搜索教程并创建自己的教程,只是运气好而已。 我已经设置了一个 API 访问项目来获取客户端机密.json。

  • 我想知道我是否需要Google java客户端库才能从GAE访问我的Google日历。默认情况下,它们是Google App Engine SDK的一部分吗? 此外,我找不到一个很好的示例或教程来展示如何从Google Cloud Platform应用程序创建、读取、更新和删除Google日历事件。 非常感谢,如果您可以提供相同的代码示例或链接到适当的工作教程。

  • 我是谷歌应用引擎服务的新手。我有一个JavaMaven项目,其中一个模块运行在应用引擎flex上,另一个模块运行在应用引擎标准上。我正在为应用引擎Flex API使用JWT身份验证。我想从应用引擎标准向应用引擎Flex发出发布请求。验证服务的最佳方式应该是什么? 此外,我还有一个cron服务,它可以访问我用于某些后端内容的特定URL。如何验证请求是否仅来自Cron服务?

  • 具体到基于Docker的部署,这两者之间有什么区别?由于Google App Engine Flexible现在也支持基于Dockerfile的部署,而且它也是完全管理的服务,所以它似乎比在Container Engine上配置Kubernetes部署更可取,不是吗? 有哪些用例更倾向于使用Google容器引擎而不是灵活的应用引擎?

  • 我想能够从谷歌云功能中调用谷歌应用程序引擎,有可能吗?找不到任何解决办法

  • 我正在使用google appengine开发go api后端。当我在本地运行项目时,输出显示: 信息2018-07-11 12:31:17502 devappserver2。py:120]正在跳过SDK更新检查<信息2018-07-11 12:31:17576 api_服务器。py:274]正在以下位置启动API服务器:http://localhost:38628 信息2018-07-11 12