从不同的 REST 端点更新数据存储实体

updating datastore entity from different REST endpoints

让我们假设我有一个 Employee 实体,具有以下属性和初始值:

Employee{Name : "Baqir", employeeID: "1234", requestID: "123456" , status : "INITIATED"}

请注意,我无法使用实体键查询来获得高度一致的结果,因为在这种情况下我们没有实体键。

从 App Engine 后端,我们集成了 firebase 以向员工发送通知。当通知到达员工的 android phone 时,我们的 android 应用程序使用 android 后台服务将状态从 INITIATED 更新为 DELIVERED。当员工点击通知时,我们的 android 应用会打开 android 摄像头并捕捉员工的正面,并使用 REST 端点 2 将压缩图像发送到服务器。还有另一个端点 3 使用 android 后台服务保存相同捕获的面部图像的高质量。

REST 端点 1:

1- 使用 filter(employeeID) 和 filter(requestID) 加载实体 2- 将状态更新为已交付 3-保存实体 4- 将成功结果发送给 android 客户端。

来自端点 1 的更新实体应如下所示:

Employee{Name : "Baqir", employeeID: "1234", requestID: "123456" , status : "DELIVERED"}

REST 端点 2: 1- 使用 filter(employeeID) 和 filter(requestID) 加载实体 2- 将捕获的面部存储到云存储并保存下载 URL。 3-将状态更新为 "COMPLETED" 4-保存实体 5- 将成功结果发送给 android 客户端

来自端点 2 的更新实体应如下所示:

Employee{Name : "Baqir", employeeID: "1234", profilePic: " cloud storage download URL",requestID: "123456" , status : "COMPLETED"}

REST 端点 3: 1- 使用 filter(employeeID) 和 filter(requestID) 加载实体 2- 将捕获的人脸高质量图像存储到云存储并保存下载URL。 4-保存实体 5- 将成功结果发送给 android 客户端

来自端点 3 的更新实体应如下所示:

Employee{Name : "Baqir", employeeID: "1234", profilePic: " cloud storage download URL",  HQprofilePic: " cloud storage download URL", requestID: "123456" , status : "COMPLETED"}

问题: Android 客户端始终先执行 endpoint1,然后执行 endpoint2,然后执行 endpoint3,并从所有端点接收成功结果。 但有时数据存储中最终更新的实体是由 endpoint1 更新的实体。

执行端点 1、2、3 后,数据存储中的最终实体为:

 Employee{Name : "Baqir", employeeID: "1234", requestID: "123456" , status : "DELIVERED"} 

在某些情况下,最终实体是端点 1 和端点 3 的结果。即

Employee{Name : "Baqir", employeeID: "1234", requestID: "123456" , HQprofilePic: " cloud storage download URL", status : "DELIVERED"} 

您可以在所有端点中将 load the entity using filter(employeeID) and filter(requestID)(最终一致)替换为:

  1. 使用 filter(employeeID) 和 filter(requestID)
  2. 通过 keys_only query 获取实体键
  3. 通过键查找加载实体(始终一致)

您只需要注意初始创建具有相应 employeeID 和 requestID 的实体与它在步骤 1 中变得可见(即更新该查询的索引时)之间的延迟 - 直到发生这种情况您将无法获得实体密钥。