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