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