2012-10-10 2 views
0

저는 수석 프로그래머가 아니지만 잠시 동안 응용 프로그램을 배포하고 있으며 소형 완전 시스템을 개발했습니다.RabbitMQ와 같은 대기열 시스템을 사용하는 이유

RabbitMQ와 같은 대기열 처리 시스템에 대해 듣기 시작했습니다. 대기열 시스템을 사용해야하는 시스템을 개발 한 적은 없습니다. 그러나 나는 이것을 사용하지 않는다면 걱정이된다. 왜냐하면 나는 이것을 어떻게해야할지 모른다. 나는 그들의 사이트에서 RabbitMQ 튜토리얼을 읽었지만, 왜 이것을 사용해야하는지 잘 모르겠습니다. 추가 구성 요소 및 일반 데이터베이스 또는 이와 유사한 기능이없는 기존 프로그래밍으로는 이러한 기능을 구현할 수 있는지 확실하지 않습니다.

작은 예제가있는 대기열 시스템을 사용하는 이유를 설명해 주실 수 있습니까? 나는 안녕하세요 세상의 예가 아니라 실용적인 시나리오를 의미합니다.

시간 내 주셔서 감사 많은

  • RM 메시지 큐와 같은 미들웨어의 주요 용도

답변

5

하나는 비 균일 한 시스템간에 데이터를 보낼 수있을 것입니다. 메시지 자체는 많은 것들이 될 수 있습니다. 문자열은 다른 시스템에서 다른 언어로 이해하는 것이 가장 쉽지만 더 의미있는 데이터를 전송하는 데는 덜 유용합니다. 결과적으로 JSON 및 XML은 메시지에 대해 널리 사용됩니다. 이것들은 단지 소비자가 선택한 언어로 객체로 변환 될 수있는 구조화 된 문자열입니다.

추가 유용한 기능 : RabbitMQ 같은 일부 MQ 시스템 (모든 MQ 시스템에 사실이 아니다)에서

  • 는 클라이언트가 아주 멋지게 사물의 통신 측면을 처리하는 것입니다.
  • 메시지가 비동기적일 수 있습니다. 사용자가 다운되면 메시지는 소비자가 다시 온라인 상태가 될 때까지 유지됩니다.
  • MQ 시스템은 다양한 메시지 내구성으로 설정할 수 있습니다. 읽은 후에 대기열에서 제거하거나 승인 될 때까지 대기열에서 제거 할 수 있습니다. 그것들은 영속적 일 수 있으므로 MQ 시스템이 다운 되더라도 메시지는 손실되지 않습니다.

여기에는 가능한 인위적인 예가 들어 있습니다. 로컬 시스템의 Java 프로그램은 인터넷을 통해 연결된 시스템에 메시지를 보내려고합니다. 로컬 시스템에는 인터넷에 연결된 서버가 있습니다. MQ와의 연결을 제외하고 모든 것이 인터넷에서 차단됩니다. Java 프로그램은 인터넷에 액세스 할 필요없이 MQ에 메시지를 공개 할 수 있습니다. 외부 시스템이 메시지를 수신 할 때까지 메시지가 대기열에 있습니다. 자바 프로그램은 XML을 말할 수있는 메시지를 퍼블리시하며 소비자는 Perl 프로그램이 될 수있다. 미리 정의 된 serialization 및 deserialization 방법으로 XML을 이해할 수있는 방법이 있다면 XML을 사용할 수 있습니다.

3

MQ 시스템은 "화재 및 잊어"시나리오에서 가장 잘 작동하는 경향이 있습니다. 이벤트가 발생하고 다른 이벤트가 통지를 받아야하지만 소스 시스템이 다른 시스템의 피드백을 필요로하지 않으면 MQ가 적합 할 수 있습니다.

MQ의 장점과 단점을 이해하고 특정 시스템에 적합한 이유를 아직 이해하지 못한 경우 아마도 그렇지 않습니다. MQ가 사용되었지만 필요하지 않은 시스템을 보았습니다. 그 결과는 좋지 않았습니다.

내가 잘 해낸 시나리오 중 대부분은 관련이없는 시스템 (일반적으로 out-of-the-box 시스템) 간의 통합입니다. 주문을받는 시스템이 하나 있고 주문을 채우고 배송하는 시스템이 있다고 가정 해 보겠습니다.이 시나리오에서 주. 시스템은 MQ를 사용하여 주문의 이행 시스템에 알릴 수 있지만 주문 시스템은 주문 처리 시스템이 주문을 ^을 때까지 대기하지 않을 것입니다. 그래서 그것은 계속 대기열에 메시지를 넣습니다.

1

이것은 매우 단순 해답이지만 일반적인 아이디어를 제공합니다.

전화와 이메일의 관점에서 생각해 봅시다. 전자 메일이 존재하지 않는 분을 바로 잡으십시오. 일을 끝내려면 모두에게 전화해야합니다. 전화로 누군가와 의사 소통을 할 때, 그 사람을 만나기 위해 책상에 앉혀 야합니다 (공장에 있고 휴대폰 벨소리가 들릴 수 없다고 가정). 연락하려는 사람이 ' 책상에서, 당신은 그들이 당신의 전화를받을 때까지 기다린 채 붙어 있습니다. (또는 나중에 전화 할 가능성이 훨씬 큽니다.) 그것은 당신과 동일합니다 - 누군가 당신을 부를 때까지 할 일이 없습니다. 한 번에 여러 사람이 전화를 걸면 한 번에 한 사람 만 처리 할 수 ​​있기 때문에 알지 못합니다.

그러나 전자 메일이있는 경우 다른 사람과 요청을 "대기열에 두어"편리하게 무시할 수 있습니다. 이메일을 무시하면 언제든지 다시 보낼 수 있습니다. 책상에있을 때까지 기다릴 필요가 없으며 전화를 끊을 때까지 기다릴 필요가 없습니다. 작업량이 줄어들고 모든 것이 원활하게 진행됩니다. 추가 보너스로, 당신이 당신의 peons에 거래하고 싶지 않은 메시지를 전달할 수 있습니다.

시스템 엔지니어링에서 위의 전화 시나리오처럼 작동하는 프로그램 (또는 프로그램의 일부)을 정의하기 위해 "밀접하게 결합 된"이라는 용어를 사용합니다. 이들은 서로 매우 밀접하게 의존하며 프로그램의 여러 부분에서 구현을 공유합니다. 이러한 프로그램에서 데이터는 한 번에 하나씩 순서대로 처리됩니다. 이러한 시스템은 일반적으로 구축하기 쉽지만 고려해야 할 몇 가지 중요한 단점이 있습니다. (1) 프로그램의 모든 부분을 변경하면 코드 전체에서 계단식 변경이 발생할 가능성이 있으며 이로 인해 버그가 발생합니다. (2) 시스템은 확장 성이 좋지 않으며 일반적으로 필요에 따라 폐기 및 재구성해야합니다. (3) 시스템의 모든 부분이 동시에 작동 중이어야하거나 전체 시스템이 작동하지 않아야합니다.

기본적으로 밀접하게 연결된 프로그램은 프로그램이 매우 간단하거나 밀접하게 연결된 프로그램을 사용하는 특별한 이유가있는 경우에 유용합니다.

현실 세계에서는 상황이 훨씬 더 복잡합니다. 프로그램은 그렇게 단순 할 수 없으며 밀접하게 결합 된 방식으로 엔터프라이즈 응용 프로그램을 개발하는 것은 악몽이됩니다. 따라서 우리는 "느슨하게 결합 된 (loosely-coupled)"이라는 용어를 사용하여 많은 작은 조각으로 구성된 대형 시스템을 정의합니다. 조각들은 매우 잘 정의 된 경계와 기능을 가지고있어 시스템 변경이보다 쉽게 ​​이루어질 수 있습니다. 그것은 객체 지향 디자인의 핵심입니다. RabbitMQ와 같은 메시지 대기열을 사용하면 다양한 프로그램과 프로그램의 일부에서 이메일과 같은 통신이 가능하므로 워크 플로우가 사람과 훨씬 비슷합니다. 여분의 용량을 추가하면 필요할 때마다 컴퓨터를 시작하고 추가로 컴퓨터를 사용할 수 있습니다.

분명히 이것은 총체적인 단순화이지만, 일반적인 생각을 전달한다고 생각합니다. 메시지 대기열을 사용하는 응용 프로그램을 작성하면 클라우드 서비스 공급자를 활용하여 확장 성이 뛰어난 대규모 응용 프로그램을 배포 할 수 있습니다. 다음은 클라우드 설계에 대한 기사입니다. http://blogs.msdn.com/b/silverlining/archive/2011/08/23/designing-and-building-applications-for-the-cloud.aspx

관련 문제