Netty 스레딩 모델의 자세한 예
Netty 스레딩 모델
Netty의 스레딩 모델은 주로 React를 기반으로 하며 다양한 애플리케이션 시나리오로 인해 여러 버전으로 발전했습니다.
싱글 스레드 모드
즉, 서비스 요청 수신과 IO 작업 수행이 모두 하나의 스레드로 완료됩니다. IO 다중화와 같은 비차단 IO 작업을 사용하므로 요청 볼륨이 없을 때 단일 스레드 모드가 사용됩니다. 또한 일부 장면 문제를 해결할 수도 있습니다.
단일 수신 다중 작업자 스레드 모드
요청 수가 증가하면 모든 IO 작업을 처리하는 원래 하나의 스레드가 점점 해당 성능 지표를 지원할 수 없게 되므로 작업자 스레드 풀의 개념이 언급됩니다. 이때 서비스 요청을 받는 것은 여전히 스레드입니다. 요청을 받은 후 요청을 받는 스레드는 후속 작업자 스레드 풀에 위임되고 스레드 풀에서 스레드를 가져와 사용자 요청을 실행합니다.
다중 수신 및 다중 작업자 스레드 모드
요청량이 더 많아지면 서비스 요청을 받는 단일 스레드가 모든 클라이언트 연결을 처리할 수 없으므로 서비스 요청을 받는 스레드도 스레드 풀로 확장됩니다. , 여러 개로 구성됨 스레드는 클라이언트 연결 수신도 담당합니다.
RPC Business Threads
위에 언급된 내용은 요청량 증가에 따라 지속적으로 개발되어 온 Netty 자체 스레딩 모델, 최적화 전략입니다. 애플리케이션 시스템의 경우 RPC 요청은 주로 비즈니스 로직 처리에 관한 것이며 이러한 유형의 비즈니스는 계산 집약적이거나 IO 집약적일 수 있습니다. 예를 들어 대부분의 애플리케이션에는 데이터베이스 작업, Redis 또는 기타 네트워크 서비스 등이 수반됩니다. 비즈니스 요청에 이렇게 시간이 많이 걸리는 IO 작업이 있는 경우 비즈니스 요청을 처리하는 작업을 독립적인 스레드 풀에 할당하는 것이 좋습니다. 그렇지 않으면 netty 자체 스레드가 차단될 수 있습니다.
요청-수신 스레드와 작업 스레드 간의 작업 분담
수신-요청 스레드는 주로 링크를 생성한 다음 요청을 작업 스레드에 위임하는 역할을 담당합니다
-
작업 스레드는 인코딩, 디코딩, IO 읽기 및 기타 작업을 담당합니다.
솔루션 구현
제가 현재 구현하고 있는 RPC는 서버 측에서 다중 수신자 다중 작업자 스레드 모드를 채택하고 있습니다. :
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(); } }
boosGroup은 서비스 요청을 받는 데 사용되는 그룹
workerGroup은 IO 작업을 특별히 담당하는 그룹입니다.
비즈니스 스레드를 추가하려면 스레드 풀에 핸들 작업을 추가로 위임하면 됩니다. . 확장하려면 여기에서 인터페이스를 정의해야 합니다.
스레드 풀 인터페이스 정의
public interface RpcThreadPool {Executor getExecutor(int threadSize,int queues); }
고정 크기 스레드 풀 구현
dubbo 스레드 풀 참조
@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; } }
간간:
기억합니다. 친구가 갑자기 Java 스레드 풀의 coreSize가 무엇을 의미하는지 물었을 때? 평소에 멀티스레딩을 잘 쓰지 않아서 갑자기 쇼트가 났습니다. 평소에 많이 사용하는 데이터베이스 스레드 풀을 생각하면 그 안에 들어있는 매개변수가 꽤 인상적인데 기억이 나지 않을 뿐입니다. 코어 크기. 나중에 스레드 풀의 일부 매개변수를 자세히 살펴보았습니다. 이제 이 기회를 통해 다시 단락되는 것을 방지하기 위해 자세히 살펴볼 수 있습니다.
Thread Pool Factory
여러 스레드 풀 구현이 있는 경우 스레드 풀 이름을 통해 스레드 풀이 동적으로 선택됩니다.
@Componentpublic class RpcThreadPoolFactory {@Autowiredprivate Map<String,RpcThreadPool> rpcThreadPoolMap;public RpcThreadPool getThreadPool(String threadPoolName){return this.rpcThreadPoolMap.get(threadPoolName); } }
ChannelHandle
메서드 본문을 Task로 래핑하고 실행을 위해 스레드 풀에 넘겨줍니다.
@Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, RpcRequest rpcRequest) {this.executor.execute(new Runnable() {@Overridepublic void run() {RpcInvoker rpcInvoker=RpcServerInvoker.this.buildInvokerChain(RpcServerInvoker.this);RpcResponse response=(RpcResponse) rpcInvoker.invoke(RpcServerInvoker.this.buildRpcInvocation(rpcRequest)); channelHandlerContext.writeAndFlush(response); } }); }
Question
현재 스트레스 테스트가 부족하여 아직 명확한 데이터 비교가 없습니다.
위 내용은 Netty 스레딩 모델의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 프레임워크에 대한 상용 지원의 비용/성능 평가에는 다음 단계가 포함됩니다. 필요한 보증 수준과 SLA(서비스 수준 계약) 보장을 결정합니다. 연구지원팀의 경험과 전문성. 업그레이드, 문제 해결, 성능 최적화와 같은 추가 서비스를 고려하십시오. 위험 완화 및 효율성 향상을 기준으로 비즈니스 지원 비용을 평가합니다.

경량 PHP 프레임워크는 작은 크기와 낮은 리소스 소비를 통해 애플리케이션 성능을 향상시킵니다. 그 특징은 다음과 같습니다: 작은 크기, 빠른 시작, 낮은 메모리 사용량, 향상된 응답 속도 및 처리량, 리소스 소비 감소 실제 사례: SlimFramework는 500KB에 불과한 REST API를 생성하며 높은 응답성과 높은 처리량을 제공합니다.

PHP 프레임워크의 학습 곡선은 언어 숙련도, 프레임워크 복잡성, 문서 품질 및 커뮤니티 지원에 따라 달라집니다. PHP 프레임워크의 학습 곡선은 Python 프레임워크에 비해 높고 Ruby 프레임워크에 비해 낮습니다. Java 프레임워크에 비해 PHP 프레임워크는 학습 곡선이 적당하지만 시작하는 데 걸리는 시간이 더 짧습니다.

벤치마크에 따르면 소규모 고성능 애플리케이션의 경우 Quarkus(빠른 시작, 낮은 메모리) 또는 Micronaut(TechEmpower 우수)가 이상적인 선택입니다. SpringBoot는 대규모 풀 스택 애플리케이션에 적합하지만 시작 시간과 메모리 사용량이 약간 느립니다.

Golang 프레임워크에서는 명확하고 포괄적인 문서를 작성하는 것이 중요합니다. 모범 사례에는 Google의 Go 코딩 스타일 가이드와 같은 확립된 문서 스타일을 따르는 것이 포함됩니다. 제목, 부제, 목록 등 명확한 조직 구조를 사용하고 탐색 기능을 제공하세요. 시작 안내서, API 참조 및 개념을 포함하여 포괄적이고 정확한 정보를 제공합니다. 코드 예제를 사용하여 개념과 사용법을 설명합니다. 문서를 계속 업데이트하고, 변경 사항을 추적하고, 새로운 기능을 문서화하세요. GitHub 문제 및 포럼과 같은 지원 및 커뮤니티 리소스를 제공합니다. API 문서와 같은 실용적인 예제를 만듭니다.

애플리케이션 시나리오를 기반으로 최고의 Go 프레임워크를 선택하세요. 애플리케이션 유형, 언어 기능, 성능 요구 사항 및 생태계를 고려하세요. Common Go 프레임워크: Gin(웹 애플리케이션), Echo(웹 서비스), Fiber(높은 처리량), gorm(ORM), fasthttp(속도). 실제 사례: REST API(Fiber) 구축 및 데이터베이스(gorm)와 상호 작용. 프레임워크를 선택하세요. 주요 성능을 위해서는 fasthttp를 선택하고, 유연한 웹 애플리케이션을 위해서는 Gin/Echo를, 데이터베이스 상호작용을 위해서는 gorm을 선택하세요.

Go 프레임워크 학습에는 다섯 가지 오해가 있습니다. 프레임워크에 대한 과도한 의존과 제한된 유연성입니다. 프레임워크 규칙을 따르지 않으면 코드를 유지 관리하기가 어려워집니다. 오래된 라이브러리를 사용하면 보안 및 호환성 문제가 발생할 수 있습니다. 패키지를 과도하게 사용하면 코드 구조가 난독화됩니다. 오류 처리를 무시하면 예기치 않은 동작과 충돌이 발생합니다.

다양한 분야에 대한 Java 프레임워크 학습 로드맵: 웹 개발: SpringBoot 및 PlayFramework. 지속성 계층: Hibernate 및 JPA. 서버 측 반응형 프로그래밍: ReactorCore 및 SpringWebFlux. 실시간 컴퓨팅: ApacheStorm 및 ApacheSpark. 클라우드 컴퓨팅: Java용 AWS SDK 및 Google Cloud Java.
