Alla ricerca di una comprensione di ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish

Aug 17 2020

Faccio fatica a separare IRedisClient.PublishMessagee IMessageQueueClient.Publishmi rendo conto che devo confondere qualcosa.

ServiceStack ci offre la possibilità di ascoltare trasmissioni pub/sub come questa:

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

Sembra carino, semplice. Ma per quanto riguarda il produttore?

Osservando le classi disponibili, ho pensato che si potesse utilizzare IRedisClient.PublishMessage(string toChannel, string message)o IMessageQueueClient.Publish(string queueName, IMessage message).

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

In entrambi i casi, specifichi tu stesso il nome del canale. Questo è il comportamento che vedo:

  • l'abbonato sopra riceve il messaggio solo se uso IRedisClient.PublishMessage(string toChannel, string message)e mai se usoIMessageQueueClient.Publish(string queueName, IMessage message)
  • Se pubblico utilizzando IRedisClient.PublishMessage, mi aspettavo che il canale "Test" fosse popolato (se visualizzo con un browser Redis), ma non lo è. Non vedo mai alcuna traccia della coda (diciamo che non avvio l'abbonamento, ma i produttori aggiungono messaggi)
  • Se pubblico utilizzando IMessageQueueClient.Publish(string queueName, IMessage message), viene creato il canale "Test" e i messaggi vengono mantenuti lì, ma mai estratti/recuperati ed eliminati.

Voglio capire la differenza tra i due. Ho esaminato il codice sorgente e ho letto tutto quello che potevo al riguardo, ma non ho trovato alcuna documentazione riguardante IRedisClient.PublishMessage.

Risposte

Ted Aug 17 2020 at 21:29

Mythz ha risposto a questa domanda sul forum ServiceStack, qui .

Lui scrive:

Questi client non devono essere usati in modo intercambiabile, dovresti utilizzare solo i client ServiceStack MQ per inviare messaggi MQ o il wrapper Message MQ Message.

L'abbonamento redis è un'API di basso livello per creare un abbonamento Redis Pub/Sub, un'API di livello superiore più utile è il Managed Pub/Sub Server che avvolge l'abbonamento pub/sub dietro un thread gestito.

In ogni caso, MQ Server è progettato solo per elaborare i messaggi dai client MQ, se intendi implementare la tua implementazione di messaggistica utilizza i tuoi messaggi e i client redis non i client MQ o la classe MQ Message.

e

Nessuna API IRedisClient (e ServiceStack.Redis) è per Redis Server, l'API PublishMessage invia il comando redis PUBLISH. IRedisSubscription crea un abbonamento Redis Pub/Sub, consulta i documenti Redis per sapere come funziona Redis Pub/Sub. La libreria ServiceStack.Redis e tutte le sue API sono solo per Redis Server, non contiene alcuna API MQ ServiceStack.Messaging.

Quindi usa semplicemente ServiceStack.Redis per l'implementazione dell'abbonamento Redis Pub/Sub personalizzato, ovvero non utilizzare alcuna API ServiceStack.Messaging che è solo per ServiceStack MQ.