API RMQ

Introdução #

O Mastodon possui uma API RMQ, ela deve ser usada quando a aplicação é high performance.

Headers #

Toda mensagem enviada ou recebida pelo Mastodon utiliza headers. Segue a tabela de suas definições.

chavedescrição
m-block-uidUID do block
m-rpcação chamada
m-sigsignify do payload
m-uidUID da aplicação
m-vversao do mastodon
*header de index

m-block-uid #

Representa o UID do Block.

m-rpc #

Representa a ação desejada. São elas:

  • block.create: criar um block
  • block.read: receber um ou mais blocks

m-sig #

Representa a assinatura do payload. Caso seja uma mensagem enviada pela aplicação, ela e’ assinada com a chave privada da mesma. Caso seja uma mensagem enviada pelo Mastodon, sera’ usada a chave privada do Mastodon.

m-uid #

Representa a UID da aplicação. Unica e imutavel.

m-v #

Representa a versão do Mastodon.

* #

Qualquer header que não tem o prefix m- sera’ usada como indexador do block.

Exemplo:

chavevalor
cc1234
directionin
typepix

O Mastodon vai criar o metadado cc com valor 1234, direction com valor in e type com valor pix.

Connection #

Para conectar no Mastodon dentro do Datacenter da StarOne.

URI: amqp://$USER:$KEY@rmq.starone.one/mastodon

Onde $USER deve ser trocado pelo seu usuario e $KEY por sua chave secreta.

Workflow #

  1. A Aplicação deve se conectar ao rabbitmq.
  2. Quando conectar deve-se criar dois Channels, um de receive e outro de sender. Toda mensagem consumida deve vir do channel receive, e por sua vez, toda mensagem enviada ao rabbitmq deve ser feita a partir do sender.
  3. O channel receive deve consumir as mensagens da Queue: channel-app, onde app deve ser trocado pelo UID da sua aplicacao. Por exemplo, se sua app tem o UID 45ab12, o nome da queue vai ser channel-45ab12.
  4. O envio de mensagens de request e block deve ser feito com o channel sender para a exchange mastodon.

Recomendações #

  • Abrir apenas uma connection por aplicação.
  • Utilizar dois channels, um para escrita, outro para leitura.
  • Consumir as mensagens o mais rapido possível, elas tem um TTL de 1 minuto.

Block #

Create #

Use header: m-rpc => block.create para criar um block.

Estrutura #

As mensagens de block devem conter os seguintes headers:

chavedescrição
m-uidUID da aplicação
m-sigsignify do payload
m-rpcblock.create

O payload deve conter o block que deseja persistir.

Workflow #

  1. O UID da Aplicação deve ser atribuido ao header m-uid do payload.
  2. O block deve ser atribuido ao body do payload que sera' enviado via o channel sender.
  3. A Aplicação deve utilizar a chave privada para criar uma assinatura do block. Essa assinatura deve ser atribuida ao header m-sig do payload.
  4. Completado os passos anteriores, o payload pode agora ser enviado para a exchage no rabbitmq.

Notificação de Sucesso #

Toda mensagem de block retorna uma mensagem de sucesso com a seguinte estrutura de headers:

chavedescrição
m-uidUID da aplicação
m-sigsignify do payload

O signify do payload é o mesmo utilizado no envio da mensagem de block.

Notificação de Falha #

Não existe uma mensagem de notificação de falha na criação do block.

Read #

Para ler um ou mais blocks, use header: m-rpc => block.read.

Estrutura #

As mensagens de block devem conter os seguintes headers:

chavedescrição
m-rpcblock.read
m-uidUID da aplicação
m-sigsignify do payload

Notification #