Configure o sistema de Mensageria
Aprenda
A arquitetura de mensageria do TNF baseia-se nos conceitos da especificação AMQP. Com a abrangência de cenários e o extenso detalhamento da especificação AMQP foi criado uma abstração fortemente baseada no protocolo. Além de padronizar a comunicação com diferentes provedores também permite que outros protocolos, como por exemplo o MQTT, sejam utilizados dentro do TNF de forma transparente.
Atualmente o TNF suporta o RabbitMQ versão 3.6.14.
Para que o RabbitMQ trabalhe com o protocolo AMQP você deve habilitá-lo nas configuração de plugins localizado dentro da pasta "sbin" no diretório de instalação do RabbitMQ.
Para fazer isso dentro deste diretório abra um utilitário de linha de comando e execute: "rabbitmq-plugins enable amqp_client".
Você também pode consultar quais os plugins do RabbitMQ estão habilitados executando: "rabbitmq-plugins list".
| Termo | Definição | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Binding | É o relacionamento entre um ExchangeRouter e uma Queue. O binding de uma Queue em um Exchange Router utilizando uma routingkey, permite o roteamento de mensagens. | ||||||||
| Mensagem | É um objeto serializado que é enviado para o sistema de mensageria. O TNF vincula fortemente o objeto de mensagem, tanto para sua publicação ou assinatura, afim de garantir que uma dada mensagem será manipulada. | ||||||||
| Tópicos | O Tópico é uma abstração que garante que toda a mensagem que for enviada para o sistema de mensageria seja manipulada por uma classe concreta. Isso é feito através o relacionamento que o Tópico cria entre Routing Keys, Queues e Mensagens. | ||||||||
| Routing Key | É uma string utilizada como chave para identificar um Bind entre ExchangeRouter e Queues. Essa identificação faz o roteamento de mensagens na infraestrutura de mensageria e TNF. A Routing Key trabalha com os seguintes coringas:
| ||||||||
| Exchange Router | É um centralizador de Filas, contendo uma ou mais filas. | ||||||||
| Exchange Type | Define o comportamento de um Exchange Router, sendo:
* Not implemented yet | ||||||||
| Ação | Descrição |
|---|---|
| Crie uma mensagem | Implemente uma classe que represente a mensagem e herde da classe Message Classe Pessoa public class PersonCreatedEvent : Message
{
public string Name { get; set; }
public string Lastname { get; set; }
public int Age { get; set; }
}
|
| Defina o ponto de publicação | Escolha ou crie uma classe que será responsável por publicar uma ou mais mensagem. Classe Pessoa public class PersonService
{
(...)
public void Create(Person person) =>
_repository.Create(person);
}
|
| Implemente a interface IPublish<> e publique | Toda classe que publica mensagem deve implementar a interface IPublish<T> onde T é um Message. Substitua T pela mensagem que será publicada e implemente a interface. Classe Pessoa public class PersonService : IPublish<PersonCreatedEvent>
{
(...)
public void Create(Person person)
{
_repository.Create(person);
var message = new PersonCreatedEvent(person.Name, person.LastName, person.Age);
Handle(message);
}
public void Handle(PersonCreatedEvent message)
{
// Processa alguma regra antes de publicar a mensagem
message.Publish();
}
}
Empilhe interfaces IPublish<T> Caso a classe publique mais de uma mensagem, basta implementar uma interface para cada mensagem. Classe Pessoa public class PersonService : IPublish<PersonCreatedEvent>, IPublish<PersonUpdateddEvent> Extensão de interfaces para publicação Além da interface padrão IPublish<T>, é possível adicionar novas interfaces para serem manipuladas pelo sistema de mensageria. Para isso, acesse o Builder de configuração do módulo de mensageria e configure a interface. Registre uma nova interface no módulo .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |
| Ação | Descrição |
|---|---|
| Crie uma mensagem | Implemente uma classe que represente a mensagem recebida e herde da classe Message Classe Pessoa public class PersonCreatedEvent : Message
{
public string Name { get; set; }
public string Lastname { get; set; }
public int Age { get; set; }
}
|
| Defina o ponto de subscrição | Escolha ou crie uma classe que será responsável por subscreber uma ou mais mensagens. Classe Pessoa public class EmployeeService
{
public void Create(Employee employee) =>
_repository.Create(employee);
}
|
| Implemente a interface ISubscribe<T> e assine | Toda classe que subscrever uma ou mais mensagens implementa a interface ISubscribe<T> onde T é um Message. Substitua T pela mensagem que será assinada e implemente a interface. Classe Employee public class EmployeeService : ISubscribe<PersonCreatedEvent>
{
public void Create(Employee employee)
{
(...)
_repository.Create(employee);
}
public void Handle(PersonCreatedEvent message)
{
var employee = new Employee(message.Name, message.Lastname, message.Age);
Create(employee);
}
}
Empilhe interfaces ISubscribe<T> Caso a classe assine mais de uma mensagem, basta implementar a interface para cada mensagem. Classe Employee public class EmployeeService : ISubscribe<PersonCreatedEvent>, ISubscribe<PersonUpdatedEvent> Extensão de interfaces para assinaturas Além da interface padrão ISubscribe<T>, é possível adicionar novas interfaces para serem manipuladas pelo sistema de mensageria. Registre uma nova interface no módulo .RegisterInterfacesForsubscription(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |