深刻理解java虛擬機
http://www.cnblogs.com/prayers/p/5515245.html
spring面試題
http://www.importnew.com/15851.html
sed 's/原字符串/替換字符串/' 末尾加g替換每個匹配的關鍵字,不然只替換每行的第一個
cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
當前WEB服務器中聯接次數最多的ip地址
#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
查看日誌中訪問次數最多的前10個IP
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less
查看日誌中出現100次以上的IP
#cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less
查看最近訪問量最高的文件
#cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -nr | less
查看日誌中訪問超過100次的頁面
#cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
統計某url,一天的訪問次數
#cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'
前五天的訪問次數最多的網頁
#cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20
從日誌裏查看該ip在幹嗎
#cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
列出傳輸時間超過 30 秒的文件
#cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -nr | head -20
列出最最耗時的頁面(超過60秒的)
#cat access_log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100
(01) ArrayList 其實是經過一個數組去保存數據的。當咱們構造ArrayList時;若使用默認構造函數,則ArrayList的默認容量大小是10。
(02) 當ArrayList容量不足以容納所有元素時,ArrayList會從新設置容量:新的容量=「(原始容量x3)/2 + 1」。
(03) ArrayList的克隆函數,便是將所有元素克隆到一個數組中。
(04) ArrayList實現java.io.Serializable的方式。當寫入到輸出流時,先寫入「容量」,再依次寫入「每個元素」;當讀出輸入流時,先讀取「容量」,再依次讀取「每個元素」
ArrayList 是一個數組隊列,至關於動態數組。它由數組實現,隨機訪問效率高,隨機插入、隨機刪除效率低。
LinkedList 是一個雙向鏈表。它也能夠被看成堆棧、隊列或雙端隊列進行操做。LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率低。
hashMap
1.HashMap其實是一個「鏈表散列」的數據結構,即數組和鏈表的結合體
初始容量,加載因子
對key作null檢查,若是key是null,會被存儲到table[0],由於null的hash值老是0
HashMap和Hashtable都是存儲「鍵值對(key-value)」的散列表,並且都是採用拉鍊法實現的。
存儲的思想都是:經過table數組存儲,數組的每個元素都是一個Entry;而一個Entry就是一個單向鏈表,Entry鏈表中的每個節點就保存了key-value鍵值對數據。
添加key-value鍵值對:首先,根據key值計算出哈希值,再計算出數組索引(即,該key-value在table中的索引)。而後,根據數組索引找到Entry(即,單向鏈表),再遍歷單向鏈表,將key和鏈表中的每個節點的key進行對比。若key已經存在Entry鏈表中,則用該value值取代舊的value值;若key不存在Entry鏈表中,則新建一個key-value節點,並將該節點插入Entry鏈表的表頭位置。
刪除key-value鍵值對:刪除鍵值對,相比於「添加鍵值對」來講,簡單不少。首先,仍是根據key計算出哈希值,再計算出數組索引(即,該key-value在table中的索引)。而後,根據索引找出Entry(即,單向鏈表)。若節點key-value存在與鏈表Entry中,則刪除鏈表中的節點便可。、
ConcurrentHashMap是線程安全的哈希表,它是經過「鎖分段」來實現的。ConcurrentHashMap中包括了「Segment(鎖分段)數組」,每一個Segment就是一個哈希表,並且也是可重入的互斥鎖。第一,Segment是哈希表表如今,Segment包含了「HashEntry數組」,而「HashEntry數組」中的每個HashEntry元素是一個單向鏈表。即Segment是經過鏈式哈希表。第二,Segment是可重入的互斥鎖表如今,Segment繼承於ReentrantLock,而ReentrantLock就是可重入的互斥鎖。
對於ConcurrentHashMap的添加,刪除操做,在操做開始前,線程都會獲取Segment的互斥鎖;操做完畢以後,纔會釋放。而對於讀取操做,它是經過volatile去實現的,HashEntry數組是volatile類型的,而volatile能保證「即對一個volatile變量的讀,老是能看到(任意線程)對這個volatile變量最後的寫入」,即咱們總能讀到其它線程寫入HashEntry以後的值。
大於或等於concurrencyLevel的最小的2的N次方值
ArrayBlockingQueue若某線程(線程A)要取出數據時,隊列正好爲空,則該線程會執行notEmpty.await()進行等待;當其它某個線程(線程B)向隊列中插入了數據以後,會調用notEmpty.signal()喚醒「notEmpty上的等待線程」。此時,線程A會被喚醒從而得以繼續運行。 此外,線程A在執行取操做前,會獲取takeLock,在取操做執行完畢再釋放takeLock。
若某線程(線程H)要插入數據時,隊列已滿,則該線程會它執行notFull.await()進行等待;當其它某個線程(線程I)取出數據以後,會調用notFull.signal()喚醒「notFull上的等待線程」。此時,線程H就會被喚醒從而得以繼續運行。 此外,線程H在執行插入操做前,會獲取putLock,在插入操做執行完畢才釋放putLock。
一級緩存: 基於PerpetualCache 的 HashMap本地緩存,其存儲做用域爲 Session,當 Session flush 或 close 以後,該Session中的全部 Cache 就將清空。
二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap存儲,不一樣在於其存儲做用域爲 Mapper(Namespace),而且可自定義存儲源,如 Ehcache。
對於緩存數據更新機制,當某一個做用域(一級緩存Session/二級緩存Namespaces)的進行了 C/U/D 操做後,默認該做用域下全部 select 中的緩存將被clear。
1)CountDownLatch和CyclicBarrier都可以實現線程之間的等待,只不過它們側重點不一樣:
CountDownLatch通常用於某個線程A等待若干個其餘線程執行完任務以後,它才執行;
而CyclicBarrier通常用於一組線程互相等待至某個狀態,而後這一組線程再同時執行;
另外,CountDownLatch是不可以重用的,而CyclicBarrier是能夠重用的。
2)Semaphore其實和鎖有點相似,它通常用於控制對某組資源的訪問權限。
ThreadPoolExecutor 線程池任務執行流程:
當線程池小於corePoolSize時,新提交任務將建立一個新線程執行任務,即便此時線程池中存在空閒線程。
當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行
當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會建立新線程執行任務
當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
當線程池中超過corePoolSize線程,空閒時間達到keepAliveTime時,關閉空閒線程
當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閒時間達到keepAliveTime也將關閉
排隊
1.直接提交。工做隊列的默認選項是 SynchronousQueue,它將任務直接提交給線程而不保持它們。
2.無界隊列。使用無界隊列(例如,不具備預約義容量的 LinkedBlockingQueue)將致使在全部 corePoolSize 線程都忙時新任務在隊列中等待。這樣,建立的線程就不會超過 corePoolSize。
3.有界隊列。當使用有限的 maximumPoolSizes 時,有界隊列(如 ArrayBlockingQueue)有助於防止資源耗盡,可是可能較難調整和控制
被拒絕的任務
當 Executor 已經關閉,而且 Executor 將有限邊界用於最大線程和工做隊列容量,且已經飽和時,在方法 execute(java.lang.Runnable) 中提交的新任務將被拒絕
1.在默認的 ThreadPoolExecutor.AbortPolicy 中,處理程序遭到拒絕將拋出運行時RejectedExecutionException。
2.在 ThreadPoolExecutor.CallerRunsPolicy 中,線程調用運行該任務的execute 自己。此策略提供簡單的反饋控制機制,可以減緩新任務的提交速度。
3.在 ThreadPoolExecutor.DiscardPolicy 中,不能執行的任務將被刪除。
4.在 ThreadPoolExecutor.DiscardOldestPolicy 中,若是執行程序還沒有關閉,則位於工做隊列頭部的任務將被刪除,而後重試執行程序(若是再次失敗,則重複此過程)。
newCachedThreadPool:
底層:返回ThreadPoolExecutor實例,corePoolSize爲0;maximumPoolSize爲Integer.MAX_VALUE;keepAliveTime爲60L;unit爲TimeUnit.SECONDS;workQueue爲SynchronousQueue(同步隊列)
通俗:當有新任務到來,則插入到SynchronousQueue中,因爲SynchronousQueue是同步隊列,所以會在池中尋找可用線程來執行,如有能夠線程則執行,若沒有可用線程則建立一個線程來執行該任務;若池中線程空閒時間超過指定大小,則該線程會被銷燬。
適用:執行不少短時間異步的小程序或者負載較輕的服務器
newFixedThreadPool:
底層:返回ThreadPoolExecutor實例,接收參數爲所設定線程數量nThread,corePoolSize爲nThread,maximumPoolSize爲nThread;keepAliveTime爲0L(不限時);unit爲:TimeUnit.MILLISECONDS;WorkQueue爲:new LinkedBlockingQueue<Runnable>() 無解阻塞隊列
通俗:建立可容納固定數量線程的池子,每隔線程的存活時間是無限的,當池子滿了就不在添加線程了;若是池中的全部線程均在繁忙狀態,對於新任務會進入阻塞隊列中(無界的阻塞隊列)
適用:執行長期的任務,性能好不少
newSingleThreadExecutor:
底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor實例,corePoolSize爲1;maximumPoolSize爲1;keepAliveTime爲0L;unit爲:TimeUnit.MILLISECONDS;workQueue爲:new LinkedBlockingQueue<Runnable>() 無解阻塞隊列
通俗:建立只有一個線程的線程池,且線程的存活時間是無限的;當該線程正繁忙時,對於新任務會進入阻塞隊列中(無界的阻塞隊列)
適用:一個任務一個任務執行的場景
NewScheduledThreadPool:
底層:建立ScheduledThreadPoolExecutor實例,corePoolSize爲傳遞來的參數,maximumPoolSize爲Integer.MAX_VALUE;keepAliveTime爲0;unit爲:TimeUnit.NANOSECONDS;workQueue爲:new DelayedWorkQueue() 一個按超時時間升序排序的隊列
通俗:建立一個固定大小的線程池,線程池內線程存活時間無限制,線程池能夠支持定時及週期性任務執行,若是全部線程均處於繁忙狀態,對於新任務會進入DelayedWorkQueue隊列中,這是一種按照超時時間排序的隊列結構
適用:週期性執行任務的場景
BIO是一個鏈接一個線程。
NIO是一個請求一個線程。
AIO是一個有效請求一個線程。
先來個例子理解一下概念,以銀行取款爲例:
同步 : 本身親自出馬持銀行卡到銀行取錢(使用同步IO時,Java本身處理IO讀寫);
異步 : 委託一小弟拿銀行卡到銀行取錢,而後給你(使用異步IO時,Java將IO讀寫委託給OS處理,須要將數據緩衝區地址和大小傳給OS(銀行卡和密碼),OS須要支持異步IO操做API);
阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回);
非阻塞 : 櫃檯取款,取個號,而後坐在椅子上作其它事,等號廣播會通知你辦理,沒到號你就不能去,你能夠不斷問大堂經理排到了沒有,大堂經理若是說還沒到你就不能去(使用非阻塞IO時,若是不能讀寫Java調用會立刻返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)
Java對BIO、NIO、AIO的支持:
Java BIO : 同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。
Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理,
同步阻塞IO:在此種方式下,用戶進程在發起一個IO操做之後,必須等待IO操做的完成,只有當真正完成了IO操做之後,用戶進程才能運行。JAVA傳統的IO模型屬於此種方式!
同步非阻塞IO:在此種方式下,用戶進程發起一個IO操做之後邊可返回作其它事情,可是用戶進程須要時不時的詢問IO操做是否就緒,這就要求用戶進程不停的去詢問,從而引入沒必要要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。
異步阻塞IO:此種方式下是指應用發起一個IO操做之後,不等待內核IO操做的完成,等內核完成IO操做之後會通知應用程序,這其實就是同步和異步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼爲何說是阻塞的呢?由於此時是經過select系統調用來完成的,而select函數自己的實現方式是阻塞的,而採用select函數有個好處就是它能夠同時監聽多個文件句柄,從而提升系統的併發性!
異步非阻塞IO:在此種模式下,用戶進程只須要發起一個IO操做而後當即返回,等IO操做真正的完成之後,應用程序會獲得IO操做完成的通知,此時用戶進程只須要對數據進行處理就行了,不須要進行實際的IO讀寫操做,由於真正的IO讀取或者寫入操做已經由內核完成了。目前Java中尚未支持此種IO模型。
若是你想吃一份宮保雞丁蓋飯:
同步阻塞:你到飯館點餐,而後在那等着,還要一邊喊:好了沒啊!
同步非阻塞:在飯館點完餐,就去遛狗了。不過溜一下子,就回飯館喊一聲:好了沒啊!
異步阻塞:遛狗的時候,接到飯館電話,說飯作好了,讓您親自去拿。
異步非阻塞:飯館打電話說,咱們知道您的位置,一會給你送過來,安心遛狗就能夠了。
3.springmvc
第一步:發起請求到前端控制器(DispatcherServlet)
第二步:前端控制器請求HandlerMapping查找 Handler
能夠根據xml配置、註解進行查找
第三步:處理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器調用處理器適配器去執行Handler
第五步:處理器適配器去執行Handler
第六步:Handler執行完成給適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一個底層對象,包括Model和view
第八步:前端控制器請求視圖解析器去進行視圖解析
根據邏輯視圖名解析成真正的視圖(jsp)
第九步:視圖解析器向前端控制器返回View
第十步:前端控制器進行視圖渲染
視圖渲染將模型數據(在ModelAndView對象中)填充到request域
第十一步:前端控制器向用戶響應結果
maven總結
maven解決jar衝突
1.dependency:tree 以層級樹方式展示傳遞性依賴
2.<exclusion> 將不想要的傳遞依賴剪除掉
3.查看運行期類來源的JAR包
事務屬性
傳播行爲 隔離規則 回滾規則 事務超時 是否只讀
spring 事務傳播
REQUIRED 表示當前方法必須運行在事務中。若是當前事務存在,方法將會在該事務中運行。不然,會啓動一個新的事務
SUPPORTS 表示當前方法不須要事務上下文,可是若是存在當前事務的話,那麼該方法會在這個事務中運行
MANDATORY 表示該方法必須在事務中運行,若是當前事務不存在,則會拋出一個異常
REQUIRED_NEW 表示當前方法必須運行在它本身的事務中。一個新的事務將被啓動。若是存在當前事務,在該方法執行期間,當前事務會被掛起。若是使用JTATransactionManager的話,則須要訪問TransactionManager
NOT_SUPPORTED 表示該方法不該該運行在事務中。若是存在當前事務,在該方法運行期間,當前事務將被掛起。若是使用JTATransactionManager的話,則須要訪問TransactionManager
NEVER 表示當前方法不該該運行在事務上下文中。若是當前正有一個事務在運行,則會拋出異常
NESTED 表示若是當前已經存在一個事務,那麼該方法將會在嵌套事務中運行
髒讀(Dirty reads)——髒讀發生在一個事務讀取了另外一個事務改寫但還沒有提交的數據時。若是改寫在稍後被回滾了,那麼第一個事務獲取的數據就是無效的。
不可重複讀(Nonrepeatable read)——不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,可是每次都獲得不一樣的數據時。這一般是由於另外一個併發事務在兩次查詢期間進行了更新。
幻讀(Phantom read)——幻讀與不可重複讀相似。它發生在一個事務(T1)讀取了幾行數據,接着另外一個併發事務(T2)插入了一些數據時。在隨後的查詢中,第一個事務(T1)就會發現多了一些本來不存在的記錄。
不可重複讀的重點是修改,幻讀的重點在於新增或者刪除
從控制的角度來看, 二者的區別就比較大。
對於前者, 只須要鎖住知足條件的記錄。
對於後者, 要鎖住知足條件及其相近的記錄
隔離級別
定義了一個事務可能受其餘併發事務影響的程度
SOLATION_READ_UNCOMMITTED 最低的隔離級別,容許讀取還沒有提交的數據變動,可能會致使髒讀、幻讀或不可重複讀
ISOLATION_READ_COMMITTED 容許讀取併發事務已經提交的數據,能夠阻止髒讀,可是幻讀或不可重複讀仍有可能發生
ISOLATION_REPEATABLE_READ 對同一字段的屢次讀取結果都是一致的,除非數據是被自己事務本身所修改,能夠阻止髒讀和不可重複讀,但幻讀仍有可能發生
ISOLATION_SERIALIZABLE 最高的隔離級別,徹底服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,由於它一般是經過徹底鎖定事務相關的數據庫表來實現的
JVM常見配置
堆設置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:設置年輕代大小
-XX:NewRatio=n:設置年輕代和年老代的比值。如:爲3,表示年輕代與年老代比值爲1:3,年輕代佔整個年輕代年老代和的1/4
-XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5
-XX:MaxPermSize=n:設置持久代大小
收集器設置
-XX:+UseSerialGC:設置串行收集器
-XX:+UseParallelGC:設置並行收集器
-XX:+UseParalledlOldGC:設置並行年老代收集器
-XX:+UseConcMarkSweepGC:設置併發收集器
垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
並行收集器設置
-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
併發收集器設置
-XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU狀況。
-XX:ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
spring 配置雙數據源並讀寫分離
關鍵思想在於重寫 AbstractRoutingSource.determineCurrentLookupKey();
配置writeDataSource,readDataSource
aop配置根據方法名前綴選擇使用的數據源<entry key="read" value=",get,select,count,list,query," />
<entry key="write" value=",add,insert,create,update,delete,remove," />
實現@DataSource註解,在方法上配置
Redis是一個開源的,基於內存的結構化數據存儲媒介,能夠做爲數據庫、緩存服務或消息服務使用。
Redis支持多種數據結構,包括字符串 string、哈希表 hash、鏈表list、集合set、有序集合sorted set、位圖、Hyperloglogs等。
Redis具有LRU淘汰、事務實現、以及不一樣級別的硬盤持久化等能力,而且支持副本集和經過Redis Sentinel實現的高可用方案,同時還支持經過Redis Cluster實現的數據自動分片能力。
Redis的主要功能都基於單線程模型實現,也就是說Redis使用一個線程來服務全部的客戶端請求,同時Redis採用了非阻塞式IO,並精細地優化各類命令的算法時間複雜度
前文提到過,Redis採用單線程模型,自然是線程安全的,這使得INCR/DECR命令能夠很是便利的實現高併發場景下的精確控制。
1 Dubbo中zookeeper作註冊中心,若是註冊中心集羣都掛掉,發佈者和訂閱者之間還能通訊麼?
能夠的,啓動dubbo時,消費者會從zk拉取註冊的生產者的地址接口等數據,緩存在本地。每次調用時,按照本地存儲的地址進行調用
註冊中心對等集羣,任意一臺宕掉後,會自動切換到另外一臺
註冊中心所有宕掉,服務提供者和消費者仍能夠經過本地緩存通信
服務提供者無狀態,任一臺 宕機後,不影響使用
服務提供者所有宕機,服務消費者會沒法使用,並沒有限次重連等待服務者恢復
2 dubbo鏈接註冊中心和直連的區別
在開發及測試環境下,常常須要繞過註冊中心,只測試指定服務提供者,這時候可能須要點對點直連,
點對點直聯方式,將以服務接口爲單位,忽略註冊中心的提供者列表,
服務註冊中心,動態的註冊和發現服務,使服務的位置透明,並經過在消費方獲取服務提供方地址列表,實現軟負載均衡和Failover, 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,註冊中心,服務提供者,服務消費者三者之間均爲長鏈接,監控中心除外,註冊中心經過長鏈接感知服務提供者的存在,服務提供者宕機,註冊中心將當即推送事件通知消費者
註冊中心和監控中心所有宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
註冊中心和監控中心都是可選的,服務消費者能夠直連服務提供者
三、Dubbo在安全機制方面是如何解決的
Dubbo經過Token令牌防止用戶繞過註冊中心直連,而後在註冊中心上管理受權。Dubbo還提供服務黑白名單,來控制服務所容許的調用方
4 Dubbo提供了4種均衡策略,如:Random LoadBalance(隨機均衡算法)、;RoundRobin LoadBalance(權重輪循均衡算法)、LeastAction LoadBalance(最少活躍調用數均衡算法)、ConsistentHash LoadBalance(一致性Hash均衡算法)
5 集羣容錯模式:
Failover Cluster
失敗自動切換,當出現失敗,重試其它服務器。(缺省)
一般用於讀操做,但重試會帶來更長延遲。
可經過retries="2"來設置重試次數(不含第一次)。正是文章剛開始說的那種狀況.
Failfast Cluster
快速失敗,只發起一次調用,失敗當即報錯。
一般用於非冪等性的寫操做,好比新增記錄。
Failsafe Cluster
失敗安全,出現異常時,直接忽略。
一般用於寫入審計日誌等操做。
Failback Cluster
失敗自動恢復,後臺記錄失敗請求,定時重發。
一般用於消息通知操做。
Forking Cluster
並行調用多個服務器,只要一個成功即返回。
一般用於實時性要求較高的讀操做,但須要浪費更多服務資源。
可經過forks="2"來設置最大並行數。
Broadcast Cluster
廣播調用全部提供者,逐個調用,任意一臺報錯則報錯。(2.1.0開始支持)
一般用於通知全部提供者更新緩存或日誌等本地資源信息。php