打造基于大并发通信技术及大数据技术的O2O系统
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
本文來自于個推CTO葉新江在2015Qcon的分享整理。
截止2015年6月,個推SDK累計接入總用戶數(shù)達50億 (其中海外近5億),接入應(yīng)用超過35萬,開發(fā)者人數(shù)近20萬,覆蓋獨立終端超過8億(其中海外超過1億),日均活躍用戶近6億,日分發(fā)消息20億條。
這么龐大的數(shù)據(jù),是如何做到的呢?2011年公司做的是小規(guī)模IM產(chǎn)品,發(fā)展思路偏向于拿來主義,和很多開發(fā)者一樣會選擇MySQL來作為網(wǎng)站數(shù)據(jù)庫。到了2011年,重新設(shè)計了系統(tǒng)架構(gòu),選擇了更為開源的大并發(fā)通信系統(tǒng);直至去年,多地協(xié)同、流式處理的理念應(yīng)運而生,形成了大分布及大數(shù)據(jù)的處理系統(tǒng)。從單點的數(shù)據(jù)庫到點與點的通訊,再到網(wǎng)絡(luò)結(jié)構(gòu)系統(tǒng),不僅需要克服思維上的局限,更需要挑戰(zhàn)服務(wù)器的極限。
例如:延遲和吞吐量,用戶多了之后如何在保證延遲可接受的情況下達到想要的吞吐?關(guān)于這點大家可以回想下Java虛擬機的垃圾回收算法。
以下是開發(fā)大并發(fā)通信系統(tǒng)的相關(guān)經(jīng)驗:
1.內(nèi)部服務(wù)調(diào)用方式
關(guān)于調(diào)用方式,異步非侵入式是首選。無需等待返回值的函數(shù)調(diào)用絕對擁有最高的收益,輔以非侵入調(diào)用就能最大程度上減少對目標程序的占用。
2.JVM及線程調(diào)優(yōu)
個推選擇CMS(Concurrent Mark-Sweep)作為GC(Garbage Collection),默認了92%的回收觸發(fā)條件。另外要注意的是Linux下的性能調(diào)優(yōu),如MAT的使用,利用 top-p-H 來查看CPU占用情況,利用jstack,jmap命令定位問題所在等。
3.TCP 闌尾
TCP是全雙工的,因此關(guān)閉連接必須要在兩個方向上分別進行,反復(fù)的通道開啟和關(guān)閉很容易帶來問題。起初TW(Time Wait)就是為了克服不穩(wěn)定的網(wǎng)絡(luò)帶來的丟包等問題,如今隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,TW已經(jīng)成了雞肋。另外,雖然說TW狀態(tài)的連接既可以被回收(Recycle)又可以被重用(Reuse),但沒有人愿意冒這雙重風險。在二者選其一時,能在時間戳上滿足接入規(guī)律的Reuse有著明顯的優(yōu)勢。
4.健壯保障
需要重點關(guān)注:關(guān)鍵詞,如流控、維穩(wěn)、異常隔離、分降級、斷續(xù)處理等。就流控而言,有可能出現(xiàn)SDK發(fā)送數(shù)據(jù)存在邏輯問題而導(dǎo)致浪涌現(xiàn)象的情況。
5.分布式事務(wù)
如何在分布式情況下實現(xiàn)將100元錢從A轉(zhuǎn)到B?傳統(tǒng)思維是按照A.C.I.D原則進行操作。A.C.I.D指數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個基本要素。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。這里我詳細討論下另一種替代方案——B.A.S.E,Basic Availability:基本可用;Soft-state :軟狀態(tài)/柔性事務(wù),可以理解為”無連接”的, 而 “Hard state” 是”面向連接”的;Eventual consistency:最終一致性,最終整個系統(tǒng)(時間和系統(tǒng)的要求有關(guān))看到的數(shù)據(jù)是一致的。在B.A.S.E中,強調(diào)可用性的同時,引入了最終一致性這個概念,不像A.C.I.D,并不需要每個事務(wù)都是一致的,只需要整個系統(tǒng)經(jīng)過一定時間后最終達到是一致的。首先確定考慮因素,即用什么方式來分割交易事務(wù),資源方面有哪些要求,如何保證冪等性。
接下來是具體實現(xiàn)方式,流程如下:
1.設(shè)置業(yè)務(wù)交易記錄表 T, 并建立一套和 T 相同存儲的隊列 Q
2.記錄交易到 T, 同時放入隊列 Q, 兩個動作一個事務(wù)
3.A設(shè)置一個已處理交易記錄表TA
4.監(jiān)測 Q, 如果有給 A 的交易請求,則
開始事務(wù)
查看 TA 中是否有處理過此交易
If沒有處理過 then
更新 A 記錄
把處理痕跡寫入 TA
end if
結(jié)束事務(wù)
If 上面的事務(wù)處理成功 then
Q出列
end if
1. B也按上述方式處理
使用分布式事務(wù)有助于簡化應(yīng)用開發(fā),使用消息隊列明顯需要更多的工作量,兩者各有優(yōu)劣。
總結(jié):對于時間緊迫或者對性能要求不高的系統(tǒng),應(yīng)采用分布式事務(wù)加快開發(fā)效率,對于時間需求不是很緊,對性能要求很高的系統(tǒng),應(yīng)考慮使用消息隊列方案。對于原使用分布式事務(wù),且系統(tǒng)已趨于穩(wěn)定,性能要求高的系統(tǒng),則可以使用消息隊列方案進行重構(gòu)來優(yōu)化性能。
6.關(guān)于前瞻和成本
舉個簡單的例子——數(shù)據(jù)分區(qū)。實施前確定需要的資源,事先規(guī)劃和分割,看到資源的限制后安排后期數(shù)據(jù)搬遷,最后利用redis內(nèi)存分配占用。
最后談一點我們理解的O2O下的推送。我們的核心為5W,即在合適的時間(When)、合適的地點(Where)、合適的場景(Which)把合適的內(nèi)容(What)推送給合適的人(Who)。比如中午12點,用戶來到了到中關(guān)村附近,日常比較喜歡粵菜,自然希望收到有關(guān)粵菜館的一些優(yōu)惠信息或者位置信息。在推送依據(jù)上,個推依賴于用戶畫像,并且根據(jù)場景進行高效的信息推送。
轉(zhuǎn)載于:https://my.oschina.net/u/1782938/blog/475007
總結(jié)
以上是生活随笔為你收集整理的打造基于大并发通信技术及大数据技术的O2O系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发(五)——计时器
- 下一篇: WCF技术剖析之五:利用ASP.NET兼