...
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 foi criado uma abstração para permitir 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. A abstração permite também que sejam plugados diversos provedores de mensageria.
Dica |
---|
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". |
Overview
![](/download/attachments/287065881/Getstarted_Configuracao.gif?version=1&modificationDate=1505832954000&api=v2)
Conceitos
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: * | Substitui exatamente uma palavra. |
---|
Exemplo | Person.*- Person.Created (match)
- Person.Created.Event (mismatch)
- Person (mismatch)
|
# | Substituir por nenhuma ou mais letras |
---|
Exemplo | Person# - Person.Create (match)
- PersonCreated.Event (match)
|
|
Exchange Router | É um centralizador de Filas, contendo uma ou mais filas. |
Exchange Type | Define o comportamento de um Exchange Router, sendo: - Topic - Envia uma mensagem para uma ou mais filas que tenham feito bind usando uma routing key;
- * Fanout - Faz um broadcast de uma mensagem para todas as filas registradas;
- * Direct - Envia uma mensagem para uma fila que tenha feito bind usando uma routing key;
- * Rpc - Envia uma mensagem para uma fila e aguarda o seu processamento e retorno (Not implemented).
* Not implemented yet |
| Publique
...
Mensagem
Ação | Descrição |
---|
Crie uma mensagem | Implemente uma classe que represente a mensagem e herde da classe Message Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| 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. Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| 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. Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| 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();
}
} |
Dica |
---|
title | Empilhe interfaces IPublish<T> |
---|
| Caso a classe publique mais de uma mensagem, basta implementar uma interface para cada mensagem. Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| public class PersonService : IPublish<PersonCreatedEvent>, IPublish<PersonUpdateddEvent> |
|
Dica |
---|
title | 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. Bloco de código |
---|
language | c# |
---|
title | Registre uma nova interface no módulo |
---|
linenumbers | true |
---|
| .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |
|
|
Assine Mensagens
Ação | Descrição |
---|
Crie uma mensagem | Implemente uma classe que represente a mensagem recebida e herde da classe Message Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| 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. Bloco de código |
---|
language | c# |
---|
title | Classe Pessoa |
---|
linenumbers | true |
---|
| 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. |
Pessoa | 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);
}
} |
Dica |
---|
title | Empilhe interfaces ISubscribe<T> |
---|
| Caso a classe |
|
publique assine mais de uma mensagem, basta implementar a interface para cada mensagem. Bloco de código |
---|
language | c# |
---|
title | Classe Employee |
---|
linenumbers | true |
---|
| public class EmployeeService : ISubscribe<PersonCreatedEvent>, ISubscribe<PersonUpdatedEvent> |
Dica |
---|
title | 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. Bloco de código |
---|
language | c# |
---|
title | Registre uma nova interface no módulo |
---|
linenumbers | true |
---|
| . |
|
|
|
RegisterInterfacesForPublicationRegisterInterfacesForsubscription(typeof(IMyInterface<>), typeof(IMyCustomInterface<>)) |
|
|
|