Flutter Firebase 延时函数
Flutter Firebase delay function
我正在使用 Flutter 和 Firebase Firestore 创建一个活动预订应用程序。有时如果活动很受欢迎,用户可能会因为有人速度更快而买票而没有座位,因此我想在购买前 5 分钟创建预订,如果用户没有在该时间范围内未购买的机票预订将被自动删除。有人可以给我一个建议吗?
在不了解您的数据结构和业务需求的情况下很难给出答案,所以这里有一种方法可以在很少假设的情况下做到这一点:
- 假设每个座位都有一个文档,我们调用
SeatDocument
。
SeatDocument
有一个名为 status 的字段,可以设置为 available
、blocked
或 sold
.
- 只要有用户在会话中购票,其他人就无法购买该座位的同一张票。
在这种情况下,每当用户进入会话预订机票时,您应该使用交易来:
- 检索
SeatDocument
。
- 确保其状态为
available
。
- 标记为
blocked
.
在这里使用交易可以防止两个用户为同一张票进入一个会话,并允许您在确保数据正确的同时进行多项操作。
如果用户最终买票,可以标记为sold
。如果五分钟过去了,您可以从客户端结束用户会话并将票证标记为 available
.
您必须根据业务需求确定流程,但这是如何实施的粗略想法。
如果您不熟悉交易,这里有一个有用的参考资料和解释它的视频:
https://firebase.google.com/docs/firestore/manage-data/transactions
=====根据评论更新===
您可以创建一个只要工单状态发生变化就会触发的云函数。在触发器函数中,您将获得 SeatDocument
,您可以在其中检查状态是否更改为 blocked
。如果是这样,那么您可以创建一个 Scheduled function
,它将在 5 分钟后 运行 并检查状态是否已更改为 sold
。如果不是,那么您可以将工单状态更新回 available
。
简而言之,您可以使用 Cloud Functions 中的 Triggers
和 Schedule Functions
做很多事情。您还可以查看 callableFunctions
,您可以使用它来启动会话并从 Cloud Functions 的服务器端售票。
老实说,我怀疑云函数在这种情况下是否会削减它。理想情况下,您将在后端服务器上处理此类事情(例如,在 Google Cloud 运行 中)。设备上的应用程序仅作为客户端,后端处理票证逻辑,与 Firestore 通信等。这比基于 5 分钟醒来或任何事情做出假设更安全。
假设您的用户启动了应用程序,应用程序可以在后端初始化,这将提取特定用户的数据(也是一个好主意,可以存储预订票的所有数据,一些历史记录等,只能由后端服务器访问).
此外,如果您打算在您的应用中进行销售,则必须有一个后端通过 Google API 检查购买情况。
至于一般逻辑:
- App(客户端)向后台发送用户要购票的请求
- 后端检查剩余票数。
- 后端从总数中删除一张票,直到完成所有“文书工作”(处理细节、付款等)。
- 如果一切正常 - 用户得到确认,后端会对数据库 (Firestore) 进行必要的工作
如果出现问题 - 例如付款没有通过(这种情况经常发生) - 用户会收到一条消息,后端会将票证添加回池中。
你想要什么样的数据结构取决于你。也许你卖的是没有“座位”的地方的票,也许你卖的是带号码的歌剧票,那么你可能需要一种方法让用户看到座位的位置,这意味着你需要向他们展示他们在你时展示的东西在剧院选一个座位.. 谁知道呢?我只是说一些基本的事情。这样的应用程序可能非常复杂。
还有一件事:关于如果用户失去连接或在任何其他会阻止正确购买票证的情况下会发生什么:它因您为后端服务器选择的语言而异,但一般来说您会需要(在服务器代码中)实现操作结束的合理超时,然后 return 池票。
例如,在我使用 Firsetore 和 Python 后端制作的真实应用程序中,我有一个机制可以检查用户是否在过去 24 小时内登录 - 其他一些东西需要它。我将上次登录时间存储在 Firestore 中的用户文档中(通过 firestore.SERVER_TIMESTAMP
),并通过将其与当前时间(在后端)进行比较来检查时间间隔,当然我确保没有时区问题等所以Firestore 时间与我的后端匹配。这样做是为了避免任何类型的客户端数据操作,你知道,有些用户喜欢尝试一些东西..
我正在使用 Flutter 和 Firebase Firestore 创建一个活动预订应用程序。有时如果活动很受欢迎,用户可能会因为有人速度更快而买票而没有座位,因此我想在购买前 5 分钟创建预订,如果用户没有在该时间范围内未购买的机票预订将被自动删除。有人可以给我一个建议吗?
在不了解您的数据结构和业务需求的情况下很难给出答案,所以这里有一种方法可以在很少假设的情况下做到这一点:
- 假设每个座位都有一个文档,我们调用
SeatDocument
。 SeatDocument
有一个名为 status 的字段,可以设置为available
、blocked
或sold
.- 只要有用户在会话中购票,其他人就无法购买该座位的同一张票。
在这种情况下,每当用户进入会话预订机票时,您应该使用交易来:
- 检索
SeatDocument
。 - 确保其状态为
available
。 - 标记为
blocked
.
在这里使用交易可以防止两个用户为同一张票进入一个会话,并允许您在确保数据正确的同时进行多项操作。
如果用户最终买票,可以标记为sold
。如果五分钟过去了,您可以从客户端结束用户会话并将票证标记为 available
.
您必须根据业务需求确定流程,但这是如何实施的粗略想法。
如果您不熟悉交易,这里有一个有用的参考资料和解释它的视频: https://firebase.google.com/docs/firestore/manage-data/transactions
=====根据评论更新===
您可以创建一个只要工单状态发生变化就会触发的云函数。在触发器函数中,您将获得 SeatDocument
,您可以在其中检查状态是否更改为 blocked
。如果是这样,那么您可以创建一个 Scheduled function
,它将在 5 分钟后 运行 并检查状态是否已更改为 sold
。如果不是,那么您可以将工单状态更新回 available
。
简而言之,您可以使用 Cloud Functions 中的 Triggers
和 Schedule Functions
做很多事情。您还可以查看 callableFunctions
,您可以使用它来启动会话并从 Cloud Functions 的服务器端售票。
老实说,我怀疑云函数在这种情况下是否会削减它。理想情况下,您将在后端服务器上处理此类事情(例如,在 Google Cloud 运行 中)。设备上的应用程序仅作为客户端,后端处理票证逻辑,与 Firestore 通信等。这比基于 5 分钟醒来或任何事情做出假设更安全。
假设您的用户启动了应用程序,应用程序可以在后端初始化,这将提取特定用户的数据(也是一个好主意,可以存储预订票的所有数据,一些历史记录等,只能由后端服务器访问).
此外,如果您打算在您的应用中进行销售,则必须有一个后端通过 Google API 检查购买情况。
至于一般逻辑:
- App(客户端)向后台发送用户要购票的请求
- 后端检查剩余票数。
- 后端从总数中删除一张票,直到完成所有“文书工作”(处理细节、付款等)。
- 如果一切正常 - 用户得到确认,后端会对数据库 (Firestore) 进行必要的工作
如果出现问题 - 例如付款没有通过(这种情况经常发生) - 用户会收到一条消息,后端会将票证添加回池中。
你想要什么样的数据结构取决于你。也许你卖的是没有“座位”的地方的票,也许你卖的是带号码的歌剧票,那么你可能需要一种方法让用户看到座位的位置,这意味着你需要向他们展示他们在你时展示的东西在剧院选一个座位.. 谁知道呢?我只是说一些基本的事情。这样的应用程序可能非常复杂。
还有一件事:关于如果用户失去连接或在任何其他会阻止正确购买票证的情况下会发生什么:它因您为后端服务器选择的语言而异,但一般来说您会需要(在服务器代码中)实现操作结束的合理超时,然后 return 池票。
例如,在我使用 Firsetore 和 Python 后端制作的真实应用程序中,我有一个机制可以检查用户是否在过去 24 小时内登录 - 其他一些东西需要它。我将上次登录时间存储在 Firestore 中的用户文档中(通过 firestore.SERVER_TIMESTAMP
),并通过将其与当前时间(在后端)进行比较来检查时间间隔,当然我确保没有时区问题等所以Firestore 时间与我的后端匹配。这样做是为了避免任何类型的客户端数据操作,你知道,有些用户喜欢尝试一些东西..