宋小菜從2014年年末建立,到今天爲止,3年多的時間只作了一件事情,摸索到蔬菜供應鏈的上游,爲何宋小菜要把業務持續往「上」作了?作B2B業務,只有控制供應,優化供應效率和成本才能將業務作成。3年的發展過程當中,宋小菜公司總體的思路就是反向供應鏈,先有需求,後有供應。咱們從一二線城市收集客戶(宋小菜內部稱呼服務城市端菜市場賣菜的菜販客戶爲小B)訂單,經過區域集單,將訂單轉化成上游蔬菜產區的採購單,入駐宋小菜平臺的供應商會拿到這個採購單,而後經過第三方提供物流服務將商品發送到城市端的宋小菜服務網點。宋小菜的業務模式以下圖所示:php
2015年3月10號,宋小菜反向供應鏈模式在武漢進行業務測試,在武漢馬湖菜市場開了第一個服務小B的服務站點,並在完成第一筆訂單。當時技術團隊的背景以下:前端
在創業公司的初始階段,技術團隊架構搭建和技術選型會決定產品技術對業務是能夠快速支撐,仍是會綁架了業務,阻礙業務發展。無論是業務驅動型的公司,仍是產品驅動型的公司或者技術驅動型公司,都會面臨這樣的問題。選擇技術架構就決定了對公司業務的影響。 開發語言選擇是創業公司技術選型的第一個面對的問題。在當前社會環境下,分工愈來愈細,開發工程師使用的語言工具會愈來愈侷限,雖然不少互聯網公司鼓勵全棧工程師的培養,可是長期來講,大部分工程師仍是隻精於一種開發語言的使用。選擇一種開發語言,就決定了技術團隊的組織架構。大部分互聯網企業開始搭建後端服務時使用了相似node.js,python,php等語言,這些語言在早期開發時能夠快速搭建服務,並快速支持產品功能變動,在創業初期會帶來不少靈活性。而宋小菜技術團隊早期選擇java做爲後端核心開發語言,在我2015年5月份加入宋小菜時,感受比較詫異,映象中的創業公司不多用java這種航母級的語言進行早期產品開發的。通過3年多的實戰經驗積累,證實選擇java做爲後端開發語言是比較知足宋小菜業務發展需求的。宋小菜做爲一個電商領域的服務平臺,吸取了不少電商平臺的歷史經驗和教訓。淘寶網從2003年建立,使用php搭建服務,2004年開始整個後端服務使用java改寫,當時外包給sun的團隊來作。杭州有些電商平臺在剛建立的時候使用php搭建服務,3年後開始全面切換到java。這些大的電商平臺具體爲何切換到java開發語言,不知道確切的緣由,至少在電商領域使用java會帶來以下看的到的優點。java
2014年以後籌建的創業公司基本選擇阿里雲這類Iaas平臺做爲基礎設施的提供方。阿里雲這個產品自己是從歷年的天貓雙十一中淬鍊出來的,服務的高可用獲得了證實,並且也支持快速擴容(微博在遇到熱門事件時選擇臨時購買阿里雲的ECS進行短時間緊急擴容),而阿里雲還在不斷提供互聯網公司須要的服務能力和解決方案,這些解決方案很好知足了電商公司的須要。宋小菜從第一個服務上線開始一直在使用阿里雲的基礎設施服務。下面是宋小菜使用的阿里雲服務列表node
使用服務
|
解決問題
|
開始使用時間
|
ECS
|
服務器的管理和運維
|
2015年3月
|
RDS
|
數據庫的管理和運維
|
2015年6月
|
OSS
|
文件存儲的管理和運維
|
2015年8月
|
消息MQ
|
服務事件管理
|
2017年3月
|
EDAS
|
服務治理
|
2017年10月
|
上表反映出,使用阿里雲的服務時,咱們沒有把6個服務所有開啓使用,而是分階段使用阿里雲的服務,貼着公司的業務須要,從效率和成本出發考慮。有個很好的例子說明了咱們進行技術選型的思路,早期宋小菜的數據庫是本身搭建的,只有一個mysql實例,也沒有進行數據備份和數據庫服務容災處理,在2015年7月份以前宋小菜的業務只在一個城市開展,因此數據庫的TPS不大,沒有一開始就使用阿里雲的RDS服務,而在2015年6月份開始,宋小菜計劃同時開啓3個城市的業務,考慮到業務量上漲3倍以上後,系統的壓力也會翻3倍以上,而全部的訪問量都會壓在數據庫上,數據庫要進行擴容以支撐業務量的增加,結合公司數據安全的考慮,咱們沒有考慮擴容當前的數據庫,而是直接遷移到RDS上。 通過3年的阿里雲服務使用後,阿里雲提供的基礎設施服務和解決方案不只能夠保證咱們的服務質量的要求,並且節省了技術團隊的人力投入。到目前爲止,咱們沒有專職PE和DBA,開發同窗在平常工做中只用承擔簡單的運維工做,這樣開發同窗能夠專一在開發和新技術的預研上。另外一方面,由於阿里雲在基礎設施上提供了高可用性,在業務發展過程當中咱們避免了服務不穩定形成的公司損失。 在使用阿里雲的服務時,不少人都會擔憂對阿里雲的依賴愈來愈重,會形成後期本身的技術升級和轉型會受制於阿里雲,其實這些影響不會太大,Netflix如今作到了千億美金市值的公司,網絡流量是全球互聯網公司第一,服務依然架設在AWS上面。若是公司的技術能力比較好,建議把後端服務都裝到Docker中,發生極端狀況時,出雲和遷移到其餘雲上的遷移成本也會很小。 這3年不斷增長對阿里雲的服務的使用,讓我也體會到,企業級解決方案如此成熟的今天,非雲計算公司的後端技術團隊,其核心能力應該是對業務的抽象和建模能力,這也是爲何從2016年開始嘗試DDD,並不斷試錯使用的緣由。python
早期的宋小菜只有一個ERP系統,這個系統使用springmvc框架搭建了典型的mvc架構。值得一提的是使用springmvc搭建mvc架構是很高效的,配置簡單,擴展性也比較高,基本知足了簡單系統對於登錄驗證、權限控制等功能需求。由於當時就一個後端系統,因此網頁端和移動端跟後端通信都是基於http協議。這個系統剛開始設計的時候沒有考慮到後期的水平擴展,到如今只能單點部署,因此一直是線上服務的一個雷區。 當時沒有進行系統層次的規劃,雖然分紅了controller和service 2層結構,可是不少業務邏輯都放在controller中,形成各個業務域的核心業務邏輯都散落在controller中.當時服務端開發人員只有3我的,這種Megalith Platform對於小團隊仍是比較ok的,單一系統單一開發人員,能夠快速響應產品需求。可是隨着業務快速發展,技術團隊持續擴張,在沒有工程結構規範和系統文檔缺失的狀況下,人人都在erp系統上開發產品需求,宋小菜採配銷業務的產品功能都集成到這個系統上,erp系統不可避免成爲了宋小菜的一個巨無霸,形成了後面多重問題爆發:mysql
在宋小菜起步階段,移動端只有宋小菜app一款app,並且只有android版本,服務的用戶是菜市場的小B客戶。當時銷售同窗在跑完一遍武漢市場後反饋小B客戶使用android手機的比例最高(有些上年紀的小B使用的是非智能手機),因此在起步階段只提供android版本。 android
宋小菜app初版首頁 早期移動端的可用性是比較低的,產品技術團隊一直沒有配備專職測試,測試工做交由產品經理來作,因此相似適配各類android機型的兼容性測試都作不了(要達到覆蓋度較高的android兼容性測試,須要購買市面上10多款主流設備,這個成本對於早期創業公司仍是比較大的)。在開發流程中,產品經理進行功能性驗證後,就經過宋小菜本身渠道發佈app出去,沒有很完備的測試,上線以後就進入了開發工程師的持續性人肉運維過程。這個時期,宋小菜尚未app端異常收集的工具,小B暴露問題後第一時間反饋給銷售,銷售再轉到產品技術這邊。在業務試跑階段,開發貼着業務現場快速響應問題並解決問題。 app端的使用體驗一直不太好,加上app的用戶是50歲左右的在菜市場賣菜的大爺大媽,銷售在小B客戶的業務場景中承擔不少客服職責,銷售的不少時間在幫助和教育小B怎麼使用宋小菜app進行下單。在2015年4G使用不太普及的,小B客戶在2G、3G環境下使用宋小菜app,首頁響應速度很慢(10s左右),銷售爲了快速跑單,是先用本子記下來,回到服務站電腦前使用erp幫小B代下單。 今天再回過來想下起步階段在移動端上的技術選型仍是過重了,當時整個技術團隊就一個外包android開發,總體開發能力達不到要求,若是起步階段藉助微信的平臺能力來鏈接咱們的小B客戶,不只能知足小B使用宋小菜服務(代採、配送、售後)的須要,並且也減小了銷售在服務小B客戶上的成本。經過產品來運營小B也會規避咱們後期業務中出現的問題,後面的章節會說到這些問題。這裏額外說下技術以外的話題,在一個相似宋小菜這樣的在早期靠業務驅動的公司,作業務的同窗使用互聯網思惟(平臺思惟、產品思惟)來規劃和推動業務是很關鍵的,直接影響業務推動速度和規模。在起步階段,宋小菜的技術架構有作的好的地方也有作的很差的地方。若是再從新作一遍宋小菜的架構,我會這樣去思考的,這些思考和總結對初創公司進行技術選型和技術架構搭建有比較好的參考價值。spring
關於如何搭建高效率的生鮮B2B平臺,由於包含的內容較多,也很複雜,沒法再一篇文章中給你們講清楚,本篇文章只是拋磚引玉,下面將分爲多篇文章從行業現狀、業務現狀、產品概述、技術團隊搭建、服務端技術平臺搭建、前端開發等多個維度來說述,咱們將三年多在B2B領域沉澱的核心產品和技術平臺公開,但願更多行業的人能深刻了解,少走一些彎路,但願對你們有幫助,本系列文章分佈以下(會繼續更新):sql
一、《如何搭建高效率的生鮮 B2B 平臺(B2B 技術共享第一篇)》數據庫
二、《宋小菜如何切入生鮮 B2B 市場(B2B 技術共享第二篇)》
三、《生鮮 B2B 平臺的產品體系如何迭代(B2B 技術共享第三篇)》
四、《生鮮 B2B 如何搭建高效的技術團隊(B2B 技術共享第四篇)》
五、《如何從 0 到 1 搭建生鮮 B2B 的技術體系(B2B 技術共享第五篇)》
六、《宋小菜技術如何應對生鮮 B2B 業務的快速變化(B2B 技術共享第六篇)》
七、《生鮮 B2B 技術平臺的前端團隊該如何搭建(B2B 技術共享第七篇)》