1.主要工作內(nèi)容
原有用戶觸達邏輯分散在各個系統(tǒng),比較雜亂咙鞍,實現(xiàn)各種觸達消息的統(tǒng)一發(fā)送织堂、記錄叠艳、控制,對上游業(yè)務屏蔽消息發(fā)送的復雜性易阳,將用戶觸達邏輯封裝獨立出來附较,建立保險的消息觸達平臺。觸達渠道包括:短信潦俺、PUSH拒课、在線客服、微信公眾號事示、人工早像。新平臺可以靈活支持不同的產(chǎn)品,觸達策略可跟蹤肖爵、可追溯卢鹦、效果可驗證,可配置化劝堪。根據(jù)保單不同的生命周期階段及系統(tǒng)的現(xiàn)狀冀自,觸達功能的實現(xiàn)可分為在線任務和離線任務:
●在線任務:訂單狀態(tài)變更后之后的觸達根據(jù)時效性要求,通過消費mysql-binlog/kafka消息來捕獲投保成功事件秒啦,根據(jù)配置的觸達策略進行觸達熬粗;
●離線任務:部分場景根據(jù)配置的策略每天定時生成觸達批次、觸達任務和觸達明細余境,根據(jù)具體的觸達策略來進行觸達
2. 工作思路
2.1 業(yè)務設計
由于在之前公司接觸過消息系統(tǒng)的設計驻呐、開發(fā)與維護,所以參照以往的規(guī)則設計消息觸達系統(tǒng)芳来,總體思路不變含末,只是為了數(shù)據(jù)統(tǒng)計的方便拆分更細,同時為了支持離線任務的執(zhí)行即舌,引入了批次等設計答渔。
2.1.1數(shù)據(jù)庫設計
2.2 技術設計
對于實時的在線任務,我們開啟相關數(shù)據(jù)庫的Binlog功能侥涵,使用kafka實時監(jiān)聽數(shù)據(jù)表字段的新增和更新,消費者消費消息完成后續(xù)的觸達任務宋雏。對于離線任務我們使用多線程的離線任務定期掃描明細表芜飘,創(chuàng)建新的任務批次進行發(fā)送。
這里的幾個關鍵技術就是MySql的Binlog磨总,Kafka的接入凳鬓,離線任務的編寫疏叨。
3. 知識點整理
3.1 Binlog
● binlog是記錄所有數(shù)據(jù)庫表結構變更(例如CREATE、ALTER TABLE…)以及表數(shù)據(jù)修改(INSERT耳奕、UPDATE、DELETE…)的二進制日志情屹。
● binlog不會記錄SELECT和SHOW這類操作,因為這類操作對數(shù)據(jù)本身并沒有修改,但你可以通過查詢通用日志來查看MySQL執(zhí)行過的所有語句汹桦。
● 如果update操作沒有造成數(shù)據(jù)變化,也是會記入binlog鉴裹。
這個二進制日志包括兩類文件:
索引文件(文件名后綴為.index)用于記錄哪些日志文件正在被使用舞骆。
日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句事件。
Binlog的三個用途:
恢復:這里網(wǎng)上有大把的文章指導你径荔,如何利用binlog日志恢復數(shù)據(jù)庫數(shù)據(jù)督禽。
復制: 主從同步。主庫有一個log dump線程总处,將binlog傳給從庫從庫有兩個線程狈惫,一個I/O線程,一個SQL線程鹦马,I/O線程讀取主庫傳過來的binlog內(nèi)容并寫入到relay log,SQL線程從relay log里面讀取內(nèi)容胧谈,寫入從庫的數(shù)據(jù)庫。
審計:用戶可以通過二進制日志中的信息來進行審計菠红,判斷是否有對數(shù)據(jù)庫進行注入攻擊第岖。
3.2 Kafka
3.2.1 Kafka的特性
高吞吐量、低延遲:kafka每秒可以處理幾十萬條消息试溯,它的延遲最低只有幾毫秒蔑滓,每個topic可以分多個partition, consumer group 對partition進行consume操作
可擴展性:kafka集群支持熱擴展
持久性、可靠性:消息被持久化到本地磁盤遇绞,并且支持數(shù)據(jù)備份防止數(shù)據(jù)丟失
容錯性:允許集群中節(jié)點失敿ぁ(若副本數(shù)量為n,則允許n-1個節(jié)點失敗)
高并發(fā):支持數(shù)千個客戶端同時讀寫
3.2.2 Kafka的使用場景
日志收集:一個公司可以用Kafka可以收集各種服務的log摹闽,通過kafka以統(tǒng)一接口服務的方式開放給各種consumer蹄咖,例如hadoop、Hbase付鹿、Solr等澜汤。
消息系統(tǒng):解耦和生產(chǎn)者和消費者、緩存消息等舵匾。
用戶活動跟蹤:Kafka經(jīng)常被用來記錄web用戶或者app用戶的各種活動俊抵,如瀏覽網(wǎng)頁、搜索坐梯、點擊等活動徽诲,這些活動信息被各個服務器發(fā)布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時的監(jiān)控分析,或者裝載到hadoop谎替、數(shù)據(jù)倉庫中做離線分析和挖掘偷溺。
運營指標:Kafka也經(jīng)常用來記錄運營監(jiān)控數(shù)據(jù)。包括收集各種分布式應用的數(shù)據(jù)钱贯,生產(chǎn)各種操作的集中反饋挫掏,比如報警和報告。
流式處理:比如spark streaming和storm
3.2.3 Kafka的結構
Producer:Producer即生產(chǎn)者喷舀,消息的產(chǎn)生者砍濒,是消息的入口。
kafka cluster:
-Broker:Broker是kafka實例硫麻,每個服務器上有一個或多個kafka的實例爸邢,我們姑且認為每個broker對應一臺服務器。每個kafka集群內(nèi)的broker都有一個不重復的編號拿愧,如圖中的broker-0杠河、broker-1等……
-Topic:消息的主題,可以理解為消息的分類浇辜,kafka的數(shù)據(jù)就保存在topic券敌。在每個broker上都可以創(chuàng)建多個topic。
-Partition:Topic的分區(qū)柳洋,每個topic可以有多個分區(qū)待诅,分區(qū)的作用是做負載,提高kafka的吞吐量熊镣。同一個topic在不同的分區(qū)的數(shù)據(jù)是不重復的卑雁,partition的表現(xiàn)形式就是一個一個的文件夾!
-Replication:每一個分區(qū)都有多個副本绪囱,副本的作用是做備胎测蹲。當主分區(qū)(Leader)故障的時候會選擇一個備胎(Follower)上位,成為Leader鬼吵。在kafka中默認副本的最大數(shù)量是10個扣甲,且副本的數(shù)量不能大于Broker的數(shù)量,follower和leader絕對是在不同的機器齿椅,同一機器對同一個分區(qū)也只可能存放一個副本(包括自己)琉挖。
-Message:每一條發(fā)送的消息主體。
Consumer:消費者涣脚,即消息的消費方示辈,是消息的出口。
Consumer Group:我們可以將多個消費組組成一個消費者組涩澡,在kafka的設計中同一個分區(qū)的數(shù)據(jù)只能被消費者組中的某一個消費者消費。同一個消費者組的消費者可以消費同一個topic的不同分區(qū)的數(shù)據(jù),這也是為了提高kafka的吞吐量妙同!
Zookeeper:kafka集群依賴zookeeper來保存集群的的元信息射富,來保證系統(tǒng)的可用性。
3.2.4 Kafka分區(qū)和確認機制
熟悉負載均衡的朋友應該知道粥帚,當我們向某個服務器發(fā)送請求的時候胰耗,服務端可能會對請求做一個負載,將流量分發(fā)到不同的服務器芒涡,那在kafka中柴灯,如果某個topic有多個partition,producer又怎么知道該將數(shù)據(jù)發(fā)往哪個partition呢费尽?kafka中有幾個原則:
1赠群、partition在寫入的時候可以指定需要寫入的partition,如果有指定旱幼,則寫入對應的partition查描。
2、如果沒有指定partition柏卤,但是設置了數(shù)據(jù)的key冬三,則會根據(jù)key的值hash出一個partition。
3缘缚、如果既沒指定partition勾笆,又沒有設置key,則會輪詢選出一個partition桥滨。
保證消息不丟失是一個消息隊列中間件的基本保證窝爪,那producer在向kafka寫入消息的時候,怎么保證消息不丟失呢该园?其實上面的寫入流程圖中有描述出來酸舍,那就是通過ACK應答機制!在生產(chǎn)者向隊列寫入數(shù)據(jù)的時候可以設置參數(shù)來確定是否確認kafka接收到數(shù)據(jù)里初,這個參數(shù)可設置的值為0啃勉、1、all双妨。
0代表producer往集群發(fā)送數(shù)據(jù)不需要等到集群的返回淮阐,不確保消息發(fā)送成功。安全性最低但是效率最高刁品。
1代表producer往集群發(fā)送數(shù)據(jù)只要leader應答就可以發(fā)送下一條泣特,只確保leader發(fā)送成功。
all代表producer往集群發(fā)送數(shù)據(jù)需要所有的follower都完成從leader的同步才會發(fā)送下一條挑随,確保leader發(fā)送成功和所有的副本都完成備份状您。安全性最高,但是效率最低。
3.4 離線任務
這里使用的是Linux的crontab膏孟。