NCache ASP.NET 캐시 공급자 및 전체 텍스트 검색 등 많은 기능이 있습니다. 하지만 이번에는 다른 것을 보자. NCache 기능: 게시자/구독자(Pub/Sub) 메시징. 다음을 사용하여 Pub/Sub 메시징 패턴을 구현하는 방법을 알아보겠습니다. NCache.
Pub/Sub 메시징이란 무엇입니까?
Pub/Sub는 발신자(또는 게시자)가 채널을 통해 여러 수신자(또는 구독자)와 메시지를 공유하여 발신자와 수신자 간의 결합을 방지하는 메시징 패턴입니다.
Pub/Sub 메시징을 사용하면 애플리케이션 간에 메시지를 공유하고 시간 소모적인 작업을 백그라운드 프로세서로 오프로드할 수 있습니다. 예를 들어, 예약 관리 시스템에서 웹 애플리케이션에 의해 트리거된 이벤트를 "수신"하여 백그라운드 프로세서에서 방 이미지의 크기를 조정할 수 있습니다.
NCache .NET 애플리케이션 간에 실시간 정보 공유를 가능하게 하는 메모리 내 Pub/Sub 메시징을 제공합니다.
덕분에 분산 아키텍처, NCache 확장 가능하고 가용성이 높으며 스토리지 효율적인 게시/구독 메시징 메커니즘을 제공합니다.
Pub/Sub 메시징을 구현하는 방법 NCache
샘플 애플리케이션으로 이동하기 전에 먼저 몇 가지 용어를 살펴보겠습니다.
와 NCache, 메시지를 교환하는 채널을 주제. 각 구독자는 주제에 구독하여 전송된 메시지를 수신합니다.
NCache 구독자와 게시자 간에 여러 유형의 구독을 제공합니다. Pub/Sub 메시징에서 구독은 주제에 대한 한 명 이상의 구독자의 "관심"입니다.
NCache 두 가지 유형의 구독이 있습니다.
- 비내구재: 이 구독 유형을 사용하면 구독자는 연결이 끊긴 동안 보낸 메시지를 받지 않습니다. 이것은 기본 구독 유형입니다.
- 튼튼한: 구독자는 연결이 끊긴 동안 메시지를 잃지 않습니다. 지속 구독을 사용하면 구독자가 다시 가입하거나 메시지가 만료될 때까지 메시지가 저장됩니다.
또한, NCache 에는 다음과 같은 두 가지 유형의 정책이 있습니다.
- 공유 : 이 정책에서 구독은 한 번에 둘 이상의 활성 구독자를 가질 수 있습니다. 가입자가 네트워크를 떠나도 가입은 활성 상태를 유지합니다. 이 정책은 Durable 구독에서만 지원됩니다.
- 독특한: 공유 정책과 달리 독점 정책이 있는 구독은 한 번에 하나의 구독자만 가질 수 있습니다. 이 정책은 영구 및 비영구 구독 모두에 사용할 수 있습니다.
Pub/Sub 메시징에서 구독자는 이름으로 주제에 등록합니다. 샘플 애플리케이션의 뒷부분에서 이 구독 방법을 사용할 것입니다. 하지만, NCache 패턴 기반 구독 방법도 지원합니다. 구독자를 의미합니다 listens
한 번의 호출로 여러 주제에 예를 들어, 패턴을 듣고 있는 가입자 new-*
로 전송된 메시지를 수신합니다. new-movies
과 new-series
주제.
주제 우선순위 및 메시지 매개변수에 대한 자세한 내용은 다음을 확인하십시오. Pub/Sub 메시징 구성 요소 및 사용.
이 용어를 사용하여 모든 새 영화 릴리스에 대해 영화 팬에게 알리는 샘플 .NET 응용 프로그램을 빌드해 보겠습니다. 두 개의 콘솔 응용 프로그램을 작성해 보겠습니다. 하나는 게시자로, 다른 하나는 구독자로 사용합니다.
1. 새 영화 메시지 게시
먼저 일부 영화를 게시할 콘솔 앱을 만들어 보겠습니다. 또한, 설치하자 Alachisoft.NCache.SDK
NuGet 패키지, 버전 5.3.0.
. Program.cs
파일, IMDb에서 임의의 영화를 게시해 보겠습니다. newReleases
주제. 이 같은,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using Alachisoft.NCache.Client; using Alachisoft.NCache.Runtime.Caching; using Movies.Shared; using Movies.Shared.Entities; using Movies.Shared.Extensions; ICache cache = CacheManager.GetCache(Config.CacheName); // 1. Create an NCache cache instance string topicName = Config.Topics.NewReleases; ITopic newReleasesTopic = cache.MessagingService.CreateTopic(topicName); // 2. Create a new topic newReleasesTopic.MessageDeliveryFailure += OnFailureMessageReceived; // Attach a callback in case of delivery failures var newReleases = new List { new Movie("Top Gun: Maverick", 2022, 8.60f, 130, new []{ Genre.Action, Genre.Drama }), // Some other new movies here... }; foreach (var movie in newReleases) { var message = movie.ToMessage(Config.Expiration); // 3. Create a Message await newReleasesTopic.PublishAsync(message, DeliveryOption.All, true); // 4. Publish it } Console.WriteLine("Press any key to continue"); Console.ReadKey(); static void OnFailureMessageReceived(object sender, MessageFailedEventArgs args) { Console.WriteLine($"[ERROR] Failed to delivered message '{args.Message.Payload}'. Topic: [{args.TopicName}], Reason: [{args.MessageFailureReason}]"); } |
그것을 통해 가자. 먼저 NCache 캐시 GetCache()
. 우리는 기본값을 사용하고 있습니다 demoCache
동안 생성 NCache 설치.
그런 다음 다음을 사용하여 새 주제를 만들었습니다. CreateTopic()
주제 이름으로. 이것은 나중에 구독자 응용 프로그램에서 사용할 동일한 이름입니다. 또한 배송 실패 알림을 받기 위해 콜백을 첨부했습니다.
모든 영화에 대한 메시지를 게시하기 위해 우리는 PublishAsync()
세 가지 매개변수: NCache Message
Walk Through California 프로그램, DeliveryOption.All
모든 가입자에게 알리고 true
실패에 대한 알림을 받습니다.
NCache Message
보낼 객체를 감싸는 래퍼입니다. 다음과 같이 표시해야 합니다. [Serializable]
. 예를 들어 다음은 Movie
기록
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using Alachisoft.NCache.Runtime.Caching; namespace Movies.Shared.Entities; [Serializable] public record Movie(string Name, int ReleaseYear, float? Rating, int DurationInMinutes, Genre[] Genres) { public override string ToString() { return $"Movie: [{Name}] ({ReleaseYear})"; } } public enum Genre { Action, // Some other movie genres } |
빌드하려면 Message
, 우리는 ToMessage()
만료가 있는 확장 메서드입니다.
1 2 3 4 5 6 7 8 9 |
using Alachisoft.NCache.Runtime.Caching; namespace Movies.Shared.Extensions; public static class MovieExtensions { public static Message ToMessage(this object self, TimeSpan? expiration = null) => new Message(self, expiration); } |
메시지 중 하나가 만료되고 아무도 수신하지 않으면 OnFailureMessageReceived
콜백이 호출됩니다. 자세한 내용은 확인 메시지 동작 및 속성.
예를 들어, 메시지가 만료되도록 (아직) 구독자 없이 게시자 애플리케이션을 실행해 보겠습니다.
게시자 앱에서 우리는 다음을 사용했습니다. PublishAsync()
. 또한, NCache 한 번의 호출로 여러 메시지를 대량으로 보낼 수 있도록 지원합니다. PublishBulk()
방법.
게시자가 준비되었습니다. 구독자 애플리케이션을 작성해 봅시다.
2. 새 영화 메시지 구독
구독할 다른 콘솔 응용 프로그램을 만들어 보겠습니다. newReleases
이야기.
Program.cs
파일은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using Alachisoft.NCache.Client; using Alachisoft.NCache.Runtime.Caching; using Movies.Shared; using Movies.Shared.Entities; ICache cache = CacheManager.GetCache(Config.CacheName); // 1. Create an NCache cache instance string topicName = Config.Topics.NewReleases; ITopic newReleasesTopic = cache.MessagingService.GetTopic(topicName); // 2. Grab the same topic newReleasesTopic.OnTopicDeleted = OnTopicDeleted; // Attach a callback if the topic gets deleted if (newReleasesTopic == null) { Console.WriteLine($"Ooops...Topic [{topicName}] deleted."); } else { ITopicSubscription newReleasesSubscriber = newReleasesTopic.CreateSubscription(MessageReceived, DeliveryMode.Async); // 3. Attach a callback for new movies Console.WriteLine("Press any key to continue"); Console.ReadKey(); newReleasesSubscriber.UnSubscribe(); // 4. Unsubscribe... } void MessageReceived(object sender, MessageEventArgs args) { if (args.Message.Payload is Movie movie) { Console.WriteLine($"New Movie released: {movie}"); } } void OnTopicDeleted(object sender, TopicDeleteEventArgs args) { Console.WriteLine($"[ERROR] Ooops Topic deleted. Topic: [{args.TopicName}]"); } |
이번에는 Publisher 애플리케이션에서 사용한 것과 동일한 토픽 이름을 사용하여 토픽 하나를 참조하고 토픽 삭제 시 콜백을 첨부했습니다.
다음으로 다음을 사용하여 비영구적 구독을 만듭니다. CreateSubscription()
와 MessageReceived
콜백 및 DeliveryMode.Async
. 이 배달 모드를 사용하면 NCache 메시지의 순서를 보장하지 않습니다. 메시지를 순서대로 수신하려면 다음을 사용해야 합니다. DeliveryMode.Sync
.