Skip to main content

Python Rabbit wrapper library to simplify to use Exchanges and Queues with decorators

Project description

HIJIKI - Gerenciamento de Mensagens com RabbitMQ

📚 Sobre a biblioteca HIJIKI

Versão 2

Este documento descreve a biblioteca HIJIKI versão 2, que é uma evolução da versão 1, mantendo compatibilidade com o código existente. A versão 2 introduz melhorias significativas na estrutura e funcionalidade, mas não altera a API pública, garantindo que os usuários possam migrar facilmente sem necessidade de ajustes no código já implementado. para acesso a versão 1, consulte a documentação da versão 1 e para fontes a tag v1_latest

HIJIKI é uma biblioteca Python de alto nível para gerenciamento de mensagens orientada a eventos, destinada a facilitar a criação, configuração e uso de consumidores e produtores de mensagens, principalmente utilizando RabbitMQ como broker. Seu objetivo é abstrair detalhes de implementação de fila e troca de mensagens, oferecendo uma interface intuitiva, flexível e adequada tanto para aplicações web quanto scripts standalone.

Principais Características:

  • Builder pattern para configuração (MessageManagerBuilder), facilitando setup e customizações complexas.
  • Gerenciamento simplificado de consumidores: registre consumidores (filas, tópicos e handlers) rapidamente usando uma API intuitiva.
  • Publicação fácil de mensagens: uso direto de métodos para publicar em tópicos/fila, com suporte a mapeamento customizado de payloads.
  • Suporte a múltiplos brokers: arquitetura pronta para suporte a outros brokers, embora os exemplos estejam focados em RabbitMQ.
  • Extensível: pode ser integrada a decorators e middlewares para aplicações async/web como FastAPI ou scripts tradicionais.
  • Métodos utilitários para manutenção do ciclo de vida do consumo, verificação de saúde (is_alive), troca dinâmica do broker, e registro em execução.

Principais Classes:

  • MessageManagerBuilder: Classe principal para construir e configurar a stack.
  • MessageManager: Gerencia operações de envio e consumo de mensagens.
  • ConsumerData: Estrutura que associa uma fila, tópico e função handler.

📦 Instalação

Clone este repositório e instale as dependências:

git clone https://github.com/asengardeon/hijiki.git
cd hijiki
pipenv  install

⚙️ Detalhamento técnico dos métodos de uso

A seguir, um resumo técnico dos principais métodos empregados para utilizar a biblioteca HIJIKI na prática:

1. Criação e configuração do Manager

A configuração é feita via padrão builder, permitindo customização das conexões e parâmetros:

manager = (
    MessageManagerBuilder()
    .with_host("localhost")
    .with_port(5672)
    .with_user("user")
    .with_password("pwd")
    # outras opções, como troca do broker, etc.
    .build()
)
  • with_host(host: str): define o endereço do broker RabbitMQ.
  • with_port(port: int): configura a porta de conexão.
  • with_user(user: str), with_password(password: str): definem credenciais.
  • with_cluster_hosts(cluster_hosts: str): define o endereço caso você precise se conectar a uma instância de múltiplos clusters.
  • with_virtual_host(virtual_host: str): define a qual virtual host de uma instância a conexão é feita
  • with_secure_protocol(use_secure_protocol: bool): define o uso ou não do protocolo amqps em vez do amqp, que é usado por padrão
  • build(): instancia e retorna o manager, pronto para uso.

2. Registro de consumidores

Criando consumidor manualmente

É preciso criar uma instância de ConsumerData associando uma fila, tópico e função de processamento.

Além dessas informações obrigatórias, o ConsumerData permite a customização de outros tipos de parâmetros. Por exemplo, caso você precise consumir filas e exchanges de uma instância que não esteja utilizando os parâmetros padrões usados por esta lib, como os tipos das filas e exchanges, é possível passar os tipos por meio dos parâmetros queue_type e exchange_type durante a instanciação da ConsumerData.

O método create_consumer adiciona consumidores ao manager:

def process_message(msg):
    print(f"Mensagem recebida: {msg}")

consumer_data = ConsumerData("nome_da_fila", "nome_do_topico", process_message)
manager.create_consumer(consumer_data)
  • O handler (função) será chamada a cada mensagem recebida nessa fila/tópico.

##Criando consumidor com decorator Você também pode usar o decorator @consumer_handler para registrar consumidores de forma mais simples:

Modelo apenas determinando a fila

@consumer_handler(queue_name="teste1")
    def internal_consumer(data):
        print(f"consumiu o valor:{data}")
        result_data_list.append(data)
        result_event_list.append('received event')

Modelo determinando fila e que não cria fila DLQ automaticamente, aconselhado para consumidores dde filas DLQ

    @consumer_handler(queue_name="teste1_dlq", create_dlq=False)
    def internal_consumer_dlq(data):
        print(f"consumiu o valor:{data}")
        result_event_list_dlq.append('received event')

Modelo determinando fila e tópico

    @consumer_handler(queue_name="fila_erro", topic="erro_event")
    def internal_consumer_erro(data):
        print(f"consumiu o valor:{data}")
        result_event_list.append('received event')
        raise Exception("falhou")

Modelos com uso de routing_key

    @consumer_handler(queue_name="teste_with_specific_routing_key", topic='teste1_event',
                      routing_key="specific_routing_key")
    def internal_consumer(data):
        print(f"consumiu o valor:{data}")
        result_data_list.append(data)
        result_data_list_dlq_for_specific_routing_key.append('received event')

3. Início do consumo

O método start_consuming inicia loops de consumo das filas para todos consumidores registrados:

manager.start_consuming()
  • No FastAPI, recomenda-se executar em thread separada para não bloquear o servidor.

4. Publicação de mensagens

O método publish envia mensagens diretamente para a fila/ tópico definido:

manager.publish("nome_da_fila", "Conteúdo da mensagem")

Por padrão, a publicação das mensagens é feita seguindo o formato { "value": <conteúdo da mensagem> }, para filas do tipo topic, sem routing_key e parâmetro reply_to. Todos estes podem ser customizados se seu caso de uso não se adequar a isso:

def custom_message_mapper(_topic: str, data: str):
  return { "id": uuid(), "data": data }

manager.publish(
  "nome_da_fila",
  "Conteúdo da mensagem",
  message_mapper=custom_message_mapper
  routing_key="my_routing_key",
  reply_to="my_response_queue_name"
)
  • Mensagens podem ser publicadas a partir de endpoints FastAPI ou scripts Python, conforme exemplo.

📦 Pré-requisitos

  • RabbitMQ rodando na máquina local (localhost:5672) ou disponível remotamente.
  • Dependências Python instaladas:
    • pipenv install (na raiz do projeto)
    • Bibliotecas necessárias: pika, fastapi, uvicorn, entre outras já incluídas no Pipfile do projeto.

Estrutura dos Exemplos

  • fastapi_example.py
    Demonstra como criar endpoints FastAPI para publicar mensagens e inicializar consumidores utilizando HIJIKI.

  • pure_python_example.py
    Demonstra como publicar e consumir mensagens programaticamente, usando apenas Python puro, sem framework web.


▶️ Como executar os exemplos

1. Exemplo FastAPI

Passo a passo

  1. Suba o RabbitMQ em sua máquina local (padrão: usuário user, senha pwd, porta 5672)
    Se usar outro usuário/senha/host, edite o exemplo conforme necessário.

  2. Execute o servidor FastAPI:

    uvicorn examples.fastapi_example:app --reload
    
  3. Interaja com a API:

    • Publique uma mensagem:
      curl -X POST "http://localhost:8000/publish/fastapi_queue" -H  "accept: application/json" -d "message=Olá do FastAPI"
      
    • Veja os consumidores recebendo mensagens no terminal onde o servidor está rodando (mensagens são exibidas via print).

Observações

  • O consumidor é registrado e inicializado automaticamente ao subir o FastAPI.
  • O consumo roda em uma thread em paralelo ao servidor web.

2. Exemplo Python Puro

Passo a passo

  1. Suba o RabbitMQ em sua máquina local (localhost:5672).

  2. Execute o script:

    python examples/pure_python_example.py
    
  3. Verifique a saída:

    • O script publica uma mensagem inicial, registra o consumidor e começa a consumir mensagens da fila python_queue.
    • O consumidor imprime no console todas as mensagens recebidas.

Observações

  • Use Ctrl+C para interromper o consumo.

💡 Dicas e Customizações

  • Para consumir de outras filas ou alterar tópicos, edite os nomes nos exemplos.
  • Você pode registrar múltiplos consumidores, basta criar mais instâncias de ConsumerData e passar para manager.create_consumer().
  • Troque usuário, senha ou porta caso sua instância RabbitMQ seja diferente.

🛠️ Sobre a arquitetura utilizada

  • Os consumidores são instâncias de ConsumerData, que associam fila, tópico e função de processamento.
  • O método manager.start_consuming() inicia o consumo registrado para as filas configuradas.
  • O exemplo FastAPI utiliza um thread para que o consumo de mensagens ocorra junto do serviço web.

❓ Dúvidas ou Sugestões?

Abra uma issue no repositório principal do projeto, ou envie sugestões/contribuições!


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hijiki-2.0.85.tar.gz (32.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hijiki-2.0.85-py3-none-any.whl (29.6 kB view details)

Uploaded Python 3

File details

Details for the file hijiki-2.0.85.tar.gz.

File metadata

  • Download URL: hijiki-2.0.85.tar.gz
  • Upload date:
  • Size: 32.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for hijiki-2.0.85.tar.gz
Algorithm Hash digest
SHA256 cf9c9f2053f39646837e8552e5572bfe0c53fa7bf2d6d625a6a2c99b13b865e4
MD5 93f3735e772e1b0f494a377a27329750
BLAKE2b-256 d3737286390d578e8da43ca5bf3f527bba7a141b9f045311358004e9055a1f33

See more details on using hashes here.

File details

Details for the file hijiki-2.0.85-py3-none-any.whl.

File metadata

  • Download URL: hijiki-2.0.85-py3-none-any.whl
  • Upload date:
  • Size: 29.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for hijiki-2.0.85-py3-none-any.whl
Algorithm Hash digest
SHA256 09289a6dd8ceaa273e3326f7e0ce4580219b603f5aab4140081dfca01d65d666
MD5 6e72e433f5ba736de8d85274ab627dee
BLAKE2b-256 d606b96c85c552db20f04a770ce0354d5948d60d7527db02e9a48ab03f930214

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page