1. 程式人生 > >failover機制的小討論

failover機制的小討論

  對於一個7*24小時無間斷的線上服務來說,在服役時間內難免會遇到一些fail,例如db斷開連線且短暫連線不上了, 下游的某個節點忽然掛了,運維部署上依賴的某一個東西不存在了等等場景。本文主要來討論一下這些場景使用怎樣的策略會比較好。

  最簡單的方法,While(true) + sleep(固定時間)  不斷的重試,直到成功為止。這個方法的優點就是簡單,可依賴。缺點就是對於感知延遲要求比較嚴格的程式,會消耗大量的CPU,甚至因為一些不合理的邏輯導致CPU滿載等等情況發生.這種簡單粗暴的方法應用廣泛,並且能解決實際問題,在很多場合還是非常可取. 我們暫且叫這種策略為”粗暴法”.

  我曾經在一個實時檔案抓取程式中(類似於scribe這樣的實時日誌傳輸方案),使用了這樣的策略,當fstat原始檔發現檔案不存在的時候,我會重試1000次,每次間隔sleep 10ms, 其間程式會輸出很多warnning資訊來支援一些報警等,重試完1000次之後(10s之後),將sleep間隔設定為固定時間,例如1s,在降低程式對CPU的消耗的同時,保證了一定的實時性,原始檔無論什麼時候出現都能夠確保在1s內cover進來,而且這樣的策略對於日誌切分場景也非常實用,普通的日誌切分(如切分nginx為每小時一個檔案,crontab每小時mv access.log access.log.$date再 kill -USR1等)程式能夠立馬感知到並作出相應的策略調整。我們暫且叫這種策略為”重試N次後,將間隔時間調整為最大的可接受值”

.

  再看看另外一種方法,最近看了下facebook scribe的原始碼(感興趣的自己google,大家可以姑且的認為是一個多下游的日誌轉發工具),他在下游死掉了之後選擇對sleep時間循序漸進的策略,每次將retryInterval *1.414; (sqrt(2)),再加上一個範圍隨機數(如1-100ms),同時來設定了一個最大值的方式來相對動態的判斷下游狀態. 為什麼一定要設定最大值呢?因為這個策略在異常時間久了之後,滯後性會非常大,當一場恢復時,可能不能及時感知,所以需要一個最大值做保證。我們暫且叫這種策略為“重試時間循序漸進, 且確保不大於最大可接受值“.

  近兩年來使用zookeeper(以下簡稱zk)的公司越來越多,很多公司都用zk來做大型分散式系統的協調,他的模式類似於:下游通過在zk上註冊一個臨時節點,告訴大家,我活著呢, 上游通過watch這個節點的變化來感知下游的變化。模式很簡單,但是大家都是用zk是因為他提供了很多額外的東西,例如下游註冊的臨時節點在下游宕機,或者網路不可達(反正就是掛了)等等情況下會自動清除,並且通過回撥函式實時讓上游程式感知,作出相應變化,當下遊活了之後,又註冊一個臨時節點宣稱自己活了,上游程式也能通過回撥函式實時感知。上游程式依賴zookeeper的一個Lib庫。對於上游程式來說,他是一個觀察者,套進設計模式就是觀察者模式,好萊塢有句名言. “不要給我打電話, 我會給你打電話”.我們暫且叫這種策略為“被動實時感知下游變化”

  先寫到這裡(也只想到了這些),後續有所想法再補充吧,也歡迎各位看官留言,過去的博文都長篇大論,以後儘量做到簡約不簡單吧。畢竟時間精力有限。

相關推薦

failover機制討論

  對於一個7*24小時無間斷的線上服務來說,在服役時間內難免會遇到一些fail,例如db斷開連線且短暫連線不上了, 下游的某個節點忽然掛了,運維部署上依賴的某一個東西不存在了等等場景。本文主要來討論一下這些場景使用怎樣的策略會比較好。   最簡單的方法,While(true) + sleep(固定時間) 

java反射機制練習

外部程式吧位元組碼檔案的名稱儲存在配置檔案中,主函式從配置檔案讀取,進而執行外部程式。 介面: package cn.itcast.reflecttest.demo; //介面 public interface Pic { public void open(); public void

程式學習--如何利用storage快取機制(程式快取功能)

小程式中一個切換期刊的業務,每次切換的時候,都需要向伺服器傳送請求,顯得很麻煩, 所以才去storage的機制,在編譯過程中就載入好資料存放到快取中,這樣每次切換期刊的時候,不用再次傳送請求,完成優化 開啟開發工具的偵錯程式,選擇network,每次切換的時候,只請求新期刊的點贊狀態,

cocos-Lua中的class與require機制(積累)

local layer = require("PaiGow.src.GamePlayerListLayer") local GameTableUI = class("GameTableUI", require("gamemanager.GameViewBase")); 一

Android例子:使用反射機制來讀取圖片制作一個圖片瀏覽器

onclick lac protected blank pri tar lec 存儲 current 效果圖:                                 工程文件夾:   該例子可供於新手參考練習,如果有哪裏不對的地方,望指正>-< 《

程序開發--程序的事件機制

nta 單純 添加 cli nim ati 我們 -- api   首先在小程序中,如果要實現點擊操作,是沒有click事件,在官方api文檔中,給我們提供了tap事件來表示用戶短暫點擊後手指離開。   而如果我們要監聽這個事件,並且在這個事件上綁定一個方法,就要在在相應的

微信程式的事件機制---冒泡與非冒泡事件

在微信小程式中,可以看到同為點選事件,有的是bindtap而有的是catchtap,那麼這兩者有什麼區別呢?為了進一步瞭解微信小程式的事件機制,在原DEMO的基礎上增加了一個簡單的頁面。效果如下。 Paste_Image.png 紅黃綠分別代表三個view。 紅是最外層的, 黃綠依次為

Hadoop的JVM重用機制檔案解決

Hadoop的JVM重用機制和小檔案解決 一、hadoop2.0 uber功能   1) uber的原理:Yarn的預設配置會禁用uber元件,即不允許JVM重用。我們先看看在這種情況下,Yarn是如何執行一個MapReduce job的。首先,Resource Manager裡的App

如何解決微信程式介面適配問題-引用-生命週期回撥函式-優化機制-樣式引入

如何解決微信小程式介面適配問題 .wxss page{ height: 100%; width:750rpx; } this.setData({ imageWidth: wx.getSystemInfoSync().windowWidth }) rpx(res

微信程式獲取UnionID機制和出現的問題

前段時間做了一個小程式的專案,在小程式支付的時候出現了一個問題,導致小程式稽核不通過,稽核不通過的原因說是虛擬支付,出現這個問題的原因是因為微信小程式的支付IOS是不能支付的,所以就不能通過,這個時候我們就出了一套方案就是在小程式中IOS使用者是不能進行支付產品

微信程式的更新機制 && 如何讓微信使用者更新程式

更新機制 稍後說 更新小程式程式碼: 根據微信提供的api,可以檢測是否小程式有新版本 程式碼如下   let updateManager = wx.getUpdateManager(); updateManager.onCheckForUpdate(fu

springboot學習筆記(二)---springboot工作機制

Spring Boot工作機制簡介 一、@SpringBootApplication 我們新建一個springboot專案裡面會有一個SpringbootDay1203Application類 我們都知道@SpringBootApplication是Springboot專案的核心註

maptask執行機制,與檔案的優化合並TextInputFormat

maptask並行度與決定機制     1)一個job任務map階段並行度由客戶端提交的任務所決定     2)每一個split分配一個maptask並行處理     3)預設情況下,split大小=block

微信程式的事件機制

比如我們android從一個activity跳轉到另一個activity,是通過Intent,而在小程式中從一個介面跳轉到另外一個介面是通過什麼方式呢?而事件又是什麼東東? 什麼是事件 事件是檢視層到邏輯層的通訊方式。 事件可以將使用者的行為反饋到邏輯層進行處理。 事

工具)Java反射機制實現任意物件集合按指定任意欄位進行分組通用程式實踐

在應用開發的時候,我們有時候會遇到需要對一個給定集合進行分組的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後group by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行分

工具)Java反射機制實現任意物件集合排序並且獲取排列名次的通用程式實踐

在應用開發的時候,我們有時候會遇到需要對一個給定集合進行排序的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後order by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行排

Dubbo服務叢集,常見容錯機制failover ,failsafe,failfase ,failback,forking

http://blog.csdn.net/hongweigg/article/details/52925920 http://m.blog.csdn.net/article/details?id=51137364 <dubbo:reference cluster="

關於程式授權機制

其實,這裡說的不是小程式的授權機制,而是登入態的機制。 小程式裡面的授權,是對特定介面的授權。 微信官方已經給小程式封裝了很多API介面。 當呼叫wx.login()時,就可以向伺服器發起請求,得到code。 在公眾號裡,是需要開發者在伺服器設

程式app.js整合授權儲存機制

客戶端App({  onLaunch: function() {    //呼叫API從本地快取中獲取資料    var logs = wx.getStorageSync('logs') || []    logs.unshift(Date.now())    wx.setS

【JAVA基礎問題】java中實現多型的機制是什麼?

靠的是父類或介面定義的引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是引用變數所指向的具體例項物件的方法,也就是記憶體里正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。