Hi,你們好,很榮幸有這個機會能夠經過寫博文的方式,把這些年在後端開發過程當中總結沉澱下來的經驗和設計思路分享出來html
根據業務場景,將業務抽離成獨立模塊,對外經過接口提供服務,減小系統複雜度和耦合度,實現可複用,易維護,易拓展前端
項目中實踐例子:node
Before:python
在返還購APP裏有個【個人紅包】的功能,用戶的紅包數據來自多個業務,如:邀請新用戶註冊領取100元紅包,大促活動雙倍紅包,等各類活動紅包,多個活動業務都實現了一套不一樣規則的紅包領取和紅包獎勵發放的機制,致使紅包不可管理,不能複用,難維護難拓展mysql
After:程序員
設計概要redis
Before VS Aftersql
產品有時提出的業務需求沒有往這方面去考慮,結合場景和將來拓展須要,在需求討論的時候提出模塊化設計方案,並能夠協助產品進行設計數據庫
在項目開發中常常會遇到些相似的功能,可是不一樣的開發人員都各自實現,或者由於不能複用又從新開發一個,致使了相似功能的重複開發,因此咱們須要對可以抽離獨立服務的功能進行抽離,達到複用的效果,而且能夠不斷拓展完善,節約了後續開發成本,提升開發效率,易於維護和拓展express
項目中實踐例子:
Before
在業務中常常須要對用戶進行信息通知,如:短信定時通知,APP消息推送,微信通知,等
開發人員在接到需求中有通知功能的時候沒有考慮後續拓展,就接入第三方信息通知平臺,而後簡單封裝個信息通知方法,後續也有相似信息通知需求的時候,另外一個開發人員發現當前這個通知方法沒法知足本身的需求,而後又本身去了解第三方平臺從新封裝了通知方法,或者後續需求加了定時通知的功能,開發人員針對業務去實現了個定時通知功能,可是隻能本身業務上使用,其餘業務沒法接入,沒有人去作這塊功能的抽離,長此以往就演變成功能重複開發,且不易於維護和拓展
After
接觸到這種能夠抽離通用服務需求的時候,就會與產品確認這種需求是否後續會存在相似的須要,而後建議這把塊需求抽離成通用服務,方便後續維護與拓展
設計概要
Before VS After
項目開發過程當中有些需求是與所在項目業務無關,如:收集用戶行爲習慣,收集商品曝光點擊,數據收集提供給BI進行統計報表輸出,公用拉新促活業務(柚子街和返還公用),相似這種需求,咱們結合應用場景,考慮服務的獨立性,以及將來的拓展須要,架構獨立項目進行維護,在服務器上獨立分佈式部署不影響現有主業務服務器資源
項目中實踐例子:
架構用戶行爲跟蹤獨立服務,在開發前預估了下這個服務的請求量,並會有相對大量的併發請求
架構方案:
用戶行爲跟蹤服務的服務架構圖
高併發除了須要對服務器進行垂直擴展和水平擴展以外,做爲後端開發能夠經過高併發優化,保證業務在高併發的時候可以穩定的運行,避免業務停滯帶來的損失,給用戶帶來很差的體驗
服務端緩存架構圖
異步編程
業務異步處理
【業務異步處理】架構圖
【業務異步處理】除了能夠在高併發業務中使用,在上面通用服務的設計裏也是用這種架構方式
在類秒殺的活動中經過限制請求量,能夠避免超賣,超領等問題
高併發的活動業務,經過前端控流,分散請求,減小併發量
當服務器資源消耗已經達到必定的級別的時候,爲了保證核心業務正常運行,須要丟卒保車,棄車保帥,服務降級是最後的手段,避免服務器宕機致使業務停滯帶來的損失,以及給用戶帶來很差的體驗
高併發優化概要圖
大多數公司的產品設計和程序猿對於推廣活動業務的防刷意識不強,在活動業務設計和開發的過程當中沒有把防刷的功能加入業務中,給那些喜歡刷活動的人創造了不少的空子
等到你發現本身被刷的時候,已經產生了不小的損失,少則幾百幾千,多則幾萬
隨着利益的誘惑,如今已經浮現了一個新的職業「刷客」,專業刷互聯網活動爲生,養了N臺手機+N個手機號碼+N個微信帳號,刷到的獎勵金進行提現,刷到活動商品進行低價轉手處理,開闢了一條新的灰色產業鏈
咱們要拿起武器(代碼)進行自個人防護,風控,加高門檻,經過校驗和限制減小風險發生的各類可能性,減小風險發生時形成的損失
這裏列出經常使用套路(具體應用結合業務場景):
校驗請求合法性
業務風控
應對角色
防刷/防羊毛黨套路概要圖
附加
多操做
當==同用戶==屢次觸發點擊,或者經過模擬併發請求,就會出現多操做的問題,好比:簽到功能,一天只能簽到一次,能夠得到1積分,可是併發的狀況下會出現用戶能夠得到多積分的問題
簡化簽到邏輯通常是這樣的:
查詢是否有簽到記錄 --> 否 --> 添加今日簽到記錄 --> 累加用戶積分 --> 簽到成功
查詢是否有簽到記錄 --> 是 --> 今日已經簽到過
假設這個時候用戶A併發兩個簽到請求,這時會同時進入到 【查詢是否有簽到記錄】,而後同時返回否,就會添加兩條的簽到記錄,而且多累加積分
最理想簡單的方案,只須要在簽到記錄表添加【簽到日期】+【用戶ID】的組合惟一索引,當併發的時候只有會一條能夠添加成功,其餘添加操做會由於惟一約束而失敗
庫存負數
當==多用戶==併發點擊參與活動,如:抽獎活動,這個時候獎品只有一個庫存了,理論上只有一個用戶能夠得到,可是併發的時候每每會出現他們都成功得到獎品,致使獎品多支出,加大了活動成本
有問題的邏輯流程通常是這樣的:
中獎 --> 查詢獎品庫存 --> 有 --> 更新獎品庫存 --> 添加中獎紀錄 --> 告知中獎
中獎 --> 查詢獎品庫存 --> 無 --> 告知無中獎
假設抽獎活動,當前獎品A只有最後一個庫存,而後用戶A、B、C,同時參與活動同時中獎獎品都是A,這個時候查詢商品庫存是存在1個,就會進行更新庫存,添加中獎紀錄,而後就同時中獎了
最理想根本就不須要用多作一個庫存的SELECT獎品庫存操做,只須要UPDATE 獎品庫存-1 WHERE 獎品庫存>=1,UPDATE成功後就說明是有庫存的,而後再作後續操做,併發的時候只會有一個用戶UPDATE成功
總結:
在開發業務接口的時候須要把==同用戶==和==多用戶==併發的場景考慮進去,這樣就能夠避免在併發的時候產生數據異常問題,致使成本多支出
可使用下面的工具進行模擬併發測試:
廣泛方案
使用selenium+Headless自動化測試框架
反反爬蟲
在作數據採集的過程當中,有些平臺會對重要數據的請求設置反爬蟲策略,避免數據被競品挖掘和利用,以及消耗大量資源拖垮服務器,
反爬蟲和反反爬蟲是技術之間的較量,這場沒有硝煙的戰爭永不停息。(程序員何須爲難程序員)
反爬蟲能夠分爲如下兩種
做爲後端開發者,不只是完成需求功能開發,要結合業務場景進行合理設計,架構將來,對核心業務進行壓測優化,以保證業務在併發下可以正常運行,同時要考慮安全問題以及防刷,防羊毛黨,在編碼上避免壞代碼味道,面相抽象開發,適當使用設計模式,避免技術債
開發應該銘記於心的精句: