成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

去一家小公司從0到1搭建后端架構,做個總結!

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

來騰訊之前在前公司做了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。

問題與優化方式:

1、Django并發性能差 使用uWSGI Master+Worker 配合 gevent 攜程支持高并發

2、Redis連接數過多 使用redis-py自帶的連接池來實現連接復用

3、MySQL連接數過多 使用djorm-ext- pool(https://github.com/djangonauts/djorm-ext-pool)連接池復用連接

4、Celery配置gevent支持并發任務

隨著開發的功能越來越多,Django下的app也越來越多,這就帶了發布上的不方便,每次發布版本都需要重啟所有的Django服務,如果發布遇到問題,只能加班解決了。而且單個Django工程下的代碼量也越來越多,不好維護。

2. 服務拆分

隨著后端團隊的壯大,分給每個同事的需求也越來越細,如果繼續在一個工程里面開發所有的代碼,維護起來的代價太高,而我們的上一個架構中在Django里面已經按模塊劃分了一個個app,app內高類聚,app之間低耦合,這就為服務的拆分帶來了便利。

拆分的過程沒有遇到太大的問題,初期的拆分只是代碼的分離,把公用的代碼抽離出來實現一個公用的Python庫,數據庫,Redis還是共用,隨著負載的增加,數據庫也做了多實例。

如上圖,服務之間盡量避免相互調用,需要交互的地方采用http請求的方式,內網的調用使用hosts指向內網地址。

問題與優化方式:

  •  Nginx Push Module由于長時間沒有維護,長連接最大數量不夠,使用Tornado + ZeroMQ實現了tormq(https://github.com/zhu327/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這種新一代的微服務架構正在成為主流,雖然現在的工作與微服務無關了,但是也還會繼續關注學習。 

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2015-06-23 10:30:24

2010-03-09 11:24:54

2011-08-11 11:32:54

云計算收購

2015-03-02 15:04:44

年輕開發者開發者平凡的故事

2023-06-02 13:37:00

CIOIT領導者

2015-10-26 09:10:38

程序員加薪新方法

2017-07-10 09:47:42

互聯網金融技術

2023-03-06 11:35:55

經營分析體系

2017-08-31 18:19:00

程序猿軟件職場

2017-10-30 09:09:41

2024-09-26 10:19:15

2016-10-19 16:33:29

2014-02-26 10:59:45

程序員經理

2022-03-15 11:51:00

決策分析模型

2014-08-18 09:59:04

2011-08-22 10:20:17

研發

2017-05-23 11:22:15

一帶一路戴爾

2018-09-10 13:02:48

人工智能AI創業公司

2013-06-08 17:32:49

2011-04-13 09:46:35

應用開發移動應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 国产成人精品综合 | 国产午夜av片 | 亚洲乱码国产乱码精品精的特点 | 91视频在线观看 | 97精品超碰一区二区三区 | 91亚洲精品在线观看 | 亚洲精品9999 | 欧美大片一区 | 日韩一区中文字幕 | 国产精品日韩 | 国产成人精品一区二区 | 久久人人爽人人爽人人片av免费 | 一级黄色影片在线观看 | 国产91在线 | 中日 | 在线亚洲电影 | 一区二区三区在线观看免费视频 | 国产日韩欧美在线观看 | 91精品国产91久久久久久不卞 | 日本在线小视频 | 免费精品 | 99视频在线免费观看 | 91美女在线观看 | 成人福利网 | 国产一区二区三区视频 | 亚洲性人人天天夜夜摸 | 亚洲激情第一页 | 亚洲一区导航 | www免费视频 | 久草热线| 色爱综合网 | 最新国产福利在线 | 亚洲视频一区在线观看 | 亚洲精选久久 | 久久久久国产精品午夜一区 | 中文字幕在线视频网站 | h视频在线观看免费 | 久久综合香蕉 | 黄色精品| 午夜丰满寂寞少妇精品 | 天天射视频|