>  기사  >  Java  >  RPC 프레임워크의 자세한 예

RPC 프레임워크의 자세한 예

零下一度
零下一度원래의
2017-07-17 14:07:562256검색

1, 배경

인터넷의 발달과 함께 웹사이트 애플리케이션의 규모가 계속해서 확장되고 있으며, 기존의 수직적 애플리케이션 아키텍처는 더 이상 이에 대응할 수 없으며, 분산 서비스 아키텍처와 모바일 컴퓨팅 아키텍처가 필수적이며, 거버넌스가 시급히 필요합니다. 시스템은 아키텍처의 질서 있는 진화를 보장합니다

단일 애플리케이션 아키텍처

웹 사이트 트래픽이 매우 작을 때 배포 노드와 비용을 줄이기 위해 모든 기능을 함께 배포하는 데 하나의 애플리케이션만 필요합니다.

이때, 추가, 삭제, 수정, 확인 작업을 단순화하는 데이터 액세스 프레임워크(ORM)를 사용하는 것이 핵심입니다

수직적 애플리케이션 아키텍처

방문 횟수가 점차 증가할 때 , 단일 애플리케이션에 기계를 추가함으로써 가져오는 가속도는 점점 작아지고 효율성을 높이기 위해 애플리케이션은 서로 관련 없는 여러 애플리케이션으로 해체됩니다

이때 프런트 엔드 페이지를 가속화하는 데 사용되는 웹 프레임워크(MVC)가 있습니다. 개발이 핵심

분산 서비스 아키텍처

사업 분야별로 분할

RPC 남용을 중지하고, 수직적 사업 내에서 로컬 jar 호출에 우선 순위를 부여하고, 전체 사업장에서 RPC 호출만 사용하세요

올바른 식별 비즈니스 로직의 소유권, 각 모듈의 응집력 극대화, 성능, 가용성 및 유지 관리성 향상 커플 링 감소

각 릴리스마다 서버의 일부만 배포

각 노드는 다양한 요구 사항에 따라 확장 및 확장 가능 각 응용 프로그램의 업데이트, 배포 및 운영은 영향을받지 않습니다. 분리 분리

team 분리

다 분리 애플리케이션 간 상호작용은 불가피하며, 핵심 사업은 독립적인 서비스로 추출해 점차 안정적인 서비스 센터를 형성해 프론트엔드 애플리케이션이 변화하는 시장 수요에 더욱 빠르게 대응할 수 있도록

이때 분산형 애플리케이션은 비즈니스 재사용 및 통합을 향상시키는 데 사용되는 서비스 프레임워크(RPC)가 핵심입니다

분산 서비스 RPC 프레임워크

플로우 컴퓨팅 아키텍처

서비스가 점점 더 많아지면 이러한 문제가 발생합니다. 용량 평가 및 소규모 서비스 자원의 낭비가 점차 나타나기 때문에 접속 압박에 따라 클러스터 용량을 실시간으로 관리하기 위해 파견 센터를 추가해야 하며, 클러스터 활용도를 향상시켜야 합니다


머신 활용도를 향상시키는 데 사용되는 리소스 스케줄링 및 거버넌스 센터(SOA)가 핵심입니다

Netty 스레드 모델


Netty의 스레드 모델은 주로 React를 기반으로 합니다. 애플리케이션을 고려하면 다양한 시나리오로 인해 여러 버전이 발생하기 때문입니다.

싱글 스레드 모드즉, 서비스 요청 수신과 IO 작업 수행이 모두 하나의 스레드로 완료됩니다. IO 다중화와 같은 비차단 IO 작업을 사용하므로 요청 볼륨이 없을 때 단일 스레드 모드가 사용됩니다. 또한 일부 장면 문제를 해결할 수도 있습니다.

단일 수신 다중 작업자 스레드 모드

요청 수가 증가하면 모든 IO 작업을 처리하는 원래 하나의 스레드가 점점 해당 성능 지표를 지원할 수 없게 되므로 작업자 스레드 풀의 개념이 언급됩니다. 이때 서비스 요청을 받는 것은 여전히 ​​스레드입니다. 요청을 받은 후 요청을 받는 스레드는 후속 작업자 스레드 풀에 위임되고 스레드 풀에서 스레드를 가져와 사용자 요청을 실행합니다.

다중 수신 및 다중 작업자 스레드 모드

요청량이 더 많아지면 서비스 요청을 받는 단일 스레드가 모든 클라이언트 연결을 처리할 수 없으므로 서비스 요청을 받는 스레드도 스레드 풀로 확장됩니다. , 여러 개로 구성됨 스레드는 클라이언트 연결 수신도 담당합니다.

RPC Business Threads

위에 언급된 내용은 요청량 증가에 따라 지속적으로 개발되어 온 Netty 자체 스레딩 모델, 최적화 전략입니다. 애플리케이션 시스템의 경우 RPC 요청은 주로 비즈니스 로직 처리에 관한 것이며 이러한 유형의 비즈니스는 계산 집약적이거나 IO 집약적일 수 있습니다. 예를 들어 대부분의 애플리케이션에는 데이터베이스 작업, Redis 또는 기타 네트워크 서비스 등이 수반됩니다. 비즈니스 요청에 이렇게 시간이 많이 걸리는 IO 작업이 있는 경우 비즈니스 요청을 처리하는 작업을 독립적인 스레드 풀에 할당하는 것이 좋습니다. 그렇지 않으면 netty 자체 스레드가 차단될 수 있습니다.

수신 요청 스레드와 작업 스레드 간의 업무 분담

  • 수신 요청 스레드는 주로 링크 생성을 담당하고 요청을 작업 스레드에 위임합니다.

  • 작업 스레드가 담당합니다. 인코딩, 디코딩, IO 읽기 및 기타 작업

솔루션 구현

현재 구현한 RPC는 다중 수신자 다중 작업자 스레드 모드를 사용합니다. 포트는 다음과 같이 서버 측에 바인딩됩니다.

boosGroup은 서비스 요청을 받는 데 사용되는 그룹입니다.
workerGroup은 IO 작업을 특별히 담당하는 그룹입니다.

비즈니스 스레드를 추가하려면 스레드 풀에 핸들 작업을 추가로 위임하면 됩니다. 확장을 위해서는 인터페이스가 필요합니다.

스레드 풀 인터페이스 정의

public void bind(ServiceConfig serviceConfig) {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(this.rpcServerInitializer)
                    .childOption(ChannelOption.SO_KEEPALIVE,true)
            ;try {ChannelFuture channelFuture = bootstrap.bind(serviceConfig.getHost(),serviceConfig.getPort()).sync();//...channelFuture.channel().closeFuture().sync();


            } catch (InterruptedException e) {throw new RpcException(e);
            }
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

고정 크기 스레드 풀 구현

참조 Dubbo 스레드 풀

public interface RpcThreadPool {Executor getExecutor(int threadSize,int queues);
}

Interlude:
친구가 갑자기 coreSize가 무엇인지 물었던 기억이 납니다. Java 스레드 풀에서 의미하는 것은 무엇입니까? 평소에 멀티스레딩을 잘 쓰지 않아서 갑자기 쇼트가 났습니다. 평소에 많이 사용하는 데이터베이스 스레드 풀을 생각하면 그 안에 들어있는 매개변수가 꽤 인상적인데 기억이 나지 않을 뿐입니다. 코어 크기. 나중에 스레드 풀의 일부 매개변수를 자세히 살펴보았습니다. 이제 이 기회를 통해 다시 단락되는 것을 방지하기 위해 자세히 살펴볼 수 있습니다.

Thread Pool Factory

여러 스레드 풀 구현이 있는 경우 스레드 풀 이름을 통해 스레드 풀이 동적으로 선택됩니다.

@Qualifier("fixedRpcThreadPool")@Componentpublic class FixedRpcThreadPool implements RpcThreadPool {private Executor executor;@Overridepublic Executor getExecutor(int threadSize,int queues) {if(null==executor) {synchronized (this) {if(null==executor) {
                    executor= new ThreadPoolExecutor(threadSize, threadSize, 0L, TimeUnit.MILLISECONDS,
                            queues == 0 ? new SynchronousQueue<Runnable>() :(queues < 0 ? new LinkedBlockingQueue<Runnable>(): new LinkedBlockingQueue<Runnable>(queues)),new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {                                   //...}
                            });
                }
            }
        }return executor;
    }
}

ChannelHandle

메서드 본문을 Task로 래핑하고 실행을 위해 스레드 풀에 넘겨줍니다.

@Componentpublic class RpcThreadPoolFactory {@Autowiredprivate Map<String,RpcThreadPool> rpcThreadPoolMap;public RpcThreadPool getThreadPool(String threadPoolName){return this.rpcThreadPoolMap.get(threadPoolName);
    }
}

Question

현재 스트레스 테스트가 부족하여 아직 명확한 데이터 비교가 없습니다.

위 내용은 RPC 프레임워크의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.