最近看到兩條關於35歲程式設計師的訊息,挺有意思的
對於程式設計師來講,中年危機是一個永遠都不能避開的話題。
其實解決方法也很簡單:建議35歲退休!
哈哈,開個玩笑。
雖然這是評論區一個抖機靈的回答,但也是一條可以努力奮鬥的路徑。
尤其是這幾年做公眾號之後,認識了很多自由職業者,其中不乏一些超級個體,他們根本就沒有中年危機。
因為他們早就脫離了打工人的生活,自己為自己工作。
應對中年危機的建議
提升技能 :不斷學習新技能和知識,特別是那些能夠幫助你在職業生涯中取得突破的技能。
在主業上一定不能懈怠,對程式設計師來講,最容易賺錢的方式就是上班。
保持對工作的熱情和動力,透過調整工作狀態、尋找新的工作挑戰等方式,克服職業倦怠。
最佳化收入結構 :努力提高專業技能和綜合素質,提高收入水平。
如果主業穩定了,並且很難再獲得提升,那就要考慮建立第二收入來源。
關註多元化收入來源,如兼職、投資等。
8小時內謀生存,8小時外謀發展,對於普通人來講,唯一的機會就是多嘗試,多試錯。
拓展人際關系 :建立廣泛的職業網路,不僅可以提供新的工作機會,還能讓你獲得更多的資訊差。
如果30歲之後,你還只能透過在招聘網站投簡歷找工作,那真的挺慘的。
你的前同事,你的朋友,居然沒人內推你?
程式設計師也不能只埋頭搞技術。
以上都是開源的建議,接下來輪到節流了。
控制支出,合理消費 :樹立正確的消費觀念,合理規劃消費,避免不必要的浪費。
建立緊急儲備基金 :設立應急基金,以備不時之需,來應對緊急支出或收入下降的情況。
如果以上你能做的事情都做了,大機率面對中年危機時能更從容。
剩下的也就只有 保持積極心態 了,不焦慮,就已經超過絕大多數人了。
--------------------下面是今天的面試題 --------------------
面試題:說說你對RPC框架的理解?
RPC (Remote Procedure Call)即遠端程序呼叫,是分布式系統常見的一種通訊方法。它允許程式呼叫另一個地址空間(通常是共享網路的另一台機器上)的過程或函式,而不用程式設計師顯式編碼這個遠端呼叫的細節。
除 RPC 之外,常見的多系統數據互動方案還有分布式訊息佇列、HTTP 請求呼叫、資料庫和分布式緩存等。
其中 RPC 和 HTTP 呼叫是沒有經過中介軟體的,它們是端到端系統的直接數據互動。
通俗點說
RPC就是從一台機器(客戶端)上透過參數傳遞的方式呼叫另一台機器(伺服器)上的一個函式或方法(可以統稱為服務)並得到返回的結果。
RPC會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)。
客戶端發起請求,伺服器返回響應(類似於Http的工作方式)RPC在使用形式上像呼叫本地函式(或方法)一樣去呼叫遠端的函式(或方法)。
追問1:RPC框架實作原理是什麽樣的
在RPC框架中主要有三個角色:提供者、消費者和註冊中心。如下圖所示:
提供者: 暴露服務的服務提供方。
提供者: 呼叫遠端服務的服務消費方。
註冊中心: 服務註冊與發現的註冊中心。
原理圖如上,也就是說兩台伺服器A,B,一個套用部署在A伺服器上,想要呼叫B伺服器上套用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要透過網路來表達呼叫的語意和傳達呼叫的數據。
比如說,A伺服器想呼叫B伺服器上的一個方法:Employee getEmployeeByName(String fullName)
RPC整個呼叫過程,主要經歷如下幾個步驟:
1、建立通訊
首先要解決通訊的問題:即A機器想要呼叫B機器,首先得建立起通訊連線。
主要是透過在客戶端和伺服器之間建立TCP連線,遠端程序呼叫的所有交換的數據都在這個連線裏傳輸。連線可以是按需連線,呼叫結束後就斷掉,也可以是長連線,多個遠端程序呼叫共享同一個連線。
2、服務尋址
要解決尋址的問題,也就是說,A伺服器上的套用怎麽告訴底層的RPC框架,如何連線到B伺服器(如主機或IP地址)以及特定的埠,方法的名稱名稱是什麽。
通常情況下我們需要提供B機器(主機名或IP地址)以及特定的埠,然後指定呼叫的方法或者函式的名稱以及入參出參等資訊,這樣才能完成服務的一個呼叫。
可靠的尋址方式(主要是提供服務的發現)是RPC的實作基石,比如可以采用redis或者zookeeper來註冊服務等等。
從服務提供者的角度看:當提供者服務啟動時,需要自動向註冊中心註冊服務;
當提供者服務停止時,需要向註冊中心登出服務;
提供者需要定時向註冊中心發送心跳,一段時間未收到來自提供者的心跳後,認為提供者已經停止服務,從註冊中心上摘取掉對應的服務。
從呼叫者的角度看:呼叫者啟動時訂閱註冊中心的訊息並從註冊中心獲取提供者的地址;
當有提供者上線或者下線時,註冊中心會告知到呼叫者;
呼叫者下線時,取消訂閱。
3、網路傳輸
序列化
當A機器上的套用發起一個RPC呼叫時,呼叫方法和其入參等資訊需要透過底層的網路協定如TCP傳輸到B機器,由於網路協定是基於二進制的,所有我們傳輸的參數數據都需要先進行序列化( Serialize )或者編組(marshal)成二進制的形式才能在網路中進行傳輸。然後透過尋址操作和網路傳輸將序列化或者編組之後的二進制數據發送給B機器。
反序列化
當B機器接收到A機器的套用發來的請求之後,又需要對接收到的參數等資訊進行反序列化操作(序列化的逆操作),即將二進制資訊恢復為記憶體中的表達方式,然後再找到對應的方法(尋址的一部份)進行本地呼叫(一般是透過生成代理Proxy去呼叫,
通常會有JDK動態代理、CGLIB動態代理、Javassist生成字節碼技術等),之後得到呼叫的返回值。
4、服務呼叫
B機器進行本地呼叫(透過代理Proxy)之後得到了返回值,此時還需要再把返回值發送回A機器,同樣也需要經過序列化操作,然後再經過網路傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值之後,則再次進行反序列化操作,恢復為記憶體中的表達方式,最後再交給A機器上的套用進行相關處理(一般是業務邏輯處理操作)。
·END·
IT交流群
組建了程式設計師,架構師,IT從業者交流群,以
交流技術
、
職位內推
、
行業探討
為主
加小編 好友 ,備註"加群"