這是一個簡單的API server,提供GET /heroes
和GET /heroes/<hero_id>
兩個endpoint,會透過hahow提供的api獲取對應資料,並回傳給client。
git clone {repo_url}
pipenv install
pipenv shell
or
pip install requirements.txt
export FLASK_APP=flaskr
flask run
參考MVC邏輯。
flaskr/
:主要程式碼,包含API routing, error handling, controllers等主程式碼
views/
:api routing邏輯thirdparty/
:第三方API 的utility functiontests/
:相關api測試(目前只有針對api endpoint撰寫,third party尚未實現)error_handler.py
:錯誤Response的wrapperthread.py
:包含class ThreadRequest
,用來執行concurrent requests
這個專案大部分使用python或flask框架提供的library,如 requests , flask-restful、實現retry機制使用的retrying、以及程式碼品質分析(linting)的isort, flake8 和black。
問題:由於第三方API不穩定性,使得api endpoint 頻繁回傳Invalid Response。
解方:針對最不穩定的get_profile_by_id
,加入max_retry=2的機制,成功將錯誤次數降到原本的1/3。
問題:針對Authenticated request,需要回傳額外的profile data。然而由於該資料需要根據每個id一個一個去打第三方API,導致速度太慢。
解方:針對authenticated的/heros
做multithread的優化,成功提升速度兩倍以上。
其他更多詳細內容與測試過程,可參考 這份Google doc
原則上,程式碼應該透過函式命名、標註回傳型態等方式,讓其他人一目瞭然,而避免用過多的註解去敘述功能。
然而若是遇到有些狀況,例如為了handle某些特殊情況而加的if-else
、因應功能需求產生的額外API call、或是特別複雜的邏輯與演算法,就會需要加上comment,敘述這段程式碼做的事情以及原因。