문제

나는 메시징 시스템의 좋은 면과 나쁜 면을 경험해 왔습니다. 실제 생산 환경, 잘 구성된 테이블이나 테이블 스키마는 다음과 같은 이유로 다른 형태의 메시징 대기열보다 항상 우수하다는 점을 인정해야 합니다.

  1. 데이터는 테이블에 영구적으로 저장됩니다.나는 포착되지 않은 예외나 기타 버그로 인해 메시지를 잃거나 사라지는 Java(jms) 애플리케이션을 너무 많이 보았습니다.
  2. 대기열이 채워지는 경향이 있습니다.대신 DB 스토리지는 사실상 무한합니다.
  3. 테이블은 쉽게 접근할 수 있지만 대기열에서 읽으려면 난해한 도구를 사용해야 합니다.

각 접근 방식에 대해 어떻게 생각하시나요?

도움이 되었습니까?

해결책

문구 매번 친다 전적으로 귀하의 요구 사항이 무엇인지에 달려 있습니다.확실히 모든 사람에게 매번 이길 수는 없습니다.

이미 데이터베이스를 사용하고 있는 단일 시스템을 구축하고 있다면 매우 높은 성능 처리량 요구 사항이 없으며 다른 팀이나 시스템과 통신할 필요가 없다면 아마도 그 말이 맞을 것입니다.

단순하고 낮은 처리량, 대부분 단일 스레드 작업의 경우 데이터베이스는 메시지 대기열에 대한 완전히 훌륭한 대안입니다.

메시지 대기열이 빛을 발하는 곳은 언제입니까?

  • 많은 서버/프로세스에서 동시에 초당 수만 개의 메시지를 처리할 수 있도록 고성능, 동시성 및 확장성이 뛰어난 로드 밸런서를 원합니다(데이터베이스 테이블을 사용하면 초당 수백 개를 처리하고 여러 개의 메시지를 처리할 수 있는 운이 좋을 것입니다). 스레드는 하나의 프로세스가 메시지 대기열 테이블을 잠그는 경향이 있으므로 매우 어렵습니다.)
  • 서로 다른 데이터베이스를 사용하여 서로 다른 시스템 간에 통신해야 합니다(따라서 다른 팀의 다른 사람들에게 시스템 데이터베이스에 대한 쓰기 액세스 권한을 전달할 필요가 없습니다).

단일 데이터베이스, 팀 및 상당히 적당한 성능 요구 사항을 갖춘 간단한 시스템의 경우 데이터베이스를 사용하십시오.작업 등에 적합한 도구를 사용하십시오.

그러나 메시지 대기열이 빛나는 곳은 서로 통신해야 하는 시스템이 많은 대규모 조직(그래서 비즈니스 데이터베이스가 중앙 실패 지점이나 버전 지옥의 장소가 되는 것을 원하지 않음) 또는 다음과 같은 경우입니다. 고성능 요구 사항.

성능 측면에서 메시지 큐는 항상 데이터베이스 테이블을 능가합니다. 메시지 큐는 작업을 위해 특별히 설계되었으며 비관적 테이블 잠금(큐의 데이터베이스 구현에 필요한 로드 밸런싱을 수행하는 데 필요함)에 의존하지 않기 때문입니다. 그리고 좋은 메시지 큐는 데이터베이스의 네트워크 오버헤드를 피하기 위해 큐에 메시지를 즉시 로드합니다..

마찬가지로 웹 서버 전체에서 HTTP 요청의 로드 밸런싱을 수행하는 데 데이터베이스를 사용하지 않을 것입니다. 너무 느리기 때문입니다. 로드 밸런서에 대한 높은 성능 요구 사항이 있는 경우에도 데이터베이스를 사용하지 않을 것입니다.

다른 팁

먼저 테이블을 사용한 다음 이유가있을 때 (그리고 if) 본격적인 MSG 대기열에 리팩터를 리팩터링했습니다. 디자인이 합리적이면 사소한 일입니다.

가장 큰 이점은 a.) 더 쉬워집니다. (b. 다른 테이블에 가입 할 수 있기 때문에 더 나은 감사 트레일입니다. c.) 데이터베이스 도구를 실제로 잘 알고 있다면 메시지 대기열 도구보다 사용하기가 더 쉽습니다. , d.) 일반적으로 앱에 이미 존재하는 맥락에서 테스트/개발 환경을 설정하는 것이 조금 더 쉽습니다 (동일한 친숙 함이 적용되는 경우).

아, 그리고 e.) 아마도 당신과 다른 사람들에게는 배우고 설치, 구성, 관리 및 지원하는 다른 제품이 아닙니다.

Impe, 그것은 신뢰할 수 있고 연결이 끊어지며, 더 많은 확장 가능한 경우 변환 할 수 있습니다.

  1. 데이터는 테이블에 영구적으로 저장됩니다. 나는 너무 많은 JAVA (JMS) 응용 프로그램을 보았을 때 예외 또는 기타 버그를위한 메시지를 느슨하게하거나 사라지는 것을 보았습니다.

    어떤 JMS 구현? Sun은 메시지를 잃을 수없는 안정적인 대기열을 판매합니다. 아마도 당신은 방금 치즈 JMS 호환 제품을 구입했을 것입니다. IBM의 MQ는 매우 신뢰할 수 있으며 액세스 할 수있는 JMS 라이브러리가 있습니다.

  2. 대기열이 채워지는 경향이 있습니다. DB 스토리지는 사실상 무한합니다.

    음 ... 대기열이 채워지면 무언가가 부러진 것처럼 들립니다. 앱이 충돌하면 좋은 일이 아니며 대기열은 그와 거의 관련이 없습니다. 정말 열악한 JMS 구현을 구매했다면, 당신이 그것에 만족할 수있는 곳을 볼 수 있습니다. 경쟁력있는 시장입니다. 더 나은 대기열 관리자를 찾으십시오. Sun의 JCAPS에는 이전에는 SeeBeyond 메시지 대기열이 정말 좋은 대기열 관리자가 있습니다.

  3. 테이블은 쉽게 접근 할 수 있으며, 대기열에서 읽기 위해서는 Esotic 악기를 사용해야합니다.

    그것은 내 경험에 맞지 않습니다. 테이블은이 독특한 "다른 언어"(SQL)를 통해 액세스되며 테이블에서 객체 및 varchar2에서 문자열까지의 데이터 유형 매핑에 이르기까지 구조 매핑을 알고 있어야합니다. 또한, 나는 어떤 종류의 액세스 계층 (JDBC 또는 JDBC를 사용하는 ORM)을 사용해야합니다. 그것은 매우 복잡해 보입니다. 간단한 전송 및 수신을 사용하여 MessageConsumers 및 메시지 제품을 통해 큐에 액세스됩니다.

마치 경험 한 문제가 메시징에 내재되어 있지 않고 오히려 구현되지 않은 메시징 시스템의 유물 인 것처럼 들립니다. 구축 메시징 시스템은 데이터베이스 시스템을 구축하는 것보다 어렵습니까? 예, 데이터베이스 시스템을 구축하는 것만으로도됩니다.

  • 예외로 메시지를 잃어 버리십니까? 그것은 메시지 대기열의 잘못이 아닙니다. 사용중인 응용 프로그램은 제대로 설계되지 않았습니다. 처리가 완료되기 전에 대기열에서 메시지를 제거하고 있습니다. 그들은 트랜잭션이나 저널링을 사용하지 않습니다.
  • DB 스토리지가 "사실상 무한"상태 인 동안 메시지 대기열이 채워 집니까? 디스크 공간을 관리하는 것은 데이터베이스가 필요하지 않은 것처럼 이야기합니다. 메시지 큐 서버에는 데이터베이스 서버와 마찬가지로 관리가 필요합니다.
  • 대기열에서 읽을 수있는 난해한 악기? 어쩌면 비동기 방법을 발견하면 난해할 수도 있습니다. 직렬화 및 사제 화를 발견하면 아마도있을 수 있습니다. (적어도, 그것들은 내가 메시징을 배우고있을 때 내가 난해한 것들입니다. 많은 겉보기에 겉보기 기술처럼, 그들은 당신이 그들을 이해하면 실제로는 매우 평범하고, 그것들을 이해하는 개발자의 교육에서 중요한 부분입니다.)

데이터베이스보다 우수한 메시징 측면 :

  • 비동기 처리. 메시지 대기열 새 메시지가 도착하면 대기 프로세스에 알립니다. 데이터베이스 에서이 기능을 달성하려면 대기 프로세스가 데이터베이스를 폴링해야합니다.
  • 우려의 분리. 통신 채널은 메시지 컨텐츠의 구현 세부 사항에서 분리됩니다. 발신자와 수신자 만 주어진 메시지 내에서 데이터 스트림 형식에 대해 알아야합니다.
  • 결함 허용.. 서버 간의 연결이 간헐적 일 때 메시징이 작동 할 수 있습니다. 메시지 대기열은 로컬로 메시지를 저장하고 연결이 실시간 경우 원격 서버로만 전달할 수 있습니다.
  • 시스템 통합. Windows World에서는 적어도 메시징이 운영 체제에 내장되어 있습니다. OS의 보안 모델을 사용하고 OS 도구 등을 통해 관리됩니다.

이런 것들이 필요하지 않으면 메시징이 필요하지 않을 것입니다.

다음은 메시징 응용 프로그램의 간단한 예입니다. 여러 네트워크에 배포 된 사용자가 인쇄 된 출력을 생성하는 데 사용되는 상당히 복잡한 트랜잭션 세트를 입력하는 시스템을 구축하고 있습니다. 출력 생성은 계산적으로 비싸며 워크 플로의 일부가 아닙니다. 즉, 사용자는 출력이 생성 될 때 신경 쓰지 않습니다.

그래서 우리는 트랜잭션을 메시지로 연속화하여 대기열에 삭제합니다. 서버에서 실행되는 프로세스는 큐에서 메시지를 가져오고 출력을 생성하며 이미징 시스템에 출력을 저장합니다.

데이터베이스를 메시지 저장소로 사용한 경우, 현재 발신자와 수신자 만 관리하는 트랜잭션 형식을 저장하기 위해 스키마를 제시해야합니다. 데이터베이스 서버에 대한 지속적인 연결은 여러 서버 에서이 트랜잭션로드를 배포 할 수있는 용량이 없으며, 출력 서버는 하루에 수천 번 데이터베이스를 쿼리하여 처리 할 새로운 작업이 있는지 확인해야합니다.

대기열은 안정적인 메시지를 제공합니다. 큐잉의 저장 및 차저, 연결이 끊어진 특성은 더 강력한 말을 할뿐만 아니라 데이터베이스보다 훨씬 더 확장 가능하게 만듭니다.

그리고 대기열은 실제로 정보를 영구적으로 저장하는 데 사용해서는 안됩니다. 데이터베이스와 달리 정보를 임시받은 편지함으로 생각하는 것이 가장 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top