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>
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_」プレフィックスを追加する必要があります。
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」がリリースされましたOpenNJetは、NGINX1.19の基本フォークをベースに独自に進化したもので、高性能、安定性、拡張が容易という特徴を持ち、動的構成や管理機能の難しさなどNGINXの長年の課題を解決しています。仕事。