Ruby是計算機語言中的紳士,若是要用一個詞來形容,那必定是優雅,有這麼一位Rubyist,他的座右銘是「寫優雅的程序,作一個優雅的人」,他是來自七牛小夥伴「薄荷」的Co-founder兼CTO謝文威(英文名Vincent)。薄荷的核心繫統徹底基於Ruby構建,關於Ruby服務間通訊模式,他在「七牛彎區課堂」給Ruby愛好者們作了一次分享。 git
上圖是薄荷App服務劃分的例子,各子系統(服務)間須要進行各類通訊,主要通訊種類以下。 redis
1、A服務須要使用B服務的一些數據 共享數據庫 數據庫
應用場景:用戶的年齡、性別、身高和體重等數據存儲在帳號子系統中,其它子系統常常須要使用這些數據。 安全
處理方式:共享數據庫 ruby
App2直接創建鏈接訪問 App1的數據庫。這種方式的優勢是性能較好,避免了接口處理和消息封裝種種開銷,適用於通訊特別頻繁或者數據量特別大的場合。薄荷的帳號和會話數據即採起這種方案。可是,該方式致使服務間有很強的耦合,App2對App1的數據結構有緊密的依賴,致使App1的實現難以變動。 網絡
共享數據庫方法: 數據結構
ActiveRecord支持多數據庫配置有一些注意的事項: 多線程
可使用關聯,不支持join,不支持事務 併發
測試數據最好使用factory_girl curl
爲避免數據混亂,只有一個服務可寫
共享模型使用
gem model
git submodule
2、A服務須要B服務提供某個計算結果 請求結果(同步)
應用場景:計算預算熱量須要使用複雜的數學模型,它放在記錄子系統中實現,別的系統須要用到相關的數據時,經過一種通訊機制拿到計算結果。
處理方式:HttpAPI Call和RPC
1)Http API Call
這是最多見的一種通訊方式,服務實現方案成熟可靠,具備服務邊際簡單清晰的特色,同時適用於外部和內部,但內部調用性能不夠好。
使用Http API注意事項
訪問安全控制,使用ip限制,token校驗等
避免調用層次過深,超時機制
Http Client選擇(Http Client特別多,主要分爲如下幾類)
薄荷目前typhoeus和faraday用的較多,緣由是:typhoeus底層基於curl,性能比較好,而且支持並行,用異步API的方式,比較可靠,不用擔憂多線程問題。
2)RPC(Remote Procedure Call)
主要特色:
長鏈接,避免每次通訊建立網絡鏈接,性能較好
對http、消息協議更高效
多種跨語言RPC方案,如thriftmsgpack_rpc
RPC管理
性能上有必定優點,須要權衡其複雜度,複雜度在於服務實現方案和管理方法。
服務端併發模式
高可用方案,可用HAProxy
平滑部署
RPC的用法比較少見,更多地用於跨多語言的團隊,當公司使用多種語言且須要很好地整合時,RPC則是一種比較成熟的方案。
3、A服務須要B服務處理一項任務 請求任務處理(異步)
應用場景:在購物模塊裏面,一個訂單發生支付後,須要給用戶推送一些信息,好比發短信、郵件和手機推送等。發送消息可能須要比較長的時間才能完成,請求方不須要等待處理結果。
處理方式:消息隊列
1)傳統消息隊列系統RabbitMQ/Active MQ
MQ能夠有下降服務之間耦合度,一般用於服務之間的異步處理(傳統MQ有更豐富的處理機制),傳統MQ ruby服務實現方案,能夠參考sneakers, hutch, rack-ampq, rack-rabbit。
2)在單個應用內部經常使用基於redis的輕量消息隊列
resque&sidekiq
3)sidekiq-postman
它是Vincent寫的一個gem,基於sidekiq輕量消息隊列解決方法,簡單實用,能夠跨應用請求sidekiq任務處理,如下是其核心代碼:
4、A服務發生某件事,通知B和C進行處理 訂閱和通知
應用場景:好比帳號基本信息,基於性能考慮,在子系統中存儲了用戶名副本。當用戶名在帳戶子系統中發生變化時,須要通知其它子系統更新。
處理方式:消息隊列
Sidekiq-driver 是Vincent正在寫的基於sidekiq輕量訂閱和通知解決方法的gem,你們能夠盡情期待這個項目的開源。
【七牛彎區課堂】是七牛爲廣大開發者提供的技術實踐分享課堂,後續將按期邀請各技術社區的專家進行分享。以上內容便是Ruby China社區在「七牛彎區課堂」的處女做。歡迎各技術社區的小夥伴來【七牛彎區課堂】分享實踐心得,也感謝各位爲技術社區所貢獻的力量。