從Akka出現背景來說,它是基於Actor的RPC通信系統,它的核心概念也是Message,它是基於協程的,性能不容置疑;基於scala的偏函數,易用性也沒有話說,但是它畢竟只是RPC通信,無法適用大的package/stream的數據傳輸,這也是Spark早期引入Netty的原因。
那么Netty為什么可以取代Akka?首先不容置疑的是Akka可以做到的,Netty也可以做到,但是Netty可以做到,Akka卻無法做到,原因是啥?在軟件棧中,Akka相比Netty要Higher一點,它專門針對RPC做了很多事情,而Netty相比更加基礎一點,可以為不同的應用層通信協議(RPC,FTP,HTTP等)提供支持,在早期的Akka版本,底層的NIO通信就是用的Netty;其次一個優雅的工程師是不會允許一個系統中容納兩套通信框架,惡心!最后,雖然Netty沒有Akka協程級的性能優勢,但是Netty內部高效的Reactor線程模型,無鎖化的串行設計,高效的序列化,零拷貝,內存池等特性也保證了Netty不會存在性能問題。
Spark基於這個思想在上述的Network的基礎上實現一套自己的RPC Actor模型,從而取代Akka。其中RpcEndpoint對於Actor,RpcEndpointRef對應ActorRef,RpcEnv即對應了ActorSystem。
RpcEnv相對於ActorSystem:
- 首先它作為一個Server,它通過NettyRpcHandler來提供了Server的服務能力,
- 其次它作為RpcEndpoint的容器,它提供了setupEndpoint(name,endpoint)接口,從而實現將一個RpcEndpoint以一個Name對應關系注冊到容器中,從而通過Server對外提供Service
- 最后它作為Client的適配器,它提供了setupEndpointRef/setupEndpointRefByURI接口,通過指定Server端的Host和PORT,並指定RpcEndpointName,從而獲取一個與指定Endpoint通信的引用。
RpcEndpointRef即為與相應Endpoint通信的引用,它對外暴露了send/ask等接口,實現將一個Message發送到Endpoint中。