微服務反模式與陷阱翻譯終結篇
都在說微服務,那麼微服務的反模式和陷阱是什麼(一)
http://www.jianshu.com/p/3986239138fe
都在說微服務,那麼微服務的反模式和陷阱是什麼(二)
http://www.jianshu.com/p/c76f7f234a31
九、通訊協議使用的陷阱
在微服務架構體系中要求每個服務都是獨立佈署,這就意味著服務之間會有通訊,也就是說會有很多的遠端訪問。
當你不知道這些遠端訪問需要多長時間的時候,就會掉入到這個陷阱,當然我們可以假定遠端訪問一次50毫秒,但我們是否真正的進行過測試呢?那麼服務的平均響應時間是多少呢?即使有看上去很好的平均響應時間,那麼糟糕的“長尾延遲”也會將整體系統摧毀。
9.1 延遲測量
在生產環境中進行壓力測試,是檢測我們系統效能的重要手段之一,舉個例子:我們有一個特定業務需要四個服務來協調處理,假如遠端訪問一次的時間是100毫秒,那麼這個特定業務就需要消耗500毫秒(初始請求+四個服務的呼叫時間),這個只是遠端訪問的時間,還不算實際業務程式碼的執行時間,這是大多數應用系統都不能接受的時間。
9.2 通訊協議比較
不同協議的延遲響應時間其實在不同的環境中表現的差異很大,因此我們也需要在不同的業務請求下建立一些測試基準。
從圖9-1中可以看出AMQP的效能要比REST的快近一倍,可以我們就可以做出一些選擇了,在什麼場景下應該用什麼協議,另外在選擇協議時效能並不是唯一的考慮因素,在第十章將會為大家介紹除了效能還需要考慮的點是什麼。
十、REST陷阱
目前使用REST協議已然成了微服務協議的最佳選擇了,現在最流行的DropWizard和Spring boot就是基於REST進行通訊的,那問題來了,如果REST是一個最佳選擇,那為什麼又說它是一個陷阱呢?如果把REST作為唯一的通訊方式,就有可能掉入這個陷阱,比如如何處理非同步通訊(http 1.1是blocking的)、如何在一個事務中管理多次服務呼叫?如何支援廣播?
你應該考慮兩種型別的訊息標準作為微服務架構中的訊息傳遞:特定平臺的標準和平臺無關的標準。特定平臺的標準比如 JMS for java、MSMQ for .net。平臺無關的比如 AMQP。
使用訊息系統的好處可以非同步請求,還可以實現廣播的方式,還可以實現事務請求。
10.1 非同步請求
使用微服務架構首先要考慮的是非同步通訊方式,因為非同步通訊的呼叫者不需要考慮等待服務的響應時間,如圖10-1所示。
使用非同步方式的好處不僅提升了整體效能,還增加了一些可靠性的因素,另外也不需要擔心超時問題和在程式中設定斷路器模式。
10.2 廣播能力
這個最典型的就是訊息的“釋出-訂閱”,如圖10-2所示。
10.3 事務請求
訊息系統需要支援事務訊息的概念,這意味著如果訊息被髮送到多個佇列或Topic中,在傳送方對該事務進行提交之前, 這些訊息實際上不會被接收方所接收。服務消費者傳送一個訊息到第一個服務,然後傳送另一個訊息的第二個服務,如圖10-3所示。在服務使用者執行提交之前,這些訊息都儲存在佇列中。一旦服務使用者執行提交,兩個訊息就會被釋放。
在圖10-3中,服務消費者將訊息傳送到第一個佇列中,然後服務消費者業務報錯, 這時可以在訊息事務中進行回滾,從訊息系統的佇列中刪除掉剛才發的訊息。
使用REST實現這種事務能力就非常困難,其實就是要求服務使用者使用TCC、或者補償方式來達到最終一致性。
結束語
關於微服務的反模式和陷阱三部曲,到現在為止已經全部翻譯完成,英文文件一共60多頁,這裡面有不少內容大家都是耳熟能詳的,關於原版的英文文件我也提供給大家做一個參考,最後感謝大家的支援和幫助。
原版文件連結如下:http://pan.baidu.com/s/1qY3Etoo 密碼:l26d
相關文章
- [譯] How to NOT React:React 中常見的反模式與陷阱React模式
- 微服務的歷史與陷阱微服務
- 7種微服務反模式微服務模式
- [翻譯]微服務設計模式 - 1. 單體應用模式微服務設計模式
- [翻譯]微服務設計模式 - 3. 按業務功能拆分模式微服務設計模式
- [翻譯]微服務設計模式 - 5. 服務發現 - 服務端服務發現微服務設計模式服務端
- Kite: 一個分散式微服務框架(翻譯)分散式微服務框架
- 翻譯篇
- [譯] JWT 與 Spring Cloud 微服務JWTSpringCloud微服務
- 服務設計的原則:服務模式與反模式模式
- iSwift 翻譯--開篇Swift
- 服務端指南 資料儲存篇 | MySQL(07) 正規化與反模式服務端MySql模式
- 終:直譯器模式模式
- [Spring Cloud Tutorial翻譯系列]微服務-定義、原則、好處SpringCloud微服務
- OpenCV翻譯專案總結二——Mat翻譯OpenCV
- 微服務5:服務註冊與發現(實踐篇)微服務
- OpenCV翻譯總結OpenCV
- 微服務的效能模式微服務模式
- 微服務的最終一致性與事件流微服務事件
- Yurii談翻譯(三)怎樣翻譯更地道:補語篇
- Java編譯與反編譯Java編譯
- 保護模式篇——總結與提升模式
- 微服務學習系列篇微服務
- 微服務·理論篇(二)微服務
- 微服務架構和設計模式 - DZone微服務微服務架構設計模式
- 微服務設計模式(下)微服務設計模式
- 微服務設計模式(上)微服務設計模式
- Docker與微服務Docker微服務
- soa與微服務微服務
- Go Micro(5)——架構與微服務的設計模式Go架構微服務設計模式
- 構建微服務的三種重要模式 - DZone微服務微服務模式
- [翻譯]通訊模式(Communication Patterns)模式
- Sphinx Ranking Mode(排序模式) (翻譯)排序模式
- [譯]Spring構建微服務Spring微服務
- 翻譯-使用Ratpack和Spring Boot打造高效能的JVM微服務應用Spring BootJVM微服務
- 貓頭鷹的深夜翻譯:開發者最常踩到的六個低效陷阱
- 關於微服務入門篇微服務
- Swoft 基礎到微服務篇微服務