Эта статья поможет вам понять OpenNJet KV Store и его реализацию.

NGINX становится облачным, все в OpenNJet


1. Знакомство с функциями

OpenNJet реализует функцию постоянного хранения значений ключей и предоставляет соответствующие API для работы со значениями ключей. Исходя из возможностей, предоставляемых KV Store, его можно использовать в следующих сценариях:

  • Сохранение информации о динамической конфигурации модуля
  • Обмен информацией о рабочем состоянии между различными модулями OpenNJet
  • Динамическая настройка параметров рабочего модуля NJet с помощью внешней системы

Например, функция динамической корректировки количества рабочих процессов, предоставляемая в настоящее время OpenNJet, предназначена для запуска управления запущенным рабочим процессом со стороны главного процесса путем установки определенного значения KEY.

2. План реализации

Сообщество открытого исходного кода уже имеет большое количество промежуточных программ, таких как Redis и т. д. Эти промежуточные программы можно использовать в качестве баз данных хранения «ключ-значение». Однако для этого не только требуются соответствующие модули в OpenNJet для взаимодействия с ними, но и увеличивается зависимость на внешних компонентах во время развертывания.

Реализация OpenNJet KV Store использует облегченную базу данных LMDB, находящуюся в памяти. LMDB основан на сопоставлении памяти, что является высокоэффективным и простым в доступе. Он не требует отдельного процесса управления данными, если в коде доступа есть ссылка на библиотеку LMDB. Файловая структура LMDB проста и включает файл данных и файл блокировки. Изоляция транзакций достигается за счет управления блокировками. Файл LMDB может быть открыт несколькими процессами одновременно. Благодаря этому решению общая архитектура становится простой и понятной.

Сравнение функций OpenNJet и других продуктов балансировки нагрузки KV Store:

  OpenNJet nginx ОСС nginx плюс АПИСИКС
Поддерживать ли поддерживать Нет встроенного KV Store поддерживать поддерживать
Метод реализации ЛМДБ / Общая память И т.д.
Применение Restful, Lua, C API / Спокойный, Нью-Джерси Спокойный, Луа
Взимать ли плату Открытый исходный код и бесплатно / Платите за использование Открытый исходный код и бесплатно

3. Инструкция по применению

3.1 API Си

При использовании C для разработки модулей расширения OpenNJet вы можете использовать возможности kv, предоставляемые OpenNJet, для управления kvstore.

Если взять в качестве примера модуль плоскости данных, модуль должен включить заголовочный файл в исходный код OpenNJet:

#include <njt_http_kv_module.h>
Объявление прототипа функции, связанной с kvstore, в заголовочном файле выглядит следующим образом:
int njt_db_kv_get(njt_str_t *key, njt_str_t *value);
int njt_db_kv_set(njt_str_t *key, njt_str_t *value);
int njt_db_kv_del(njt_str_t *key);

Пример кода вызова выглядит следующим образом:

static int kv_get_example()
{
    njt_str_t lmdb_key = njt_string("test_key");
    njt_str_t lmdb_value;
    njt_int_t ok;
    lmdb_value.len=0;
    lmdb_value.data=NULL;
    ok = njt_db_kv_get(&lmdb_key, &lmdb_value);
    if (ok == NJT_OK)
    {
       ...
    }

    return NJT_OK;
}

3.2 Метод Lua

OpenNJet предоставляет инкапсулированный API хранилища kv Lua. Обратитесь к библиотеке Lua "njt.kv" в Lua, а затем используйте функции Lua для управления хранилищем kv. К функциям относятся: db_kv_get, db_kv_set, db_kv_del.

Тестовый код выглядит следующим образом:

location /lua_kv_test {
           content_by_lua_block {
              local kv = require("njt.kv")
              local args, err = njt.req.get_uri_args()
              local key = args["key"]
              local rc,msg = kv.db_kv_get(key)
              if rc == 0 then
                 njt.say("old value is: "..msg)
              else
                 njt.say("there is no such key in kv")
              end

              local newValue = key .."_"..tostring(os.time())
              rc = kv.db_kv_set(key, newValue)
              if rc == 0 then
                 njt.say("set to new value: "..newValue)
              else
               njt.say("error occuried")
              end
           }
         }

        location /lua_kv_del {
          content_by_lua_block {
             local kv=require("njt.kv")
             local args, err= njt.req.get_uri_args()
             local key=args["key"]     
             local _, msg= kv.db_kv_del(key)
             njt.say(msg)
          }
     } 

3.3 Спокойный метод

После установки с использованием пакета RPM, предоставленного официальным сайтом, сгенерированная конфигурация njet_ctrl плоскости управления уже содержит местоположение, которое можно использовать для установки значения kv.

    location /kv {
            dyn_sendmsg_kv;
        }

Вы можете использовать методы Restful, GET, POST и DELETE для работы со значениями ключей.

При установке значения ключа с использованием интерфейса Restful, предоставляемого плоскостью управления, перед ключом будет добавлен префикс «kv_http_». Если вы используете API C или Lua, а значения ключей, заданные интерфейсом Restful, должны взаимодействовать, вам необходимо добавить префикс «kv_http_» при вызове соответствующей функции из API C или Lua.


OpenNJet был впервые основан на базовой версии NGINX1.19 и развивался независимо. Он обладает характеристиками высокой производительности, стабильности и простоты расширения. Он также решает давние проблемы NGINX, такие как трудности динамической настройки и функции управления, влияющие на бизнес.

Официальный сайт почтовой группы 

В Alibaba Cloud произошел серьезный сбой, и все продукты были затронуты (восстановлены).Tumblr охладил российскую операционную систему Aurora OS 5.0.Новый пользовательский интерфейс представил Delphi 12 и C++ Builder 12, RAD Studio 12. Многие интернет-компании срочно нанимают программистов Hongmeng.UNIX time вот-вот вступит эпоха 1,7 миллиардов человек (уже наступила). Meituan набирает войска и планирует разработать системное приложение Hongmeng. Amazon разрабатывает операционную систему на базе Linux, чтобы избавиться от зависимости Android от .NET 8 в Linux. Независимый размер составляет уменьшено на 50% .Выпущен FFmpeg 6.1 "Heaviside".
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/6606114/blog/10141751