Aller au contenu

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.

lua module lua module License

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

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.