注意: 雖然 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 為我們節省了數天的開發時間,並且由於程式碼的可讀性和可維護性,未來還將節省更多時間。