RPC和RabbitMQ

在單臺機器或者單個進程中,若是要調用某個函數,只須要經過函數指針,傳入相關參數,便可調用成功並得到結果。但若是是在分佈式系統中,某個進程想要調用遠程機器上的其它進程提供的方法(服務),就須要採用RPC的方式了。網絡

那麼Client端發出方法調用,如何才能讓Server端知道究竟是調用的哪一個方法,參數是如何跨機器傳輸的呢?這裏有三點很是重要:Call ID映射,序列化,網絡傳輸。Call ID的思想是,讓Client端和Server端分別維持同一個Map,該Map保存着函數和ID的映射關係, 當Client 端須要調用遠程方法時,就查一下這個表,找出相應的Call ID,而後把它傳給Server端,Server端也經過查表,來肯定Client須要調用的函數,而後執行相應的函數。而參數傳遞須要經過網絡(TCP),以二進制流的形式傳輸到服務端,服務端接受以後將其反序列化成本身能讀取的格式,當函數執行完成以後,生成的結果又會序列化成二進制流,傳遞給Client端供反序列化。分佈式

 

RPC也能夠經過RabbitMQ消息中間件實現:Client端發送消息到RabbitMQ中,該消息包含了body(函數參數),reply_to(Server端處理完消息後,將生成的結果發送到RabbitMQ的reply_to隊列中),correlation_id(如何才能知道Result屬於哪個Client呢?經過該ID進行match),routing_key(指明該消息發送到哪一個Topic隊列中,即到底調用哪一個遠程函數);Server端訂閱該Topic,當該Topic隊列中有消息時,就當即處理(經過回調函數,調用指定的某個方法,並將生成的結果發送回reply_to隊列)。函數

相關文章
相關標籤/搜索