문제

둘 다 거의 동일한 기능을 제공합니다.고성능 TCP 서버를 개발하려면 어떤 것을 선택해야 합니까?장점과 단점은 무엇입니까?

참조 링크:

아파치 미나 (원천)

네티 (원천)

도움이 되었습니까?

해결책

Mina와 Netty는 비슷한 야망을 가지고 있지만 실제로는 상당히 다르며 선택을 신중하게 고려해야합니다. 우리는 Mina와의 많은 경험을 가지고 있었고 Netty와 함께 놀 수있는 시간을 가졌다는 점에서 운이 좋았습니다. 우리는 특히 Cleaner API와 훨씬 더 나은 문서를 좋아했습니다. 종이에서도 성능이 더 좋아 보였다. 더 중요한 것은 우리는 Trustin Lee가 우리가 가진 모든 질문에 대답 할 것이라는 것을 알고 있었고, 그는 확실히 그렇게했습니다.

우리는 Netty에서 모든 것을 더 쉽게 발견했습니다. 기간. 우리가 이미 Mina에서 가지고있는 것과 동일한 기능을 상환하려고 노력하는 동안, 우리는 처음부터 그렇게했습니다. 훌륭한 문서와 예제를 따르면 우리는 훨씬 더 많은 기능을 훨씬 적은 코드로 만들었습니다.

Netty Pipeline은 우리에게 더 잘 작동했습니다. 모든 것이 핸들러 인 Minas보다 간단하며 업스트림 이벤트, 다운 스트림 이벤트 또는 더 낮은 수준의 물건을 소비할지 여부를 결정하는 것은 귀하에게 달려 있습니다. "재생"디코더의 바이트는 거의 즐거웠습니다. 또한 파이프 라인을 날아가는 파이프 라인을 쉽게 재구성 할 수있어서 매우 좋았습니다.

그러나 IMHO 인 Netty의 별 명소는 "하나의 범위"를 가진 파이프 라인 핸들러를 만들 수있는 능력입니다. 당신은 아마도 문서에 이미이 적용 범위 주석에 대해 읽었을 것입니다. 그러나 본질적으로 그것은 단일 한 줄의 코드로 상태를 제공합니다. 주위에 엉망이없고 세션 맵, 동기화 및 그와 같은 것들이 없기 때문에 단순히 일반 변수 (예 : "사용자 이름")를 선언하고 사용할 수있었습니다.

그러나 우리는로드 블록을 쳤다. 우리는 이미 MINA에 따라 멀티 프로토콜 서버를 가지고 있었는데, 여기서 응용 프로그램 프로토콜은 TCP/IP, HTTP 및 UDP를 통해 실행되었습니다. Netty로 전환했을 때 몇 분 안에 SSL과 HTTPS를 목록에 추가했습니다! 지금까지 너무 좋았지 만 UDP에 왔을 때 우리는 우리가 미끄러 져 있다는 것을 깨달았습니다. Mina는 UDP를 "연결된"프로토콜로 취급 할 수 있다는 점에서 우리에게 매우 좋았습니다. Netty에는 그러한 추상화가 없습니다. UDP는 연결이없고 Netty는 그것을 그렇게 취급합니다. Netty는 UDP의 연결이없는 특성을 Mina보다 낮은 수준으로 노출시킵니다. Netty 아래 UDP로 할 수있는 일이 있습니다. Mina가 제공하는 상위 수준의 추상화에서 우리가 의존했던 것보다.

"연결된 UDP"래퍼를 추가하는 것은 그리 간단하지 않습니다. 시간 제약과 Trustin의 조언을 감안할 때 가장 좋은 방법은 Netty에서 자체 운송 제공 업체를 구현하는 것이 었습니다. 이는 빠르지 않을 것입니다. 결국 Netty를 포기해야했습니다.

따라서, 그들 사이의 차이점을 열심히 살펴보고 예상대로 까다로운 기능을 테스트 할 수있는 단계에 빠지게됩니다. Netty가 일을 할 것이라고 만족한다면 Mina를 통해 주저하지 않을 것입니다. Mina에서 Netty로 이동하는 경우 동일하게 적용되지만 두 API가 실제로 크게 다르며 Netty에 대한 가상 재 작성을 고려해야한다는 점에 주목할 가치가 있습니다. 후회하지 않을 것입니다!

다른 팁

Mina는 복잡성과 상대적으로 성능 저하 비용으로 더 많은 박스 기능을 가지고 있습니다. 이러한 기능 중 일부는 사용자가 필요하지 않은 경우에도 코어에 너무 단단히 통합되었습니다. Netty에서는 미나의 알려진 강점을 유지하면서 그러한 디자인 문제를 해결하려고 노력했습니다.

현재 MINA에서 사용할 수있는 대부분의 기능은 Netty에서도 제공됩니다. 제 생각에 Netty는 Netty가 Mina를 처음부터 처음부터 재건하고 알려진 문제를 해결하려고 시도한 결과이기 때문에 더 깨끗하고 문서화 된 API를 보유하고 있습니다. 필수 기능이 누락 된 경우 제안을 포럼에 게시하십시오. 나는 당신의 우려를 해결하게되어 기쁩니다.

Netty가 개발주기가 빠른다는 점에 유의해야합니다. 간단히 말해서 최근 릴리스의 출시 날짜를 확인하십시오. 또한 MINA 팀이 MINA 3의 주요 재 작성으로 진행할 것이라는 점을 고려해야합니다. 즉, API 호환성을 완전히 파괴합니다.

I Performance는 Netty (Netty-Protobuf-RPC)와 다른 하나는 Mina (Protobuf-Mina-RPC)를 기반으로 한 2 "Google Protobuffer RPC"구현을 테스트했습니다. Netty는 모든 메시지 크기에 대해 일관되게 더 빠르게 ( +-10%) Netty 웹 사이트의 전체 성능 주장을 백업했습니다. 그러한 RPC 라이브러리를 사용할 때 코드에서 모든 효율성을 짜내고 싶기 때문에 결국 글을 썼습니다. Protobuf-RPC-Pro Netty를 기반으로합니다. 나는 과거에 Mina를 사용했지만 2.0 물건에 대한 문서에는 큰 구멍이 있으며 API의 뒤로 호환성이 큰 마이너스를 발견했습니다.

Mina와 Netty는 처음에 같은 저자가 설계하고 구축했습니다. 그렇기 때문에 그들은 서로 매우 비슷합니다. Mina는 약간 더 높은 기능으로 약간 더 높은 수준으로 설계되었지만 Netty는 조금 더 빠릅니다. 나는 전혀 차이가 크지 않다고 생각합니다. 기본 개념은 동일합니다.

Netty 사이트에서는 성능을 찾을 수 있습니다 보고서. 예상대로 :-) 그들은 Netty를 최고의 성능을 가진 프레임 워크로 지적합니다.

Netty를 사용한 적이 없지만 이미 Mina를 사용하여 TCP 프로토콜을 구현했습니다. 인코딩 및 디코딩의 구현은 쉬웠지만 상태 기계의 구현은 쉽지 않았습니다. Mina는 State Machine을 구현할 때 도움이되는 클래스를 제공하지만 사용하기가 어렵다는 것을 알았습니다. 결국 우리는 미나를 버리고 처음부터 프로토콜을 구현하기로 결정했으며 놀랍게도 더 빠른 서버로 끝났습니다.

나는 Netty를 선호합니다.

트위터는 또한 Netty를 선택하여 새로운 검색 시스템을 구축하고 최대 3 배 더 빠르게 SPED를 사용했습니다.

ref : 트위터 검색은 이제 3 배 빠릅니다

우리는 Mina 및 Jetty와 같은 다른 경쟁 업체 중 일부를 선택했습니다. 왜냐하면 Twitter의 다른 여러 프로젝트 가이 프레임 워크를 사용하고 있기 때문에 더 깨끗한 API, 더 나은 문서화 및 더 중요한 것은 더 중요하기 때문입니다.

저는 MINA를 사용하여 작은 http 같은 서버를 구축한 적이 있습니다.지금까지 내가 겪은 가장 큰 문제는 다음과 같습니다.

  1. 이는 귀하의 "요청"과 "응답"을 메모리에 보관합니다.이는 내가 사용하기로 선택한 프로토콜이 http이기 때문에 문제가 됩니다.그러나 이 문제를 해결하기 위해 자체 프로토콜을 사용할 수 있습니다.
  2. 대용량 파일을 제공하려는 경우 디스크 외부 스트림을 제공하는 옵션이 없습니다.자신만의 프로토콜을 구현하여 다시 문제를 해결할 수 있습니다.

좋은 점:

  1. 많은 연결을 처리할 수 있습니다.
  2. 일종의 분산 작업 시스템을 구현하기로 선택한 경우 노드 중 하나가 다운되고 연결이 끊어지는 시기를 아는 것은 다른 노드에서 작업을 다시 시작하는 데 유용합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top