服務開發需考慮的事項

開發一個服務不是簡單的將服務功能實現,程序能跑這麼簡單,還需要考慮到各個方面,這裏大致總結了幾點,整理如下:

  1. 邏輯正確,首先要保證程序的運行結果符合預期;
  2. 方便修改,比如有些參數可能會修改,(1)這些就可以放到配置信息裏,運行時,只需要改下配置,重啓或者熱修改,新的參數/配置就可以生效了;(2)還可以通過發送信號,與服務交互,服務代碼中包含信號處理的邏輯,不同的信號,代表不同的信息;
  3. 性能問題,現在的實現能否符合性能要求,比如QPS,連接數,響應時間,延遲,吞吐量;
  4. 服務降級,遇到請求量激增,比如零點秒殺類似的情況,爲了增加性能,一種情況是服務本身的某些邏輯停止運行,另一種情況是調用其他服務的接口停止調用,這些情況都需要留有開關,在需要降級時,將開關關閉,以求縮短請求處理時間,提高服務性能;
  5. 資源使用,正常情況下,對CPU,內存,網絡帶寬,磁盤,打開文件數,等等的使用情況,隨着服務壓力的增加,要對資源使用情況進行評估,資源是否可以滿足需要;
  6. 重啓/停止,能否做到不影響正常服務的情況下重啓,比如像Redis做到的,在服務停止時,需要考慮到內存中的數據要會丟失,如果不想丟失,採用的措施比如可以通過攔截停止的信號,等內存中的數據全部處理完畢後,再安全退出;
  7. 狀態監控,時刻了解服務運行狀態,比如當前的QPS,處理單個請求平均時長,消費kafka到哪個點了有沒有積壓等,業務不同, 具體指標也不同,要麼記錄在日誌文件裏,或者通過圖表界面展示出來;
  8. 異常告警,可以跟第7點歸到一起,在各種運行狀態的基礎上,設定閾值,當超過閾值時,通過郵件、短信、微信、電話等方式告警;
  9. 上線部署,服務要做到方便部署,集羣化管理,配置信息放哪裏,使用配置文件還是配置文件搭配zookeeper,啓動/停止腳本等;
  10. 擴容/縮容,能否做到只通過增加機器或者一臺通過增加進程/線程,就可以做到平行擴容,性能提升,這也要求在設計時,就要考慮到多進程/多線程的問題,進程間的通信是通過共享內存、管道等還是通過TCP Socket;
  11. 追補數據,如果出現異常終止,比如core dump,處理不及時,需要有補救的方案,減少損失;
  12. 服務外資源和服務,一個應用很難不跟自身以外的服務或資源打交道,比如需要使用緩存(Redis/memcached等),需要調用其他服務的接口獲取某些數據,這也就需要考慮到這些資源或者服務的可用性以及性能,之間通信的網絡開銷和延遲,對其他的資源或者服務的可用性和性能也要監控,比如返回值中無效結果量,如果某個時間點突然增加,就要聯繫他們,查找原因;如果請求回覆之間的時間間隔突然增加,正常是1ms,增加到了10ms,就要查下是對方的服務出問題了,還是網絡負載太高引起的;
  13. 日誌定位,服務中的日誌輸出要有明確的格式,並且在關鍵路徑處,比如調用接口、請求別人的服務等,都需要有日誌輸出;


服務端程序考慮的遠不止這些,這裏只是列出了幾條最常見的需要考慮的條目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章