この記事では、OpenNJet KV ストアとその実装について理解します。

NGINX はクラウドネイティブに進化し、すべてOpenNJetで実現


1. 機能の紹介

OpenNJet は、永続的なキーと値のストア関数を実装し、キー値を操作するための対応する API を提供します。KV ストアが提供する機能に基づいて、次のシナリオで使用できます。

  • モジュールの動的構成情報の永続化
  • OpenNJetの異なるモジュール間での実行ステータス情報の共有
  • 外部システムによる NJet 実行モジュールの動的パラメータ調整

たとえば、OpenNJet が現在提供している動的な Worker 数調整機能は、特定の KEY 値を設定することで、Master プロセスによる実行中の Worker プロセスの管理をトリガーします。

2. 実施計画

オープン ソース コミュニティには、Redis や Etcd などの多数のミドルウェアがすでにあります。これらのミドルウェアは、キーと値のストレージ データベースとして使用できます。ただし、これには、OpenNJet の対応するモジュールがそれらと対話する必要があるだけでなく、依存性も増加します。デプロイメント中の外部コンポーネント上で。

OpenNJet KV ストアの実装では、軽量のインメモリ データベース LMDB を使用します。LMDB は、効率性が高くアクセスしやすいメモリ マッピングに基づいており、アクセス コードで LMDB ライブラリが参照されている限り、別のデータ管理プロセスは必要ありません。LMDB のファイル構造はデータファイルとロックファイルというシンプルな構成で、ロック制御によるトランザクションの分離が実現されており、複数のプロセスで同時に開くことができます。このソリューションを使用すると、全体的なアーキテクチャがシンプルかつ明確になります。

OpenNJet と他の負荷分散製品 KV ストアの機能比較:

  OpenNJet nginx OSS nginxプラス APISIX
サポートするかどうか サポート 組み込みの KV ストアなし サポート サポート
実現方法 LMDB / 共有メモリ など
使用法 Restful、Lua、C API / ニュージャージー州、休息を 安らかに、ルア
充電するかどうか オープンソースで無料 / 使用料を支払う オープンソースで無料

3. 使用上の注意

3.1 C API

C を使用して OpenNJet 拡張モジュールを開発する場合、OpenNJet が提供する kv 機能を使用して 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 は、カプセル化された Lua kv ストア API を提供します。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 安静な方法

公式 Web サイトから提供される RPM パッケージを使用してインストールした後、生成されたコントロール プレーン njet_ctrl 設定には、kv 値の設定に使用できる場所がすでに含まれています。

    location /kv {
            dyn_sendmsg_kv;
        }

Restful メソッドの GET、POST、および DELETE を使用してキー値を操作できます。

コントロールプレーンが提供するRestfulインターフェースを使用してキーの値を設定する場合、キーの前にプレフィックス「kv_http_」が追加されます。C または Lua API を使用し、Restful インターフェイスによって設定されたキー値を相互運用する必要がある場合は、C または Lua API から対応する関数を呼び出すときに「kv_http_」プレフィックスを追加する必要があります。


OpenNJetは、NGINX1.19の基本フォークをベースに独自に進化したもので、高性能、安定性、拡張が容易という特徴を持ち、動的構成や管理機能の難しさなどNGINXの長年の課題を解決しています。仕事。

メールグループ公式サイト 

Alibaba Cloudが深刻な障害に見舞われ、全製品が影響(復旧) Tumblr がロシアのオペレーティングシステムAurora OS 5.0 を冷却新しいUIが公開 Delphi 12とC++ Builder 12、RAD Studio 12多くのインターネット企業がHongmengプログラマーを緊急採用UNIX時間17 億時代に突入しようとしている (すでに突入している) Meituan が兵力を募集し、Hongmeng システム アプリの開発を計画Amazon が Linux 上の .NET 8 への Android の依存を取り除くために Linux ベースのオペレーティング システムを開発独立した規模はFFmpeg 6.1「Heaviside」がリリースされまし
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/6606114/blog/10141751