Flutter Firebase 延迟功能

问题描述

我正在使用 Flutter 和 Firebase Firestore 创建一个活动预订应用。有时,如果活动很受欢迎,那么用户可能会因为有人速度更快而买票而没有座位,因此我想在购买前创建一个预订,该预订适用 5 分钟,如果用户没有“在该时间范围内购买机票预订将被自动删除。有人可以就如何做到这一点给我建议吗?

解决方法

在不了解您的数据结构和业务需求的情况下很难给出答案,因此这里有一种几乎没有假设的方法:

  • 假设您为每个座位准备了一份文档,我们将其命名为 SeatDocument
  • SeatDocument 有一个名为 status 的字段,可以设置为 availableblockedsold
  • 每当用户在会话中购买门票时,其他人都无法为该座位购买相同的门票。

在这种情况下,每当用户进入会话预订机票时,您应该使用事务来:

  • 检索 SeatDocument
  • 确保其状态为 available
  • 将其标记为 blocked

此处使用事务可防止两个用户为同一张票进入会话,并允许您执行多项操作,同时确保您拥有正确的数据。

如果用户最终购买了票,您可以将其标记为 sold。如果 5 分钟过去了,您可以从客户端结束用户会话并将票证标记为 available

您必须根据业务需求确定流程,但这是如何实施的粗略想法。

如果您不熟悉交易,这里有一个有用的参考资料和一个解释它的视频: https://firebase.google.com/docs/firestore/manage-data/transactions

===== 根据评论更新 ===

您可以创建一个在工单状态发生变化时触发的云函数。在触发器函数中,您将获得 SeatDocument,您可以在其中检查状态是否更改为 blocked。如果是这样,那么您可以创建一个将在 5 分钟后运行的 Scheduled function,并检查状态是否已更改为 sold。如果不是,那么您可以将票证状态更新回 available

简而言之,您可以使用 Cloud Functions 中的 TriggersSchedule Functions 做很多事情。您还可以查看 callableFunctions,您可以使用它来启动会话并从 Cloud Functions 的服务器端销售票证。

,

老实说,我怀疑云函数在这种情况下会削减它。理想情况下,您将在后端服务器上处理此类事情(例如在 Google Cloud Run 中)。设备上的应用程序仅作为客户端,后端处理票证逻辑,与 Firestore 通信等。这比基于 5 分钟唤醒或任何事情做出假设更安全。

假设您的用户启动了应用程序,应用程序可以在后端初始化,这将为特定用户提取数据(存储预订门票的所有数据、一些历史记录等只能由后端服务器访问的数据也是一个好主意)。

另外,如果您打算在您的应用中进行销售,那么必须有一个后端来通过 Google API 检查购买情况。

至于一般逻辑:

  1. 应用(客户端)向后端发送用户想要购票的请求。
  2. 后端检查剩余的票数。
  3. 后端从总数中删除一张票,直到完成所有“文书工作”(处理细节、付款等)。
  4. 如果一切正常 - 用户得到确认,后端会对数据库 (Firestore) 进行必要的工作

如果出现问题 - 例如付款没有通过(这种情况经常发生) - 用户收到一条消息,后端将票添加回池中。

你想要什么类型的数据结构取决于你。也许你卖没有“座位”的地方的门票,也许你卖带数字的歌剧票,那么你可能需要一种方法让用户看到座位的位置,这意味着你需要向他们展示他们展示的东西在剧院选一个座位..谁知道?我只是说一些基本的事情。此类应用可能非常复杂。

还有一件事:关于如果用户失去连接或在任何其他会阻止正确购买门票的事件中会发生什么:这取决于您为后端服务器选择的语言,但一般来说,您需要实现(在服务器代码中)操作结束的合理超时,然后将票返回到池中。

例如,在我使用 Firsetore 和 Python 后端制作的真实应用程序中,我有一个机制来检查用户是否在过去 24 小时内登录 - 其他一些事情需要它。我将上次登录时间存储在 Firestore 中用户文档中(通过 firestore.SERVER_TIMESTAMP),并通过将其与当前时间(在后端)进行比较来检查时间间隔,当然我确保没有时区问题等Firestore 时间与我的后端匹配。这样做是为了避免任何类型的客户端数据操作,您知道,有些用户喜欢尝试..