Spark 와 관련 된 디자인 모델 - 창설 형 - 공장 방법 모델
글 목록
공장 방법 모델 에 대해 말하자면 간단 한 공장 모델 (정적 방법 모델) 이 라 고 할 수 밖 에 없다. 간단 한 공장 모델 은 바로 그의 행위 가 매우 간단 하 다. 즉, 하나의 인 터 페 이 스 를 정의 하여 대상 을 만 드 는 것 이다.그러나 공장 류 를 만 들 때 클 라 이언 트 를 통 해 어떤 공장 을 만 들 지 결정 한다.이렇게 공장 하 나 를 추가 해 야 한다 면 이 공장 류 를 바 꿔 야 한다.이렇게 하면 개폐 원칙 에 위배 된다.한편, 공장 방법 모델 은 통 하지 않 는 다. 그 는 클 라 이언 트 를 통 해 어느 공장 을 실례 화하 여 결정 한 것 이다. 이렇게 수정 해 야 할 것 은 클 라 이언 트 와 새로운 공장 류 를 추가 하 는 것 이다.
여 기 는 저희 가 RPC 를 참고 로...
공장 인터페이스
공장 방법 모델 은 반드시 한 공장 의 인 터 페 이 스 를 계승 해 야 한다. SparkRPC 의 공장 방법 에서 도 예외 가 없 을 것 이다. 물론 이곳 의 인 터 페 이 스 는 특질 이 고 특질 과 유형 이 다 르 면 한 개의 서브 클래스 에 여러 개의 특질 을 섞 을 수 있다.
/**
* A factory class to create the [[RpcEnv]]. It must have an empty constructor so that it can be
* created using Reflection.
*/
private[spark] trait RpcEnvFactory {
def create(config: RpcEnvConfig): RpcEnv
}
공장 실현
이 특질 을 계승 하 는 유형 은
NettyRpcEnvFactory
, 즉 RpcEnvFactory
한 공장 만 이 실현 되 었 다.private[rpc] class NettyRpcEnvFactory extends RpcEnvFactory with Logging {
def create(config: RpcEnvConfig): RpcEnv = {
val sparkConf = config.conf
// Use JavaSerializerInstance in multiple threads is safe. However, if we plan to support
// KryoSerializer in future, we have to use ThreadLocal to store SerializerInstance
val javaSerializerInstance =
new JavaSerializer(sparkConf).newInstance().asInstanceOf[JavaSerializerInstance]
val nettyEnv =
new NettyRpcEnv(sparkConf, javaSerializerInstance, config.advertiseAddress,
config.securityManager, config.numUsableCores)
if (!config.clientMode) {
val startNettyRpcEnv: Int => (NettyRpcEnv, Int) = { actualPort =>
nettyEnv.startServer(config.bindAddress, actualPort)
(nettyEnv, nettyEnv.address.port)
}
try {
Utils.startServiceOnPort(config.port, startNettyRpcEnv, sparkConf, config.name)._1
} catch {
case NonFatal(e) =>
nettyEnv.shutdown()
throw e
}
}
nettyEnv
}
}
클 라 이언 트
공장 이 생 긴 후에 공장 을 바 꾸 는 유형, 즉 클 라 이언 트 를 사용 하면 RpcEnv 제품 을 편리 하 게 예화 할 수 있다.구체 적 인 클 라 이언 트 코드 를 살 펴 보 겠 습 니 다.마지막 코드
new NettyRpcEnvFactory().create(config)
입 니 다. 여 기 는 RpcEnv 의 Rpc 통신 환경 을 만 들 었 습 니 다.private[spark] object RpcEnv {
def create(
name: String,
host: String,
port: Int,
conf: SparkConf,
securityManager: SecurityManager,
clientMode: Boolean = false): RpcEnv = {
create(name, host, host, port, conf, securityManager, 0, clientMode)
}
def create(
name: String,
bindAddress: String,
advertiseAddress: String,
port: Int,
conf: SparkConf,
securityManager: SecurityManager,
numUsableCores: Int,
clientMode: Boolean): RpcEnv = {
val config = RpcEnvConfig(conf, name, bindAddress, advertiseAddress, port, securityManager,
numUsableCores, clientMode)
new NettyRpcEnvFactory().create(config)
}
}
왜 추상 적 인 공장 모델 을 쓰 지 않 습 니까?
그러면 여기 서 왜 추상 적 인 공장 모델 이 아니 라 공장 방법 모델 을 사 용 했 는 지 생각해 보 세 요.
추상 적 인 공장 모델 이 지원 하 는 장면 이 다 르 기 때문이다.
추상 적 인 공장 모델 의 형성 은 공장 방법 모델 에서 모든 공장 이 하나의 제품 만 생산 하 는 것 을 해결 하 는 것 이다. 만약 에 두 개의 제품 이 혼합 되 어야 하 는 제품 이 존재 한다 면 공장 을 다시 만들어 야 한다. 이렇게 해서 발생 하 는 공장 류 의 복잡 한 문 제 를 다시 만들어 야 한다.하지만 이 경우 다른 제품 은 필요 없습니다.SparkRpc 가 Akka 에서 Netty 로 이전 할 때 도 제품 통합 보 다 는 새로운 실현 공장 을 만들어 야 합 니 다.
공장 을 다시 세 워 야 합 니 다.하지만 이 경우 다른 제품 은 필요 없습니다.SparkRpc 가 Akka 에서 Netty 로 이전 할 때 도 제품 통합 보 다 는 새로운 실현 공장 을 만들어 야 합 니 다.
이 장면 에서 NettyRpcEnv 의 직책 은 RpcEnv 만 생산 하 는 것 이 고 Spark 구조 에서 우리 가 필요 로 하 는 것 은 RpcEnv 라 는 제품 일 뿐 다른 Rpc 제품 이 필요 하지 않 습 니 다.