1. 程式人生 > >Python後端架構演進

Python後端架構演進

來騰訊之前在前公司做了3年的後端開發, 經歷一款SaaS產品從0到10(還沒有到100, 哈哈哈)的過程, 3年間後端的架構逐步演變, 在微服務的實踐過程中遇到的問題也越來越多, 在這裡總結下.

產品是一款服務於人力資源的SaaS線上服務, 面向HR有Web Android/iOS 小程式多個客戶端, 後端採用RESTful風格API來提供服務. 主要使用Python語言, 方便快速迭代.

架構的演進經歷了4個大的階段: 1. MVC 2. 服務拆分 3. 微服務架構 4. 領域驅動設計.

1. MVC

專案剛開始的時候, 後端同事不超過5個, 這個階段主要的工作是實現產品的原型, 沒有太多的考慮架構, 使用Django來快速實現功能, DB的表結構設計好之後, 抽象出功能View, 由於產品設計也很不完善, 後端需要很多的預留設計, 避免產品邏輯的變更帶來整個表結構的變動, 在這個階段程式碼上最重要的是確定適合團隊的程式碼規範, 程式碼檢查規則.

這裡寫圖片描述

整體上架構如上圖, Nginx負責負載均衡, 分發流量到多個Django服務, Django處理邏輯, 需要非同步任務就交給Celery, 然後資料量比較大的地方使用Redis做快取. 同時還有實時訊息通知的需要使用了Nginx Push Module.

問題與優化方式:

Django併發效能差 使用uWSGI Master+Worker 配合 gevent 攜程支援高併發
Redis連線數過多 使用redis-py自帶的連線池來實現連線複用
MySQL連線數過多 使用djorm-ext-pool連線池複用連線
Celery配置gevent支援併發任務
隨著開發的功能越來越多, Django下的app也越來越多, 這就帶了釋出上的不方便, 每次釋出版本都需要重啟所有的Django服務, 如果釋出遇到問題, 只能加班解決了. 而且單個Django工程下的程式碼量也越來越多, 不好維護.

2. 服務拆分

隨著後端團隊的壯大, 分給每個同事的需求也越來越細, 如果繼續在一個工程裡面開發所有的程式碼, 維護起來的代價太高, 而我們的上一個架構中在Django裡面已經按模組劃分了一個個app, app內高類聚, app之間低耦合, 這就為服務的拆分帶來了便利. 拆分的過程沒有遇到太大的問題, 初期的拆分只是程式碼的分離, 把公用的程式碼抽離出來實現一個公用的Python庫, 資料庫, Redis還是共用, 隨著負載的增加, 資料庫也做了多例項.

這裡寫圖片描述

如上圖, 服務之間儘量避免相互呼叫, 需要互動的地方採用http請求的方式, 內網的呼叫使用hosts指向內網地址.

問題與優化方式:

Nginx Push Module由於長時間沒有維護, 長連線最大數量不夠, 使用Tornado + ZeroMQ實現了tormq服務來支撐訊息通知
服務之間的呼叫採用http的方式, 並且要求有依賴的服務主機配置hosts指向被呼叫的地址, 這樣帶來的維護上的不方便. 以及在呼叫鏈的過程中沒有重試, 錯誤處理, 限流等等的策略, 導致服務可用性差. 隨著業務拆分, 繼續使用Nginx維護配置非常麻煩, 經常因為修改Nginx的配置引發呼叫錯誤. 每一個服務都有一個完整的認證過程, 認證又依賴於使用者中心的資料庫, 修改認證時需要重新發布多個服務.

3. 微服務架構

首先是在接入層引入了基於OpenResty的Kong API Gateway, 定製實現了認證, 限流等外掛. 在接入層承接並剝離了應用層公共的認證, 限流等功能. 在釋出新的服務時, 釋出指令碼中呼叫Kong admin api註冊服務地址到Kong, 並載入api需要使用外掛.
這裡寫圖片描述
為了解決相互呼叫的問題, 維護了一個基於gevent+msgpack的RPC服務框架doge, 藉助於etcd做服務治理, 並在rpc客戶端實現了限流, 高可用, 負載均衡這些功能.

在這個階段最難的技術選型, 開源的API閘道器大多用Golang與OpenResty(lua)實現, 為了應對我們業務的需要還要做定製. 前期花了1個月時間學習OpenResty與Golang, 並使用OpenResty實現了一個短網址服務shorturl用在業務中. 最終選擇Kong是基於Lua釋出的便利性, Kong的開箱即用以及外掛開發比較容易. 效能的考量倒不是最重要的, 為了支撐更多的併發, 還使用了雲平臺提供的LB服務分發流量到2臺Kong伺服器組成的叢集. 叢集之間自動同步配置.

餓了麼維護一個純Python實現的thrift協議框架thriftpy, 並提供很多配套的工具, 如果團隊足夠大, 這一套RPC方案其實是合適的, 但是我們的團隊人手不足, 水平參差不齊, 很難推廣這一整套學習成本高昂的方案. 最終我們開發了類Duboo的RPC框架doge, 程式碼主要參考了weibo開源的motan.

4. 領域驅動設計

在這一架構中我們嘗試從應用服務中抽離出資料服務層, 每一個數據服務包含一個或多個界限上下文, 界限上下文類只有一個聚合根來暴露出RPC呼叫的方法. 資料服務不依賴於應用服務, 應用服務可以依賴多個數據服務. 有了資料服務層, 應用就解耦了相互之間的依賴, 高層服務只依賴於底層服務.
這裡寫圖片描述
在我離職時領域驅動設計還在學習設計階段, 還沒有落地, 但是我相信前公司的後端架構一定會往這個方向繼續演進.

總結
架構的設計, 技術的選型, 不能完全按照流行的技術走, 最終還是服務於產品, 服務於客戶的需求. 設計過程中由於團隊, 人員的結構問題, 有很多的妥協之處, 如何在妥協中找到最優解才是最大的挑戰.

Service Mesh這種新一代的微服務架構正在成為主流, 雖然現在的工作與微服務無關了, 但是也還會繼續關注學習.

相關推薦

Python架構演進

來騰訊之前在前公司做了3年的後端開發, 經歷一款SaaS產品從0到10(還沒有到100, 哈哈哈)的過程, 3年間後端的架構逐步演變, 在微服務的實踐過程中遇到的問題也越來越多, 在這裡總結下. 產品是一款服務於人力資源的SaaS線上服務, 面向HR有Web

架構高可用可伸縮

申請 基本 註意 主從 例子 技術 replicas 分布 最簡 入口層高可用 業務層高可用 緩存層高可用 數據庫高可用 入口層可伸縮 業務層可伸縮 緩存層可伸縮 數據庫可伸縮 下面來分層介紹實踐方法。 入口層高可用 nigix兩個 keeplive保活 心跳做好。

記2017年年底,幾次Python面試

可惜了 項目 創業公司 由於 接口 現場 記得 搜狗 字符 前記:16年本科畢業,選了大公司的QA,工作一段時間後發現更喜歡做開發,遂走上了轉崗之路,在一家小公司的做了半年開發之後,由於公司原因,遂開始了艱難的投簡歷面試之路。臨近年底,工作機會不是很多,下面記錄了部分面試

架構師網址收藏(強烈推薦)

收藏 .com ref hub 編寫 開源 技術棧 awesome get 1 《後端架構師技術圖譜》 -----阿裏巴巴 2 從部落到帝國 - 後端技術棧的演進及開源實踐 ----正在編寫書籍 後端架構師網址收藏(強烈推薦)

python將svc檔案資料讀入資料庫具體實現

如何用python將svc檔案的資料讀入到MySQL資料庫裡,在此直接上程式碼了,感興趣的朋友可以貼程式碼測試: import pandas as pd import os from sqlalchemy import create_engine # 初始化資料庫連線,使用pymysql模組

python從資料庫請求資料給到前端的具體實現

先來貼一竄程式碼讓大家理解前端/後端/資料庫的工作原理, 首先簡要說明:前端向後端請求資料,後端根據前端請求資料的類別分析其需求,並連線到資料庫獲取相應資料: 來一段簡單的例項程式碼模擬淘寶商城: 前端程式碼: <!DOCTYPE html> <html> &

挖財架構簡介

挖財後端技術用的主要是比較大眾的東西,Web容器用Tomcat,框架主要是Spring MVC,也有少量的Play,中間服務層是Dubbo,微容器用Spring Boot,服務註冊這一塊是用ZooKeeper,核心業務開發方式還是圍繞著Spring和Mybatis等;資料的儲存這塊是MySQL和Hb

不使用框架下 python向前端返回html頁面(學習筆記1)

不使用框架下 python後端向前端返回html頁面(學習筆記1) python新手學習web伺服器原理的一些坑 本人正在嘗試開發一個倉庫管理系統的專案,為了能夠更深刻地理解後臺伺服器的開發原理,選擇儘量少地使用python現成框架,因此就無法避免各種不期而遇的大坑。現在跟大家一一分

年終回顧,為你彙總一份「架構技術清單」

2018年馬上就要過去了說說我這一年的感想吧 很多人做Java開發3,4年後,都會感覺自己遇到瓶頸。什麼都會又什麼都不會,如何改變困境,為什麼很多人寫了7,8年程式碼還是一個碼農,工作中太多被動是因為不懂底層原理。公司的工作節奏又比較快,難有機會學習架構原理,也沒人教,所以這個時候,學習架構原理

架構師技術圖譜》先收藏

資料結構 佇列 集合 連結串列、陣列 字典、關聯陣列 棧 樹 二叉樹 完全二叉樹 平衡二叉樹 二叉查詢樹(BST) 紅黑樹 B,B

Python相關技術/工具棧

平臺 環境 pow 性能 ive ont sent 工具 解釋 轉載http://python.jobbole.com/83486/ 整理下目前涉及到的python的技術棧和工具棧(用過或了解的, 其他的後續用到再補充) 編輯器 最常見: vim / SublimeTe

如何面試Python工程師?

吃午飯的時候我就一直在想這個問題,我覺得重點不是Python而是後端工程師,因為Python只是系統的一部分,linux基礎操作要熟吧,sql要懂吧,訊息佇列要知道吧,git要熟悉吧……木桶理論,每一環都不能落下,精通其中一兩環就更好了。基礎功紮實,新東西學得快

優秀架構師必會知識:史上最全MySQL大表優化方案總結

本文原作者“ manong”,原創發表於segmentfault,原文連結:segmentfault.com/a/1190000006158186 1、引言 MySQL作為開源技術的代表作之一,是網際網路得以廣泛流行的重要基礎技術之一。 國外 GitHub、Airbnb、Yelp、

攜程移動架構演進與優化之路

作者簡介: 南志文,攜程研發經理,曾負責App整體技術框架的架構研發與實踐,現負責酒店業務的迭代更新及App架構、效能優化。曾先後就職於阿里巴巴、巨人網路。 本文為《程式設計師》原創文章,未經允許不得轉載,更多精彩文章請訂閱2016年《程式設計師》。

架構-架構層面

架構層面: 日誌集中 所謂日誌集中就是把程式的所有日誌和異常資訊的記錄都彙總到一起,在只有一臺伺服器的時候我們記錄本地檔案問題也不是最大,但是在負載均衡環境下再記錄本地日誌的話就出現問題了。在想檢視網站日誌的時候到哪臺機器去查都不知道,難道有100臺機器就100臺機器逐一遠端連上去看?因此,

架構師技術圖譜

資料結構 佇列 非阻塞佇列:ConcurrentLinkedQueue(無界執行緒安全),採用CAS機制(compareAndSwapObject原子操作)。 阻塞佇列:ArrayBlockingQueue(有界)、LinkedBlockingQu

如何面試Python 工程師(持續更新)

資料量和效能:當實體記憶體夠用的時候,redis>mongodb>mysql當實體記憶體不夠用的時候,redis和mongodb都會使用虛擬記憶體。實際上如果redis要開始虛擬記憶體,那很明顯要麼加記憶體條,要麼你換個資料庫了。但是,mongodb不一樣,只要,業務上能保證,冷熱資料的讀寫比,使

Akka-CQRS(0)- 基於akka-cluster的讀寫分離框架,構建gRPC移動應用架構

異常 在線 persist 體系 分片 系統性能 resp 數據庫更新 讀寫分離 上一篇我們討論了akka-cluster的分片(sharding)技術。在提供的例子中感覺到akka這樣的分布式系統工具特別適合支持大量的帶有內置狀態的,相對獨立完整的程序在集群節點上分

python觀感

一定的 alt 技術 p s pycha 右移 格式 form 表單 ctrl (一) Pycharm 快捷操作 選中一行     Ctrl + c復制當前行      Ctrl + d顯示引用或調用的   Ctrl + b多行註釋         Ctrl + /刪

app架構

(1)Restful設計原則     Restful風格:RESTfu設計原則,它被Roy Felding提出(在他的”基於網路的軟體架構“論文中第五章)。而REST的核心原則是將你的API拆分為邏輯上的資源。這些資源通過http被操作(GET ,POST,PUT,D