ServiceStack.Redis की समझ लेना

Aug 17 2020

मैं एक मुश्किल समय अलग हो रहा है IRedisClient.PublishMessageऔर IMessageQueueClient.Publishऔर महसूस मैं कुछ मिश्रण होना चाहिए।

ServiceStack हमें इस तरह पब / उप प्रसारण के लिए सुनने का विकल्प देता है:

    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, तो मुझे उम्मीद है कि "टेस्ट" चैनल आबाद होगा (यदि मैं एक रेडिस ब्राउज़र के साथ देखता हूं), लेकिन यह नहीं है। मुझे कभी भी कतार का कोई निशान नहीं दिखता (मान लें कि मैं सदस्यता शुरू नहीं करता, लेकिन निर्माता संदेश जोड़ते हैं)
  • यदि मैं उपयोग करके प्रकाशित करता हूं IMessageQueueClient.Publish(string queueName, IMessage message), तो चैनल "टेस्ट" बनाया जाता है और संदेश वहां बने रहते हैं, लेकिन कभी भी पॉप-अप / प्रसारित और हटाए नहीं गए।

मैं दोनों के बीच के अंतर को समझना चाहता हूं। मैंने स्रोत कोड को देखा है और इसके बारे में सभी पढ़ सकते हैं, लेकिन मुझे इसके बारे में कोई दस्तावेज नहीं मिला है IRedisClient.PublishMessage

जवाब

Ted Aug 17 2020 at 21:29

Mythz ने इसका जवाब यहां ServiceStack फोरम पर दिया ।

वह लिखता है:

इन ग्राहकों को परस्पर उपयोग नहीं किया जाना चाहिए, आपको केवल एमक्यू संदेश या संदेश एमक्यू संदेश आवरण भेजने के लिए सर्विसस्टैक एमक्यू क्लाइंट का उपयोग करना चाहिए।

Redis Pub / Sub सब्सक्रिप्शन बनाने के लिए रेडिस सब्सक्रिप्शन निम्न स्तर का API है, एक अधिक उपयोगी उच्च स्तरीय API प्रबंधित प्रबंधित पब / सब सर्वर है जो प्रबंधित थ्रेड के पीछे पब / सब सब्सक्रिप्शन को लपेटता है।

किसी भी तरह से, एमक्यू सर्वर को केवल एमक्यू क्लाइंट से संदेशों को संसाधित करने के लिए डिज़ाइन किया गया है, यदि आप अपने स्वयं के संदेश कार्यान्वयन को लागू करने जा रहे हैं तो अपने स्वयं के संदेशों और रेडिस क्लाइंट का उपयोग करें न कि एमक्यू क्लाइंट या एमक्यू संदेश वर्ग।

तथा

कोई IRedisClient (& ServiceStack.Redis) API Redis Server के लिए है, PublishMessage API Redis PUBLISH कमांड भेजता है। IRedisSubscription Redis Pub / Sub सब्सक्रिप्शन बनाता है, Redis Pub / Sub कैसे काम करता है, यह जानने के लिए Redis डॉक्स देखें। ServiceStack.Redis पुस्तकालय और इसके सभी API सिर्फ Redis Server के लिए हैं, इसमें कोई भी ServiceStack.Messaging MQ API शामिल नहीं है।

तो बस अपने कस्टम Redis पब / उप सदस्यता कार्यान्वयन के लिए ServiceStack.Redis का उपयोग करें, अर्थात किसी भी ServiceStack.Messaging API का उपयोग न करें जो केवल ServiceStack MQ के लिए है।