ruby是計算機語言中的紳士,如果要用乙個詞來形容,那一定是優雅,有這麼一位rubyist,他的座右銘是「寫優雅的程式,做乙個優雅的人」,他是來自七牛小夥伴「薄荷」的co-founder兼cto謝文威(英文名vincent)。薄荷的核心系統完全基於ruby構建,關於ruby服務間通訊模式,他在「七牛彎區課堂」給ruby愛好者們做了一次分享。
一、a服務需要使用b服務的一些資料 共享資料庫
應用場景:使用者的年齡、性別、身高和體重等資料儲存在賬號子系統中,其它子系統經常需要使用這些資料。
處理方式:共享資料庫
共享資料庫方法:
activerecord支援多資料庫配置有一些注意的事項:
可以使用關聯,不支援join,不支援事務
測試資料最好使用factory_girl
為避免資料混亂,只有乙個服務可寫
共享模型使用
gem model
git submodule
二、a服務需要b服務提供某個計算結果 請求結果(同步)
處理方式:httpapi call和rpc
這是最常見的一種通訊方式,服務實現方案成熟可靠,具有服務邊際簡單清晰的特點,同時適用於外部和內部,但內部呼叫效能不夠好。
使用http api注意事項
訪問安全控制,使用ip限制,token校驗等
避免呼叫層次過深,超時機制
http client選擇(http client特別多,主要分為以下幾類)
薄荷目前typhoeus和faraday用的較多,原因是:typhoeus底層基於curl,效能比較好,並且支援並行,用非同步api的方式,比較可靠,不用擔心多執行緒問題。
主要特點:
長連線,避免每次通訊建立網路連線,效能較好
對http、訊息協議更高效
多種跨語言rpc方案,如thriftmsgpack_rpc
rpc管理
效能上有一定優勢,需要權衡其複雜度,複雜度在於服務實現方案和管理方法。
服務端併發模式
高可用方案,可用haproxy
平滑部署
rpc的用法比較少見,更多地用於跨多語言的團隊,當公司使用多種語言且需要很好地整合時,rpc則是一種比較成熟的方案。
三、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任務處理,以下是其核心**:
四、a服務發生某件事,通知b和c進行處理 訂閱和通知
應用場景:比如賬號基本資訊,基於效能考慮,在子系統中儲存了使用者名稱副本。當使用者名稱在賬戶子系統中發生變化時,需要通知其它子系統更新。
處理方式:訊息佇列
sidekiq-driver 是vincent正在寫的基於sidekiq輕量訂閱和通知解決方法的gem,大家可以盡情期待這個專案的開源。
【七牛彎區課堂】是七牛為廣大開發者提供的技術實踐分享課堂,後續將定期邀請各技術社群的專家進行分享。以上內容即是ruby china社群在「七牛彎區課堂」的**作。歡迎各技術社群的小夥伴來【七牛彎區課堂】分享實踐心得,也感謝各位為技術社群所貢獻的力量。
作業系統課堂筆記七
連續分配方式 1 單一連續分配 記憶體分為系統區和使用者區兩部分 系統區 僅提供給os使用,通常放在記憶體低址部分 使用者區 除系統區以外的全部記憶體空間,提供給使用者使用。最簡單的一種儲存管理方式,只能用於單使用者 單任務的作業系統中。優點 易於管理。缺點 對要求記憶體空間少的程式,造成記憶體浪費...
作業系統課堂筆記(七)
系統區 僅提供給os使用,通常放在記憶體低址部分 使用者區 除系統區以外的全部記憶體空間,提供給使用者使用。把記憶體分為一些大小相等或不等的分割槽 partition 每個應用程序占用乙個分割槽。作業系統占用其中乙個分割槽。提高 支援多個程式併發執行,適用於多道程式系統和分時系統。最早的多道程式儲存...
狗子課堂 七 linux 命令引數
用於在檔案樹中查詢檔案,並作出相應的處理。命令格式 find pathname options print exec ok 命令引數 pathname find命令所查詢的目錄路徑。例如用.來表示當前目錄,用 來表示系統根目錄。print find命令將匹配的檔案輸出到標準輸出。exec find命...