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

使用 Python 使不稳定的 API 可靠

简介

Sales Spirit 是多个出版商网站的幕后公司,例如 Prijsvergelijken.nl:荷兰最大的电信比较网站。对于我们的成功而言,重要的是在我们的网站上拥有完整且完美的产品供应。为了实现这一目标,我们与许多商业伙伴密切合作。维护来自商业伙伴的不同且多样的产品供应是一项持续的挑战。

使用合作伙伴 API 自动化维护是我们 Sales Spirit 工作的重要方面。这些 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 为我们节省了数天的开发时间,并且由于代码的可读性和可维护性,未来还将节省更多时间。