寫(xiě)在前面
最近一年來(lái),我都在做公司的RTB廣告系統(tǒng),包括SSP曝光服務(wù),ADX服務(wù)和DSP系統(tǒng)。因?yàn)槭堑谝淮卧诠居肎o語(yǔ)言實(shí)現(xiàn)這么一個(gè)大的系統(tǒng),中間因?yàn)楦鞣N原因造了很多輪子?,F(xiàn)在稍微有點(diǎn)時(shí)間,覺(jué)著有必要總結(jié)這一年來(lái)用Go造輪子的經(jīng)驗(yàn)和不足。
集群中遇到的配置文件管理問(wèn)題
RTB廣告系統(tǒng)中涉及到的服務(wù)程序并不算很多,但是因?yàn)镽TB系統(tǒng)會(huì)面臨很多的流量,而且為了確??捎眯?,最基本的就是多實(shí)例組成集群,同時(shí)考慮到后續(xù)業(yè)務(wù)增長(zhǎng),集群的擴(kuò)縮容也是要做的。我們?cè)谠O(shè)計(jì)的時(shí)候,基于ZoooKeeper做了服務(wù)發(fā)現(xiàn),而我們的服務(wù)接入依靠Nginx集群,然后通過(guò)反向代理把請(qǐng)求負(fù)載均衡到不同的服務(wù)實(shí)例中。這里就存在以下問(wèn)題:
當(dāng)我們升級(jí)某個(gè)服務(wù)時(shí),如何通知Nginx集群自動(dòng)的摘除或者添加該服務(wù)實(shí)例,保證我們的升級(jí)不會(huì)影響到業(yè)務(wù)和用戶體驗(yàn)
進(jìn)一步,任意一個(gè)服務(wù)集群內(nèi)的配置數(shù)據(jù)該如何自動(dòng)更新和應(yīng)用?
業(yè)界方案
業(yè)界其實(shí)有很多成熟的方案解決這類(lèi)問(wèn)題:
比如開(kāi)源項(xiàng)目consul-template,但是這個(gè)工具只支持后端consul,而我們用的是ZooKeeper
再比如confd,可以支持多種后端,比如etcd或者zookeeper,但是它用的ZooKeeper客戶端不支持在故障時(shí)對(duì)業(yè)務(wù)請(qǐng)求進(jìn)行重試,比如發(fā)起了一個(gè)GetW請(qǐng)求,而Session變成超時(shí)狀態(tài),這個(gè)時(shí)候GetW返回的Channel就不可用了,只能重新發(fā)起請(qǐng)求,但是重試多少次請(qǐng)求其實(shí)是不知道的,針對(duì)這個(gè)情況,我還在項(xiàng)目一開(kāi)始的時(shí)候?qū)崿F(xiàn)了新的包,加入了對(duì)業(yè)務(wù)層透明的重試機(jī)制。
整體工作流程
解析模版,獲取要?jiǎng)討B(tài)查詢(xún)的節(jié)點(diǎn)
向指定的服務(wù)器,比如ZooKeeper發(fā)起查詢(xún)請(qǐng)求,并觀察指定節(jié)點(diǎn)的變化
當(dāng)?shù)谝淮位蛘吖?jié)點(diǎn)發(fā)生變更后,查詢(xún)最新數(shù)據(jù)
把最新數(shù)據(jù)應(yīng)用到模版中生成新的配置文件數(shù)據(jù)
保存最新的配置文件數(shù)據(jù)到目標(biāo)路徑,并調(diào)用指定的命令應(yīng)用最新的配置文件
實(shí)現(xiàn)
模版機(jī)制
Go官方標(biāo)準(zhǔn)庫(kù)提供了Template包,支持if, range等控制語(yǔ)句,也支持用戶自定義方法。模版機(jī)制的方便之處在于,它本身是一種DSL,也算是一種支持計(jì)算的超級(jí)printf。舉例如下:
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26
