Pular para conteúdo

pubsub: Driver de cliente Lua Pubsub para nginx-module-lua baseado na API cosocket

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-pubsub

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-pubsub

Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua está instalado.

Este documento descreve lua-resty-pubsub v1.5 lançado em 13 de novembro de 2024.


Driver de cliente Lua Pubsub para o ngx_lua baseado na API cosocket.

lua module lua module License

Descrição

Esta biblioteca Lua é um driver de cliente Pubsub para o módulo ngx_lua do nginx: http://wiki.nginx.org/HttpLuaModule

Esta biblioteca Lua aproveita a API cosocket do ngx_lua, que garante um comportamento 100% não bloqueante. Esta biblioteca envia mensagens (com atributos) para o Google Cloud pubsub usando temporizadores do nginx e requisições http.

Observe que é necessário pelo menos ngx_lua 0.9.3 ou ngx_openresty 1.4.3.7, e infelizmente apenas o LuaJIT é suportado (--with-luajit).

Sinopse

    server {
        location = /publish {
            resolver 8.8.8.8 ipv6=off;

            content_by_lua_block {
                local cjson = require "cjson"
                local pubsub_producer = require "resty.pubsub.producer"
                local OAUTH_TOKEN = ngx.shared.OAUTH_TOKEN -- Um dicionário diferente também pode ser fornecido

                -- Um callback que receberá mensagens se forem enviadas com sucesso
                -- Tipos de mensagens & err são uma tabela
                local success_callback = function (topic, err, messages)
                    ngx.log(ngx.INFO, "Mensagens: ", cjson.encode(messages), " enviadas com sucesso para o tópico: ", topic)
                end

                -- Um callback que receberá mensagens se falhar
                -- Tipos de mensagens & err são uma tabela
                local error_callback = function (topic, err, messages)
                    for _, message in ipairs(messages) do
                        ngx.log(ngx.ERR, "Falha ao enviar Mensagem: ", cjson.encode(message), " com err: ", cjson.encode(err))
                    end
                end

                local publish = function()

                    -- Configuração do Produtor Pubsub
                    local pubsub_config = {
                        project_id = "demo-project",
                        topic = "demo-topic",
                        pubsub_base_domain = "pubsub.googleapis.com",
                        pubsub_base_port = 443,
                        is_emulator = false,
                        producer_config = {
                            max_batch_size = 200, -- número de pacotes
                            max_buffering = 5000, -- número máximo de pacotes no buffer
                            timer_interval = 10000, -- em milissegundos
                            last_flush_interval = 5000, -- em milissegundos
                            http_timeout = 6000, -- em milissegundos
                            keepalive_max_idle_timeout = 2000, -- em milissegundos
                            keepalive_pool_size = 50
                        },
                        oauth_config = {
                            service_account_key_path = "/etc/key.json", -- Substitua isso pelo seu próprio caminho da chave
                            oauth_base_uri = "https://www.googleapis.com/oauth2/v4/token",
                            oauth_scopes = {
                                "https://www.googleapis.com/auth/pubsub"
                            },
                            oauth_token_dict = OAUTH_TOKEN
                        },
                        success_callback = success_callback,
                        error_callback = error_callback
                    }

                    -- Cria o objeto produtor
                    -- Não importa quantas vezes você chame new, a instância do produtor será gerada uma vez por tópico por processo de trabalho
                    local producer, err = pubsub_producer:new(pubsub_config)

                    -- Também verifique se há algum erro ao inicializar o produtor
                    if err ~= nil then
                        ngx.log(ngx.ERR, "Incapaz de criar produtor pubsub ", err)
                        return
                    end

                    -- Finalmente, envie a mensagem com atributos.
                    local ok, send_err = producer:send("Algum Texto Aleatório", {
                        attr1 = "Teste1",
                        attr2 = "Teste2"
                    }, "chave_de_ordenação_opcional")

                    -- Também verifique se há algum erro ao enviar a mensagem
                    if send_err ~= nil then
                        ngx.log(ngx.ERR, "Incapaz de enviar dados para pubsub: ", send_err)
                        return
                    end

                end

                -- Publicar Mensagem
                publish()
            }

        }
    }

Configurações

Configurações do Produtor

Propriedade Tipo de Dados Descrição Valor Padrão
project_id string Especifica o id do projeto como uma string do seu projeto Pub/Sub nenhum (Obrigatório)
topic string Especifica o tópico no qual os dados precisam ser enviados nenhum (Obrigatório)
pubsub_base_domain string Especifica o domínio base através do qual a conexão http é feita. pubsub.googleapis.com
pubsub_base_port number Especifica a porta do domínio base através da qual a conexão http é feita. 443
is_emulator boolean Especifica um valor booleano. verdadeiro se você estiver se comunicando com. falso
producer_config.max_batch_size number Especifica o tamanho máximo do lote que será enviado para o pubsub. 200
producer_config.max_buffering number Especifica o tamanho máximo do buffer que manterá os dados por um período específico de tempo. 5000
producer_config.timer_interval number (milissegundos) Especifica o intervalo de tempo em que as mensagens obsoletas no buffer são verificadas para publicação. 10000
producer_config.last_flush_interval number (milissegundos) Especifica o intervalo máximo entre o último tempo de descarte e o tempo atual. Usado quando os pacotes no buffer são menores que o tamanho do lote por um período mais longo. 10000
producer_config.http_timeout number (milissegundos) Define a proteção de tempo limite para operações subsequentes, incluindo o método connect. 5000
producer_config.keepalive_max_idle_timeout number (milissegundos) Usado em httpc:set_keepalive que tenta colocar a conexão atual no pool de conexões cosocket do ngx_lua. 2000
producer_config.keepalive_pool_size number Usado em httpc:set_keepalive que tenta colocar a conexão atual no pool de conexões cosocket do ngx_lua. 50
oauth_config.service_account_key_path string Especifica o caminho para a chave da conta de serviço que é usada para autenticar no projeto pub/sub. nenhum (Obrigatório)
oauth_config.oauth_base_uri string Especifica a uri base para a qual a solicitação é feita ao servidor de autorização do Google para um token que será usado em solicitações subsequentes. https://www.googleapis.com/oauth2/v4/token
oauth_config.oauth_scopes lista de string Especifica uma tabela composta por escopos OAuth 2.0 que você pode precisar solicitar para acessar as APIs do Google, dependendo do nível de acesso que você precisa. {"https://www.googleapis.com/auth/pubsub"}
oauth_config.oauth_token_dict lua_shared_dict Especifica uma zona de memória compartilhada entre trabalhadores, para servir como armazenamento para o token oauth. ngx.shared.OAUTH_TOKEN
success_handler function Esta é uma função de callback que será fornecida com todas as mensagens com seus atributos que foram enviadas com sucesso para o pubsub. nenhum (Opcional)
error_handler function Esta é uma função de callback que será executada quando um lote falhar. nenhum (Opcional)

Módulos

resty.pubsub.producer

Para carregar este módulo, basta fazer isso

    local producer = require "resty.pubsub.producer"

Métodos

new

syntax: local p, err = producer:new(pubsub_config)

send

syntax: p:send(message, attributes[, ordering_key])

  • Requer uma mensagem do tipo string, atributos do tipo tabela e uma chave de ordenação opcional do tipo string

Veja Também

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub para nginx-module-pubsub.