Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Redis Pub/Sub:소개 가이드

게시/구독(또는 게시/구독 )는 수십 년 동안 사용되어 왔지만 유용한 전용 메시징 서버와 전문 지식이 필요한 소프트웨어 엔지니어링 패턴입니다.

Redis pub/sub는 2.0 릴리스 이후 모든 Redis 서버의 기능이었던 게시/구독 패턴의 간결하고 간단한 구현입니다. 즉, Redis가 배포되는 모든 곳에서 사용하기 쉽고 Redis를 배포하여 빠르고 간단한 게시/구독 시스템을 빠르게 구축할 수 있습니다.

Redis 게시/구독이 앱에 적합한지 여부를 이해하려면 먼저 게시/구독의 디자인과 목표를 이해한 다음 Redis 게시/구독 구현의 세부 사항을 고려하는 것이 중요합니다.

게시/구독 개요

출판/구독 디자인:"발행자"와 "구독자" 분리

종속성을 줄이고 지식을 구획화하는 것은 확장 가능한 소프트웨어 설계의 핵심 목표입니다. 발행/구독 메시징 패턴(일명 발행/구독)은 게시하는 소프트웨어 부분을 구분합니다. 작용하는 소프트웨어 부분의 메시지 메시지. 이를 더 잘 이해하기 위해 몇 가지 예를 살펴보겠습니다.

"게시자"의 예

  • 채팅방에 메시지를 보낼 수 있는 앱
  • 상태 또는 서비스를 알리는 도커 컨테이너
  • 주식 거래 가격을 알려주는 앱
  • 집 안의 온도 센서가 측정값을 알려줍니다.
  • 다중 사용자 게임의 메시지 브로드캐스터("Elon은 그루에게 먹혔습니다")

"구독자"의 예

  • 채팅방에서 메시지를 수신하는 앱
  • Slack에 알림을 전달하는 앱
  • 실시간으로 상황을 확인하는 데 사용되는 모바일 클라이언트
  • 나중에 분석을 위해 이벤트를 기록하는 로깅 서비스

게시/구독 패턴은 구독자에 대해 너무 많이 생각하지 않도록 도와줍니다. 게시자 작업 시 , 그 반대. 위의 예에서 우리는 한 게시자의 메시지에 관심이 있는 여러 구독자를 상상할 수 있습니다. 구독자는 전체를 듣고 싶어할 수도 있습니다. 게시자.

pub/sub에서 게시자는 구독자에 대해 알 필요가 없습니다. 채널에 메시지를 보냅니다. (종종 주제라고 함 다른 시스템에서) 및 moveson. 메시지가 게시될 때 해당 채널에서 청취하게 된 모든 구독자는 메시지를 받게 됩니다.

구독자는 하나 이상의 채널을 듣고 수신되는 테마 메시지에 반응하도록 설계되었습니다. 구독자가 게시된 메시지의 속도를 따라가지 못하면 일부 메시지를 놓칠 수 있습니다. 이것은 유용한 설계입니다. 시스템을 느린 구독자의 용량 이상으로 확장할 수 있습니다. 게시자는 구독자 행동으로 인한 속도 저하 없이 빠르게 작업을 진행합니다.

Pub/sub의 목표:작업량이 아닌 배달 확장

Pub/sub는 확장 소프트웨어에 사용되는 패턴입니다. 어떤 종류의 확장이 도움이 되는지 이해하는 것이 중요합니다. 중요한 차이점은 게시/하위 및 메시지 대기입니다. .

대기열 패턴에서 대기열(또는 목록 Redis에서) 작업자 풀이 목록에서 항목을 꺼내 처리하는 동안 처리할 메시지를 버퍼링합니다. 이 모델에서 작업자 풀의 크기를 조정하면 각 메시지가 한 작업자에게만 전달되기 때문에 대기열을 처리하는 속도가 조정됩니다. 모든 작업자는 동일한 방식으로 주어진 메시지를 처리합니다.

반면 pub/sub에서는 시스템이 채널의 모든 메시지를 모든 구독자에게 전달하려고 시도합니다. 이것은 다대다 패턴으로, 각기 다른 구독자가 메시지에 대해 고유한 작업을 수행합니다. 하나는 내구성 있는 로그에 쓰고, 하나는 Slack 채널로 보내고, 하나는 지역 영업소에서 벨을 울리는 등입니다.

간단히 말해서 pub/sub는 메시지 전달을 확장합니다. , 대기열은 메시지작업 부하 처리를 확장합니다. . Redis는 이러한 두 가지 목표에 자주 사용됩니다. Redis를 사용한 대기열에 대한 인기 있는 예는 Sidekiq를 참조하세요.

Redis 게시/구독 세부정보

Pub/sub는 아주 오래전부터 존재해 온 패턴이며, 핵심 패턴은 동일하지만 구체적인 기능은 구현마다 상당히 다릅니다.

Redis pub/sub는 가볍고 빠른 구현입니다. 그 디자인을 가장 잘 이해하기 위해서는 그렇지 않은 일부 기능을 살펴보는 것이 유용할 것입니다. Redis 게시/구독의 일부:

  • 지속성 또는 값 캐싱 없음
  • 배송 보장 없음
  • 클러스터 최적화 없음...아직

지속력 없음:"하지만 채팅방 같은 줄 알았는데..."

디스크에 기록될 수 있는 대부분의 Redis 작업과 달리 Redispub/sub는 비영구적입니다. 게시된 메시지는 구독자에게 직접 전달된 다음 삭제되며 Redis의 메모리나 디스크에 기록이 유지되지 않습니다.

이것은 Redis pub/sub가 대화방을 구현하는 데 자주 사용된다는 소식을 들은 신규 사용자에게 때때로 혼동을 줄 수 있습니다. 우리 중 많은 사람들이 Slack과 같은 도구를 채팅방으로 생각합니다. 로그인하여 최근 메시지를 보고 새 메시지를 모두 받습니다. 실제로 "최근 메시지 보기"는 pub/sub의 일부가 아니며 별도의 수단으로 처리해야 합니다. Pub/sub는 새 메시지의 전달만 용이하게 합니다. 이러한 의미에서 pub/sub는 라이브 스트림과 같습니다. 켜면 정보를 얻기 시작하지만 켜기 전에 무슨 일이 일어났는지 알 수 없습니다. 제쳐두고:IRC(Internet Relay Chat)는 기록이나 메시지 보존 기능이 내장되지 않은 pub/sub 모델을 사용합니다. 이것이 바로 채팅방 비유가 흔한 이유입니다.

실제로 Redis 및 pub/sub로 대화방을 구현할 수 있습니다. 이렇게 하려면 메시지가 게시될 뿐만 아니라 목록에도 푸시됩니다. 사용자가 메시지 기록을 볼 수 있도록 합니다.

배송 보장 없음

구독자는 게시/구독 모델에서 메시지 수신을 보장하지 않습니다. 가입자가 네트워킹 문제가 있거나 메시지를 충분히 빨리 읽지 못하거나 메시지가 게시될 때 첨부되지 않은 것으로 나타나면 메시지를 수신하지 않습니다. 게시자는 듣고 있는 구독자가 없을 때도 채널에 메시지를 보낼 수 있습니다. 이러한 메시지는 삭제됩니다.

특정 다른 메시징 시스템은 수신 확인 또는 "acks"를 사용하거나 짧은 연결 끊김을 방지하기 위해 구독자를 위한 버퍼를 저장할 수 있습니다. Redis는 여기에서 간단한 옵션을 선택합니다. 메시지를 놓치면 메시지를 놓친 것입니다. 반드시해야 하는 메시지 다른 수단을 통해 전달해야 합니다.

이 절충안은 그것보다 더 나쁘게 들립니다. 메시지 확인 및 구독자별 버퍼링을 삭제하면 Redis 게시/구독이 메시지를 매우 처리할 수 있습니다. 신속하게 처리할 수 있으며 날씨가 좋은 날 메시지 전달의 이점을 얻을 수 있는 시스템이 많이 있습니다.

현재로서는 비효율적인 클러스터 확장...

Pub/sub는 확장을 위한 솔루션이므로 메시지뿐만 아니라 메시지를 전달하는 데 사용하는 서비스도 확장하는 것을 고려하는 것이 중요합니다. RabbitMQ 및 Kafka를 비롯한 많은 메시징 시스템은 다음과 같이 고가용성과 합리적인 확장 속성을 위해 설계되었습니다. 메시징 서비스 설정이 늘어납니다.

Redis 클러스터(3.0 이후 Redis의 일부)에는 Redis pub/sub에 대한 기본 제공 지원이 있으며 중요한 경고가 있습니다. 게시된 모든 메시지는 Redis 클러스터의 모든 구성원에게 브로드캐스트되므로 대규모 클러스터가 트래픽으로 빠르게 압도될 수 있습니다.

이에 대한 짧은 대답은 개별 Redis 서버 또는 소규모 pub/sub 특정 클러스터에서만 pub/sub를 사용하는 것입니다. 이 두 옵션은 모두 많은 수의 메시지를 처리할 수 있습니다. 장기적으로 Redis 클러스터에는 필요할 때만 메시지를 라우팅하는 더 스마트한 기능이 있지만 해당 기능은 아직 설계 단계에 있습니다.

마무리

전반적으로 Redis pub/sub는 소프트웨어 확장에 유용한 도구입니다. 위에서 살펴본 각 기능의 부재는 설계 절충안으로 인해 모든 메시징 목적에 대한 만병 통치약이 되는 대신 Redis의 단순성과 속도를 제공합니다.

Redis의 다른 많은 부분과 마찬가지로 모든 전문화된 사용 사례에 맞게 조정되지는 않았지만 약간의 이해가 있으면 상당한 시간이 걸릴 수 있습니다. Redis의 다른 기능과 함께 개발자 도구 벨트에서 매우 강력한 도구가 됩니다.

높은 수준의 개요가 완료되면 somepub/sub 코드 예제를 볼 준비가 된 것입니다. Redis Pub/Sub:다음 방법을 살펴보세요.