ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish hakkında bir anlayış aramak

Aug 17 2020

Ayırmakta zorlanıyorum IRedisClient.PublishMessageve bir IMessageQueueClient.Publishşeyleri karıştırmam gerektiğini anlıyorum.

ServiceStack bize aşağıdaki gibi pub / sub yayınları dinleme seçeneği sunar:

    static IRedisSubscription _subscription;
    static IRedisClient redisClientSub;
    static int received = 0;
    static void ReadFromQueue()
    {
        redisClientSub = redisClientManager.GetClient();
        _subscription = redisClientSub.CreateSubscription();

        _subscription.OnMessage = (channel, msg) =>
        {
            try
            {
                received++;
            }
            catch (Exception ex)
            {
                    
            }
        };

        Task.Run(() => _subscription.SubscribeToChannels("Test"));
    }

Güzel görünüyor, anlaşılır. Peki yapımcı ne olacak?

Mevcut sınıflara bakarken, birinin IRedisClient.PublishMessage(string toChannel, string message)veya IMessageQueueClient.Publish(string queueName, IMessage message).

redisClient.PublishMessage("Test", json);
// or:     
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));

Her iki durumda da kanal adını kendiniz belirlersiniz. Bu gördüğüm davranış:

  • Yukarıdaki abone mesajı yalnızca kullanırsam alır, kullanmazsam IRedisClient.PublishMessage(string toChannel, string message)asla alırIMessageQueueClient.Publish(string queueName, IMessage message)
  • Şunu kullanarak yayınlarsam IRedisClient.PublishMessage, "Test" kanalının doldurulmasını bekliyordum (bir Redis tarayıcısıyla görüntülersem), ancak değil. Kuyruktan hiçbir iz görmüyorum (diyelim ki aboneliği başlatmıyorum, ancak üreticiler mesajlar ekliyor)
  • Kullanarak yayınlarsam IMessageQueueClient.Publish(string queueName, IMessage message), "Test" kanalı oluşturulur ve mesajlar orada kalır, ancak hiçbir zaman çıkarılmaz / getirilip silinmez.

İkisi arasındaki farkı anlamak istiyorum. Kaynak koduna baktım ve elimden geldiğince okudum, ancak ilgili herhangi bir belge bulamadım IRedisClient.PublishMessage.

Yanıtlar

Ted Aug 17 2020 at 21:29

Mythz bunu ServiceStack forumunda burada yanıtladı .

O yazıyor:

Bu istemciler birbirinin yerine kullanılmamalıdır, yalnızca MQ Mesajları veya Mesaj MQ Mesaj sarmalayıcısı göndermek için ServiceStack MQ istemcilerini kullanmalısınız.

Redis aboneliği, bir Redis Pub / Sub aboneliği oluşturmak için düşük seviyeli API'dir; daha kullanışlı bir üst düzey API, pub / sub aboneliğini yönetilen bir iş parçacığının arkasına saran Yönetilen Pub / Sub Sunucusudur.

Her iki durumda da, MQ Sunucusu yalnızca MQ istemcilerinden gelen mesajları işlemek için tasarlanmıştır, eğer kendi mesajlaşma uygulamanızı uygulayacaksanız, MQ istemcileri veya MQ Mesaj sınıfını değil kendi mesajlarınızı kullanın ve istemcileri yeniden başlatın.

ve

Hiçbir IRedisClient (& ServiceStack.Redis) API'si Redis Sunucusu için değildir, PublishMessage API'si redis PUBLISH komutunu gönderir. IRedisSubscription bir Redis Pub / Sub aboneliği oluşturur, Redis Pub / Sub'ın nasıl çalıştığını öğrenmek için Redis belgelerine bakın. ServiceStack.Redis kitaplığı ve tüm API'leri yalnızca Redis Sunucusu içindir, herhangi bir ServiceStack.Messaging MQ API'si içermez.

Bu nedenle, özel Redis Pub / Sub abonelik uygulamanız için ServiceStack.Redis'i kullanın, yani yalnızca ServiceStack MQ için olan herhangi bir ServiceStack.Messaging API'sini kullanmayın.