gpt4 book ai didi

python - 使用异步事件实现状态引擎的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 04:57:21 25 4
gpt4 key购买 nike

我正在开发一个旅行行程预订引擎。用例是这样的:

  1. 客户预订的旅程涉及多个航段(航段是旅程的连续部分,由同一家公司运营)。例如。从亚特兰大到新德里的旅行可能包含两条腿,亚特兰大 - 纽约,以及纽约 - 新德里。

  2. 每条腿都有自己的保留,可以处于“待定”或“已确认”状态(这实际上只是实际状态的快捷方式)。

  3. 只有在预订合作伙伴(例如航空公司)确认预订后,每个航段预订才可以从“待处理”转换为“已确认”。这些是异步事件,可能需要几秒到几天的时间。

  4. 所有航段预订都捆绑在代表客户预订状态的父预订中。仅当 a) 所有关联航段均“已确认”,以及 b) 客户付款完成后,才允许家长预订从“待定”转换为“已确认”。请注意,实际上“预订确认”和“付款确认”之间是有区别的,但为了简洁起见,我在这里进行了简化。

  5. 所有通信均通过异步服务接口(interface)进行,即可能需要几秒到几天的时间才能确认航段预订或收到付款。

请注意,行程预订子系统与支付子系统是分开的,即预订系统只能通过查询两个子系统来确定父预订状态。两个子系统都接收异步事件,并在某些事件发生时实现对预订系统的回调。

另请注意,该系统应该用于不同的客户,每个客户都可以有自己的一组状态/转换(用于家长预订)。

问题:

  • 管理依赖于外部子系统状态的中央(即父保留)状态的常用方法是什么?

  • 特别是,鉴于子系统确认的异步性质,如何跟踪各种子状态?

  • 是否有现成的组件可以实现这样的分布式 FSM(在 Python 生态系统中)?

我一直在考虑以下方法:

  1. 实现“父预订 FSM”,反复尝试将状态从“待处理”切换到“确认”,每次查询相应的付款和航段预订状态。在这种情况下,FSM 会主动尝试进入下一个状态(或在某个时刻超时)。这将作为一个周期性的 Celery 任务来实现,该任务非常简单地查询子系统,例如每 30-60 秒一次。

  2. 实现一个抽象的 FSM(即工作流),一旦其状态发生变化,该抽象 FSM 就会从每个子系统接收回调。在这种情况下,FSM 会跟踪它收到的所有回调/事件,一旦收到所有腿事件的“付款正常”和“腿正常”,它会将状态切换为“确认”。在这种情况下,FSM 被动地等待事件到达。这将作为父预留对象实现,该对象跟踪其收到的回调,然后设置父预留的状态。

第一种方法似乎不可扩展,而第二种方法的缺点是必须单独跟踪状态。我真正正在寻找的是一个组件,它可以解决这个问题,而无需显式模型编码,允许为父保留FSM设置任意配置。

使用 Python、Celery/RabbitMQ 和 Django 实现。

最佳答案

建议改进第二个选项:

  1. 创建一个名为 PendingBookings 的中间对象/数据库表。其数据包括主要预订的外键和待处理航段的计数。我在这里假设初始预订时待处理航段的数量将不为零。
  2. 每当创建支线时,其 save 方法也会增加 PendingBookings 对象中相应的待处理支线计数。
  3. 每当确认某个赛段时,其保存方法也会减少待处理的赛段计数。
  4. 当待处理航段计数达到 0 时,其保存方法会启动一项事务,将主预订更新为已确认状态并删除 PendingBookings 实例。

这意味着您不必重复轮询,并且还为您提供了一个位置来查找有关已开始但尚未完成的任何预订的信息。然后,您可以降低轮询频率,也许每天一次到 OLAP 多维数据集中进行轮询,以获取有关通过系统进行的预订的信息。

我还认为这里没有重复 - 您将有用的状态信息存储在一个位置,并在不再需要时将其删除。

关于python - 使用异步事件实现状态引擎的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com