Redis
 sql >> Database >  >> NoSQL >> Redis

Come impostare i gestori in RedMQ da eventi generati nel mio dominio

ServiceStack non fa distinzione tra i servizi creati per i servizi MQ, REST, HTML o SOAP, sono la stessa cosa. ovvero accettano ciascuno un DTO di richiesta e, facoltativamente, restituiscono un DTO di risposta e lo stesso servizio può gestire le chiamate da qualsiasi endpoint o formato, ad esempio HTML, REST, SOAP o MQ.

Fare riferimento al diagramma dell'architettura di ServiceStack per vedere come si inserisce MQ.

Limiti

Le uniche cose che devi tenere a mente sono:

  • Come SOAP, MQ supporta solo 1 verbo, quindi i tuoi metodi devono essere denominati Post o Qualsiasi
  • Sono eseguiti solo i filtri delle azioni (cioè non i filtri globali o di attributo)
  • Ottieni stub MqRequest e MqResponse al posto di IHttpRequest , IHttpResponse . Puoi ancora utilizzare .Items per passare i dati attraverso la pipeline delle richieste, ma qualsiasi azione HTTP come l'impostazione di cookie o intestazioni HTTP è benigna

Configurazione di un host Redis MQ

L'host MQ stesso è completamente disaccoppiato dal resto del framework ServiceStack, che non sa che l'MQ esiste finché non passi tu stesso il messaggio in ServiceStack, cosa che viene comunemente eseguita all'interno del tuo gestore registrato, ad esempio:

var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount:2);

mqHost.RegisterHandler<Hello>(m => {
    return this.ServiceController.ExecuteMessage(m);
});

//shorter version:
//mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);


mqHost.Start(); //Starts listening for messages

Nel tuo RegisterHandler<T> specifichi il tipo di richiesta che vuoi che ascolti.

Per impostazione predefinita puoi registrare un solo gestore per ogni messaggio e in ServiceStack una richiesta è legata a un'implementazione del servizio nota, nel caso di MQ cerca una prima corrispondenza della firma del metodo:Post(Hello) e se non esiste cerca il fallback Any(Hello) .

Puoi aggiungere più gestori per messaggio da solo

Se vuoi invocare più gestori, devi semplicemente mantenere la tua List<Handler> ed eseguili tutti quando arriva una richiesta.

Chiamare diversi servizi

Se vuoi chiamare un servizio diverso, traducilo in un DTO di richiesta diverso e passalo invece a ServiceController.

Quando una richiesta MQ viene inviata da qualcuno, ad esempio:

mqClient.Publish(new Hello { Name = "Client" });

Il tuo gestore viene invocato con un'istanza di tipo IMessage in cui il DTO della richiesta è contenuto nel Body proprietà. A quel punto puoi scegliere di scartare il messaggio, convalidarlo o modificarlo.

Le richieste MQ sono le stesse di qualsiasi altra richiesta di servizio

Nella maggior parte dei casi, in genere devi semplicemente inoltrare il messaggio al ServiceController per l'elaborazione, la cui implementazione è:

public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
    return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}

L'implementazione estrae semplicemente la richiesta DTO da mqMsg.Body ed elabora quel messaggio come un normale servizio a cui viene passato un DTO C# Request da quel momento in poi, con un MqRequestContext che contiene gli stub MQ IHttpRequest, IHttpResponse.