Desenvolver a Solução

Cada parte dessa solução foi implementada com Java e usa o Maven para recuperar as dependências necessárias, conforme definido por seu arquivo POM. Ele inclui um script de shell simples que executa o aplicativo chamando o Maven para compilar e executar o código.

Antes de executar o script, você precisa modificar a classe Ambiente em cada caso para definir os detalhes de conexão apropriados; por exemplo, o OCID da Fila, a região de implantação etc. Para a função e o microsserviço, como o código é executado em um contêiner, isso requer algumas etapas adicionais. O arquivo readme no repositório descreve as etapas necessárias para encapsular o JAR em um contêiner. Antes da implantação, os artefatos executáveis da função e do microsserviço hospedado no OKE estão em um Container Registry (OCIR).

Personalizar o Código do Produtor

A implementação do produtor (com.demo.samples.basic.QueueProducer) é muito simples, composta por um método main e dois métodos adicionais que ajudam a produzir o conteúdo da mensagem. O método main cria os objetos de conexão e transmissão e, em seguida, entra em um loop infinito de criação de novas mensagens e envio delas. Para adaptar o payload ao método, você só precisa modificar prepareMessage. Atualmente, esse método cria uma mensagem simples com um GUID e aproveita o fato de que a Fila do OCI permite que a API envie vinte mensagens de cada vez.

Adapte o Código do Consumidor

O consumidor (com.demo.consumer.QueueConsumer) obtém sua configuração das variáveis de ambiente submetidas pela configuração do OKE. Isso facilita muito a reconfiguração do consumidor em Filas diferentes. O volume do trabalho é realizado no método main que, depois de ter uma conexão de fila, executa a solicitação de mensagens. Um método auxiliar chamado prepareGetMessageRequest cria a própria solicitação de mensagem. O método identifica a fila específica e define a duração prepareGetMessageRequeston aguardará uma resposta (permitindo que você configure uma sondagem longa) e o número máximo de mensagens (até 20) que podem ser retornadas.
Depois que as mensagens são recuperadas, o método processMessage as processa.

Observação:

Neste manual, o processo é simplesmente colocado em suspensão, embora você deve entender que um aplicativo real pode precisar de algum tempo para processar a mensagem.
Como o método processMessage aplica um sleep de thread para simular uma carga de trabalho de processamento de mensagem de backend, você verá o mecanismo de dimensionamento funcionar. Depois que todas as mensagens recebidas forem processadas, a Fila será instruída a excluí-las.

Personalizar o Código da Função Tamanho da Fila

A função de tamanho da Fila contém uma classe chamada QueueLength (no pacote com.example.fn) que é implementada de maneira compatível com a forma como uma Função do OCI precisa funcionar. Isso, por sua vez, usa uma classe separada, GetStats, que usa variáveis de ambiente injetadas pela configuração da Função do OCI para estabelecer conexão com a Fila e solicita as estatísticas. Os resultados são obtidos da resposta REST e retornados em uma estrutura JSON.

Dada a simplicidade e a decisão do dimensionamento vertical executado fora da Função, você tem pouca necessidade de modificar este código.

Configurando Definições para Controlar o Dimensionamento

Além de configurar os parâmetros Provedor, Consumidor e Função para que a solução possa se conectar a uma Fila, você precisa configurar as definições para controlar o dimensionamento implementado usando o KEDA. Você pode ver isso em so-object.yaml, que precisa ser enviado ao OKE usando kubectl (todos os comandos são fornecidos no arquivo readme relevante no repositório).

A configuração fornece detalhes que descrevem com que frequência o KEDA precisa acionar a chamada para o API Gateway, os limites de quantas instâncias de serviço de destino são permitidas e o nome do destino. A configuração também inclui a definição do trigger, que indica o URL a ser chamado para obter a demanda atual, e o limite no qual as instâncias podem ser ampliadas ou reduzidas, incluindo o caminho para o objeto JSON retornado ao KEDA para tomar a decisão.