Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Configure o sistema de Mensageria

Aprenda

Índice

Abstração

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 para permitir 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.  

Overview

Conceitos

TermoDefinição
BindingÉ 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ópicosO 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.
ExemploPerson.*
  • 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 uma Mensagem

AçãoDescrição
Crie uma mensagem

Implemente uma classe que represente a mensagem e herde da classe Message

Bloco de código
languagec#
titleClasse Pessoa
linenumberstrue
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
languagec#
titleClasse Pessoa
linenumberstrue
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
languagec#
titleClasse Pessoa
linenumberstrue
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
titleEmpilhe interfaces IPublish<T>

Caso a classe publique mais de uma mensagem, basta implementar uma interface para cada mensagem.

Bloco de código
languagec#
titleClasse Pessoa
linenumberstrue
public class PersonService : IPublish<PersonCreatedEvent>, IPublish<PersonUpdateddEvent>
Dica
titleExtensã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
languagec#
titleRegistre uma nova interface no módulo
linenumberstrue
 .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>))

Assine Mensagens

AçãoDescrição
Crie uma mensagem

Implemente uma classe que represente a mensagem recebida e herde da classe Message

Bloco de código
languagec#
titleClasse Pessoa
linenumberstrue
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
languagec#
titleClasse Pessoa
linenumberstrue
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.

Bloco de código
languagec#
titleClasse Pessoa
linenumberstrue
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
titleEmpilhe interfaces ISubscribe<T>

Caso a classe publique mais de uma mensagem, basta implementar a interface para cada mensagem.

Bloco de código
languagec#
titleClasse Employee
linenumberstrue
public class EmployeeService : ISubscribe<PersonCreatedEvent>, ISubscribe<PersonUpdatedEvent>
Dica
titleExtensã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
languagec#
titleRegistre uma nova interface no módulo
linenumberstrue
 .RegisterInterfacesForPublication(typeof(IMyInterface<>), typeof(IMyCustomInterface<>))

...