因此,只要涉及到分佈式系統,包括分佈式服務,分庫分表,甚至Web這種瀏覽器前端與後端之間調用,都須要根據CAP定理進行權衡。
不少人習慣進行服務的同步調用,其實這是和一般方法調用習慣致使,分佈式系統中同步調用好像很快,其實很是脆弱,網絡容錯性差,一旦網絡堵塞,同步調用RPC就容易失敗。 所以,在分佈式系統中,異步調用好像是異步,沒有同步快,實際是未必然,異步調用是CAP中的C強一致性和A可用性的妥協,使用最終一致性得到可用性的提升,同時又可以保證必定的網絡容錯性; 而RPC同步調用,則是選擇了CAP中C和A,相似2PC分佈式事務,可是網絡容錯性不好,網絡稍微有點堵塞,RPC調用就會受到影響,若是RPC調用嵌套了好幾個,某個點的網絡堵塞會點爆整個調用鏈條的崩潰。
因此,微服務架構中,跟蹤和恢復變得很是重要,固然這些經過專門的跟蹤工具實現,可是這些都是過後控制了。
那麼微服務之間的通信推薦使用異步方式,如何具體實現呢? 首先經過異步消息實現微服務之間調用,在架構設計是鬆耦合的,可見個人另一篇《軟件架構的靈活設計》,另外,異步不表明性能慢,由於在分佈式系統中,總體快慢是取決於最慢的那個環節,因此,總體性能是講究效率的,並且這個性能快慢實際就是延遲與可用性問題,又回到前面CAP問題上。
那麼異步消息傳遞在兩個服務之間傳遞什麼呢? 固然是傳參,這樣兩個微服務之間經過服務調用進行參數傳遞,實現數據共享,沒必要將彼此的數據庫共享給對方訪問,微服務擁有本身的獨立數據庫是微服務嚴格定義中的重要特徵。
目前消息系統有三種消息傳遞方式: 有至少一次傳遞; 至多一次傳遞; 正好一次傳遞。
至少一次意思是一個消息至少傳遞一次以上,固然會形成消息內容重複冗餘,可是可靠性提升了; 而至多一次是服務器的消息最多傳遞一次,若是再傳遞一次,就會形成負面影響,好比會重複執行一些下游的非冪等的服務。 正好一次是經過消息接收方發送確認收到的方式試圖保障每次消息傳遞都能可靠傳遞完成,可是在理論上認爲這是不可能的,由於這個發送、收到和確認的過程當中一旦出現問題,就沒法保證傳遞完成。
其實若是咱們從另一個角度來看消息傳遞,從網絡數據廣播角度看,服務器之間實現原子廣播是否可能? Kafka(卡夫卡)的創始人Jay Kreps發表過專門一篇文章談論這個問題,他認爲原子廣播至關於consensus共識,由於共識多是分佈式系統中研究最多的問題。 共識是否可能? 其實這是衆所周知的算法主攻的問題,如Paxos和Raft已經在現代分佈式系統實踐中獲得普遍實現。 最後他得出結論: 共識是現代分佈式系統發展的支柱。 卡夫卡其中心抽象是分佈式一致的日誌,其實是您能夠想象成最純粹的相似於多方共識的模擬。 因此若是你不相信共識是可能的話,那麼你也不相信卡夫卡是可能的,在這種狀況下,你不用擔憂卡夫卡的正好一次支持的可能性!
本文分享自微信公衆號 - 物流IT圈(exiter18)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。前端