Alla ricerca di una comprensione di ServiceStack.Redis: IRedisClient.PublishMessage vs IMessageQueueClient.Publish
Faccio fatica a separare IRedisClient.PublishMessage
e IMessageQueueClient.Publish
mi 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
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.