pubsub: Pilote client Lua Pubsub pour nginx-module-lua basé sur l'API cosocket
Installation
Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.
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
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-pubsub v1.5 publié le 13 novembre 2024.
Pilote client Lua Pubsub pour le ngx_lua basé sur l'API cosocket.
Description
Cette bibliothèque Lua est un pilote client Pubsub pour le module nginx ngx_lua : http://wiki.nginx.org/HttpLuaModule
Cette bibliothèque Lua tire parti de l'API cosocket de ngx_lua, qui garantit un comportement 100 % non-bloquant. Cette bibliothèque pousse des messages (avec des attributs) vers Google Cloud pubsub en utilisant des temporisateurs nginx et des requêtes http.
Notez qu'au moins ngx_lua 0.9.3 ou ngx_openresty 1.4.3.7 est requis, et malheureusement, seul LuaJIT est pris en charge (--with-luajit).
Synopsis
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 -- Un dictionnaire différent peut également être fourni
-- Un callback qui recevra des messages s'ils sont envoyés avec succès
-- Les types de messages & err sont un tableau
local success_callback = function (topic, err, messages)
ngx.log(ngx.INFO, "Messages: ", cjson.encode(messages), " poussés avec succès vers le sujet: ", topic)
end
-- Un callback qui recevra des messages s'ils échouent
-- Les types de messages & err sont un tableau
local error_callback = function (topic, err, messages)
for _, message in ipairs(messages) do
ngx.log(ngx.ERR, "Échec de l'envoi du message : ", cjson.encode(message), " avec err: ", cjson.encode(err))
end
end
local publish = function()
-- Configuration du Producteur 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, -- nombre de paquets
max_buffering = 5000, -- nombre maximum de paquets dans le tampon
timer_interval = 10000, -- en millisecondes
last_flush_interval = 5000, -- en millisecondes
http_timeout = 6000, -- en millisecondes
keepalive_max_idle_timeout = 2000, -- en millisecondes
keepalive_pool_size = 50
},
oauth_config = {
service_account_key_path = "/etc/key.json", -- Remplacez ceci par votre propre chemin de clé
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
}
-- Créer l'objet producteur
-- Peu importe combien de fois vous appelez new, l'instance du producteur sera toujours générée une fois par sujet par processus de travail
local producer, err = pubsub_producer:new(pubsub_config)
-- Vérifiez également s'il y a une erreur lors de l'initialisation du producteur
if err ~= nil then
ngx.log(ngx.ERR, "Impossible de créer le producteur pubsub ", err)
return
end
-- Enfin, envoyez le message avec des attributs.
local ok, send_err = producer:send("Some Random Text", {
attr1 = "Test1",
attr2 = "Test2"
}, "optional_ordering_key")
-- Vérifiez également s'il y a une erreur lors de l'envoi du message
if send_err ~= nil then
ngx.log(ngx.ERR, "Impossible d'envoyer les données au pubsub: ", send_err)
return
end
end
-- Publier le message
publish()
}
}
}
Configs
Configurations du Producteur
| Propriété | Type de Donnée | Description | Valeur par Défaut |
|---|---|---|---|
| project_id | string | Spécifie l'identifiant du projet sous forme de chaîne de votre projet Pub/Sub | aucun (Requis) |
| topic | string | Spécifie le sujet dans lequel les données doivent être envoyées | aucun (Requis) |
| pubsub_base_domain | string | Spécifie le domaine de base par lequel la connexion http est établie. | pubsub.googleapis.com |
| pubsub_base_port | number | Spécifie le port du domaine de base par lequel la connexion http est établie. | 443 |
| is_emulator | boolean | Spécifie une valeur booléenne. vrai si vous communiquez avec. | faux |
| producer_config.max_batch_size | number | Spécifie la taille maximale du lot qui sera poussé vers pubsub. | 200 |
| producer_config.max_buffering | number | Spécifie la taille maximale du tampon qui contiendra les données pendant une durée spécifique. | 5000 |
| producer_config.timer_interval | number (millisecondes) | Spécifie l'intervalle de temps dans lequel les messages obsolètes dans le tampon sont vérifiés pour publication. | 10000 |
| producer_config.last_flush_interval | number (millisecondes) | Spécifie l'intervalle maximal entre le dernier temps de vidage et le temps actuel. Utilisé lorsque les paquets dans le tampon sont inférieurs à la taille du lot pendant une période prolongée. | 10000 |
| producer_config.http_timeout | number (millisecondes) | Définit la protection par délai d'attente pour les opérations suivantes, y compris la méthode de connexion. | 5000 |
| producer_config.keepalive_max_idle_timeout | number (millisecondes) | Utilisé dans httpc:set_keepalive qui tente de mettre la connexion actuelle dans le pool de connexions cosocket ngx_lua. | 2000 |
| producer_config.keepalive_pool_size | number | Utilisé dans httpc:set_keepalive qui tente de mettre la connexion actuelle dans le pool de connexions cosocket ngx_lua. | 50 |
| oauth_config.service_account_key_path | string | Spécifie le chemin de la clé du compte de service utilisée pour s'authentifier au projet pub/sub. | aucun (Requis) |
| oauth_config.oauth_base_uri | string | Spécifie l'uri de base à laquelle la requête est faite au serveur d'autorisation Google pour un jeton qui sera utilisé dans les requêtes suivantes. | https://www.googleapis.com/oauth2/v4/token |
| oauth_config.oauth_scopes | liste de chaînes | Spécifie un tableau comprenant des portées OAuth 2.0 que vous pourriez avoir besoin de demander pour accéder aux API Google, en fonction du niveau d'accès dont vous avez besoin. | {"https://www.googleapis.com/auth/pubsub"} |
| oauth_config.oauth_token_dict | lua_shared_dict | Spécifie une zone de mémoire partagée entre les travailleurs, pour servir de stockage pour le jeton oauth. | ngx.shared.OAUTH_TOKEN |
| success_handler | fonction | C'est une fonction de rappel qui sera fournie avec tous les messages avec leurs attributs qui sont poussés avec succès vers pubsub. | aucun (Optionnel) |
| error_handler | fonction | C'est une fonction de rappel qui sera exécutée lorsqu'un lot échoue. | aucun (Optionnel) |
Modules
resty.pubsub.producer
Pour charger ce module, il suffit de faire ceci
local producer = require "resty.pubsub.producer"
Méthodes
new
syntax: local p, err = producer:new(pubsub_config)
send
syntax: p:send(message, attributes[, ordering_key])
- Nécessite un message de type chaîne, des attributs de type tableau et une clé d'ordre optionnelle de type chaîne
Voir aussi
- le module ngx_lua : http://wiki.nginx.org/HttpLuaModule
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-pubsub.