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.
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
- o módulo ngx_lua: http://wiki.nginx.org/HttpLuaModule
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub para nginx-module-pubsub.