การค้นหาความเข้าใจเกี่ยวกับ ServiceStack.Redis: IRedisClient.PublishMessage กับ IMessageQueueClient.Publish

Aug 17 2020

ฉันมีช่วงเวลาที่ยากลำบากในการแยกIRedisClient.PublishMessageและIMessageQueueClient.Publishและตระหนักว่าฉันต้องผสมอะไรบางอย่างเข้าด้วยกัน

ServiceStack ช่วยให้เรามีตัวเลือกในการฟังการออกอากาศ pub / sub ดังนี้:

    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"));
    }

ดูดีตรงไปตรงมา แต่โปรดิวเซอร์ล่ะ?

เมื่อมองไปที่ชั้นเรียนที่มีอยู่ผมคิดว่าหนึ่งอาจจะผู้ใช้หรือIRedisClient.PublishMessage(string toChannel, string message)IMessageQueueClient.Publish(string queueName, IMessage message)

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

ในทั้งสองกรณีคุณระบุชื่อช่องด้วยตัวเอง นี่คือพฤติกรรมที่ฉันเห็น:

  • สมาชิกด้านบนจะได้รับข้อความก็ต่อเมื่อฉันใช้IRedisClient.PublishMessage(string toChannel, string message)และไม่เคยใช้เลยถ้าฉันใช้IMessageQueueClient.Publish(string queueName, IMessage message)
  • หากฉันเผยแพร่โดยใช้IRedisClient.PublishMessageฉันคาดว่าจะมีการเติมช่อง "ทดสอบ" (หากฉันดูด้วยเบราว์เซอร์ Redis) แต่ไม่ใช่ ฉันไม่เห็นร่องรอยของคิวเลย (สมมติว่าฉันไม่ได้เริ่มการสมัครสมาชิก แต่ผู้ผลิตเพิ่มข้อความ)
  • หากฉันเผยแพร่โดยใช้IMessageQueueClient.Publish(string queueName, IMessage message)ช่อง "ทดสอบ" จะถูกสร้างขึ้นและข้อความจะยังคงอยู่ที่นั่น แต่จะไม่ปรากฏ / ดึงข้อมูลและลบ

ฉันต้องการเข้าใจความแตกต่างระหว่างทั้งสอง ฉันได้ดูรหัสที่มาและอ่านทั้งหมดที่ฉันสามารถเกี่ยวกับมัน แต่ฉันยังไม่พบเอกสารใด ๆ IRedisClient.PublishMessageเกี่ยวกับ

คำตอบ

Ted Aug 17 2020 at 21:29

Mythz ตอบนี้ในฟอรั่ม ServiceStack, ที่นี่

เขาเขียน:

ไม่ควรใช้ไคลเอ็นต์เหล่านี้สลับกันคุณควรใช้เฉพาะไคลเอนต์ ServiceStack MQ เพื่อส่งข้อความ MQ หรือข้อความ MQ ของข้อความ

การสมัครสมาชิก redis เป็น API ระดับต่ำเพื่อสร้างการสมัครสมาชิก Redis Pub / Sub API ระดับที่สูงขึ้นที่มีประโยชน์มากขึ้นคือ Managed Pub / Sub Server ซึ่งรวมการสมัครสมาชิก pub / sub ไว้ด้านหลังเธรดที่มีการจัดการ

ไม่ว่าจะด้วยวิธีใด MQ Server ได้รับการออกแบบมาเพื่อประมวลผลข้อความจากไคลเอนต์ MQ เท่านั้นหากคุณกำลังจะใช้งานการส่งข้อความของคุณเองให้ใช้ข้อความของคุณเองและไคลเอนต์ redis ไม่ใช่ไคลเอนต์ MQ หรือคลาส MQ Message

และ

ไม่มี IRedisClient (& ServiceStack.Redis) API สำหรับ Redis Server, PublishMessage API จะส่งคำสั่ง redis PUBLISH IRedisSubscription สร้างการสมัครสมาชิก Redis Pub / Sub โปรดดูเอกสาร Redis เพื่อเรียนรู้ว่า Redis Pub / Sub ทำงานอย่างไร ไลบรารี ServiceStack.Redis และ API ทั้งหมดมีไว้สำหรับเซิร์ฟเวอร์ Redis เท่านั้นไม่มี ServiceStack ใด ๆ การส่งข้อความ MQ API

ดังนั้นเพียงใช้ ServiceStack.Redis สำหรับการสมัครสมาชิก Redis Pub / Sub แบบกำหนดเองของคุณนั่นคืออย่าใช้ ServiceStack.Messaging API ใด ๆ ซึ่งมีไว้สำหรับ ServiceStack MQ เท่านั้น