注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

使用 Python 使不稳定的 API 变得可靠

引言

Sales Spirit 是多家出版商网站背后的公司,例如 Prijsvergelijken.nl:荷兰最大的电信比较网站。我们成功的关键在于网站上提供完整无瑕的产品。为了实现这一目标,我们与许多业务合作伙伴密切合作。维护业务合作伙伴不同且多样的产品供应是一项持续的挑战。

在 Sales Spirit,使用合作伙伴 API 自动化维护是我们工作的重要方面。这些 API 在可靠性、性能、协议和语言、完整性等方面差异很大。与此同时,我们希望为客户提供可靠、性能良好且完整的网站。直到我们将 Python 整合到我们的工作流程中,我们才完全应对了这一挑战。Python 帮助我们构建了一个 API 平台,该平台不仅提供高质量的输出,而且非常易读且易于维护。

使用 Python 构建 API 平台

我们在 Sales Spirit 开发了一个定制的 API 平台,以处理业务合作伙伴提供的 API。该平台有许多用例,其中一个用例是我们的邮政编码检查。客户可以在我们的宽带比较页面输入他们的邮政编码和门牌号,以检查其家庭住址的宽带可用性。在底层,我们使用多个宽带提供商的 API 检查宽带的可用性。在这个特定的用例中,性能和可靠性非常重要,因为我们正在处理实时服务。API 本身并不总是提供这一点。

我们通过将 API 平台组织成主-工作者配置来确保性能和可靠性。工作者并发运行,每个工作者处理一个 API 调用。工作者也是沙盒化的,这样即使工作者发生任何问题,API 平台也能保持稳定。沙盒化工作者的另一个优点是它们可以轻松地被杀死。因此,我们可以为工作者设置时间限制,这有助于确保我们的平台能够在一定时间内交付。主-工作者配置是使用 Python 线程实现的。与其他线程解决方案不同,Python 线程非常易于使用。由于全局解释器锁 (GIL),Python 中的大多数操作都保证了原子性。这在确保工作者的线程安全方面为我们节省了大量时间。另外,创建 Python 线程的基础设施组织良好且有文档记录,并已集成到 Python 的标准库中。为了完成我们的 API 平台,我们必须提出一个解决方案,使处理和收集 API 结果变得容易。对于处理部分,我们最终编写了一个库,其中包含一组数据处理工具。大多数工具本质上是流行 Python 库的抽象版本,完全根据我们的需求量身定制。例如,我们从 API 结果生成 SQL 查询的工具完全基于 SQLAlchemy。在编写强大且易于使用的抽象(针对原本复杂的操作)时,Python 表现出色。

我们设计了一个特殊的线程安全输出类来收集 API 结果。该类作为对象传递给每个工作者。工作者可以将结果写入对象,而无需担心所有数据最终如何汇集在一起。我们使用 Python 列表和字典作为开发输出类的基本构建块。因此,使输出类线程安全的大部分繁重工作都来自 Python 内部。

写入输出类的结果与主线程共享。主线程的工作是将各个结果汇集在一起并生成最终输出。主线程从配置文件中获取指令。配置文件可能包含简单的指令,例如将所有结果输出为列表。也可以为失败的 API 请求设置重复指令。使用这些指令可以提高输出质量,但会影响性能。对于邮政编码检查等实时服务,这可能不是提高输出质量和完整性的最佳方法。相反,我们使用成功的工作者输出来填补空白。通过我们的 API 平台,这种高级后处理技术只需在配置文件中几行代码即可完成。

结论

Sales Spirit 成功的关键在于网站上提供完整无瑕的产品。页面通常使用合作伙伴 API 自动填充数据。使用这些 API 确保网站质量是一项真正的挑战。

我们使用 Python 开发了一个定制的 API 平台,该平台处理业务合作伙伴提供的 API。API 平台确保了我们产品的质量,是我们成功的一部分。Python 帮助我们构建了一个 API 平台,该平台不仅提供高质量的输出,而且非常易读且易于维护。Python 为我们节省了数天的开发时间,并且由于代码的可读性和可维护性,未来将为我们节省更多时间。