5.5 IVEDI oturum protokolü (/ivedi)

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > Netsim System Agent Kurulum ve Yönetim Kılavuzu > 5. Servis yüzeyleri >

5.5 IVEDI oturum protokolü (/ivedi)

IVEDI işlemcisi motorla doğrudan konuşan istemci-sunucu protokolüdür: bir WebSocket bağlantısı bir motor oturumudur. İstemci GET /ivedi ile yükseltme yapar (oturum çerezi gerekmez), open mesajıyla MASTER login'i ve parolasını verir; ardından execute, prepare / executePrepared, script, fetch ve close ile çalışır. Metin çerçevesi JSON, ikili çerçevesi BSON taşır; yanıt isteğin kodlamasıyla döner. İşlem denetimi (COMMIT, ROLLBACK, SAVEPOINT, SET CATALOG, SET SEARCH_PATH) sıradan SQL deyimleridir. Mesaj sözleşmesinin tamamı NetsimSystemAgent/docs/netsim-system-agent-protokol.md §7'dedir; Python istemcisi ve canlı sınama IVEDI_Code/sqltest/tools/ivedi_client.py ve ivedi_api_test.py. Delphi uygulamaları bu protokole FireDAC sürücüsüyle bağlanır (LIB37\CORE\FireDAC.Phys.IVEDI.pas, DriverID IVEDI; bağlantı parametreleri Server, Port, Path, Database, User_Name, Password, SearchPath, StatementTimeout); motorun kendi istemci katmanı ise EXECUTE STATEMENT ... ON EXTERNAL 'ivedi:sunucu[:port]/veritabanı' ile başka bir ajana ulaşır.

AlanÖndeğerAnlamı
fetchSize500Bir sonuç kümesinin ilk yanıtla dönen satır sayısı ve fetch komutunun öndeğer parça boyu; istemci open / set / execute / fetch ile değiştirebilir.
maxRows0Bir sonuç kümesinden dönen toplam satır üst sınırı; 0 = sınırsız (kalanı imleçle çekilir). Aşılan küme truncated ile döner.
maxFrameSize20000000Kabul edilen en büyük WebSocket çerçevesi (bayt). Dinleyicinin maxContentSize'ı WebSocket çerçevelerini kapsamaz; sınır burada uygulanır.
cursorIdleTimeout300Boşta kalan bir imlecin ömrü (saniye); aşan imleç bir sonraki komutta kapatılır, 0 = sınırsız. Bellek motorunda açık imleç MVCC okuyucusudur ve çöp toplama filigranını sabit tutar.
statementTimeoutMs0Bir deyimin süre sınırı (milisaniye); aşılırsa deyim QUERY_CANCELED (SQLSTATE 57014) ile biter, oturum kullanılabilir kalır. 0 = sınırsız. İstemci open / set ile ya da istek gövdesinde değiştirebilir.
maxInlineBlob1000000Satır içinde taşınan en büyük ikili değer (bayt). Daha büyük bir BLOB / BINARY değeri satırda {blob, size} tutamacı olarak gelir ve readBlob ile parça parça okunur; writeBlob ile yüklenen gövde {blob: id} parametresiyle bağlanır. Durumsuz uçta tutamaç yoktur.
lspDevelopmentModefalseDil sunucusu kipinin geliştirme biçimi (open mode: "lsp" + development: true): oturuma özel bellek içi katalog ve bootstrap betiği. Yalnız tasarım zamanı ajanında açılır.
debugModetruePSQL hata ayıklayıcısı (oturum komutu debug, POST /ivedi/debug). Açıkken DEBUGGER rolündeki login'ler ve SYSDBA kendi oturumlarında hata ayıklayabilir; false hiçbir oturuma izin vermez (bkz. "Hata ayıklama").
debugStopTimeoutMs0Hata ayıklayıcıda bir duraklamanın üst sınırı (milisaniye); dolunca deyim DEBUG_TERMINATED ile biter, oturum kullanılabilir kalır. 0 = sınırsız.
Güvenlik

Oturum yalnız SYSADMIN rolündeki login'ler ve SYSDBA için açılır: bu yüzey hizmet hesabıyla kabuk erişimine eşdeğerdir (#SHELL, OS.Command.Run). Parola open gövdesinde düz metin gider; dinleyicide useSSL ya da ters vekil kullanın. Bir veritabanı seçmek için login'in o veritabanında kullanıcı eşlemesi (CREATE USER ... FOR LOGIN) bulunmalıdır; kullanıcının DEFAULT SEARCH_PATH'i uygulanır. Koşan bir deyim POST /ivedi/cancel ile (connectionId + cancelKey, ikisi de open yanıtından) başka bir bağlantıdan iptal edilir; deyim SQLSTATE 57014 ile biter, oturum kullanılabilir kalır. Dil sunucusu kipi (mode: "lsp", aşağıda) bu kuralın dışındadır: hiçbir şey yürütmediği için SYSADMIN istemez.

Süreç modeli: multiProcess'te bağlantıyı tutan işçi süreç oturumun motor bağlantısını, açık imleçlerini ve hazırlanmış deyimlerini soket kapanana kadar taşır; soket kapanınca hepsi bırakılır ve açık işlem geri alınır. Oturum, uygulamanın sessionManager'ında doğrulanmış bir oturum olarak açılır: idleTimeout / lifeTime sınırları ve AdminREST SESSIONS sayımı oradan gelir. Her oturum bir işçi süreçtir; çok sayıda kısa istek için oturum açmak yerine durumsuz uç kullanılır.

Durumsuz uç: POST /ivedi/execute. Tek HTTP isteği = aç + çalıştır + commit + kapat; oturum ve imleç yoktur. Gövde JSON ya da BSON (Content-Type: application/bson), yanıt aynı kodlamayla; kimlik Basic ya da gövdedeki login / password. Alanlar sql, params, database, maxRows (fazlası truncated), script (çok deyimli betik, hatalar toplanır), statementTimeoutMs. Hatasız istek commit edilir, hatalı istek geri alınır; SQL hatası da 200 + ok: false ile döner, yalnız kimlik reddi 401'dir. Aynı kapı geçerlidir: SYSADMIN ya da SYSDBA.

Olaylar. Motorun POST_EVENT '<ad>' [USING (...)] deyimi COMMIT'te ajanın mesaj kuyruğuna /event/<VERİTABANI>/<ad> konusuyla yayınlanır; bir IVEDI oturumu subscribe ile (ad ya da *) abone olur ve olayı sunucu kaynaklı bir çerçeve olarak alır (notification: "event", gövdede ad, veritabanı ve parametreler). Aynı kuyruk /message ucundan da okunabilir; ROLLBACK yayınlamaz.

SQL izleme. subscribe event: "trace" ile abone olan oturum, ajanın bütün oturumlarında koşan her üst düzey deyimin olayını canlı alır (notification: "trace"): zaman, veritabanı, login, bağlantı, deyim türü (query, command, block, ddl, privilege, transaction, compile), metin, parametre sayısı (değerler gönderilmez), süre, ilk sayfadaki satır sayısı, eklenen / güncellenen / silinen satır, hata ve depolama motoruna giden SQL metinleri. Süzgeç: login, database, kind, minMs. Olaylar saklanmaz; abone yokken üretilmez. Yönetim arayüzünde İzleme → SQL izleme sayfası, msql'de --trace / \trace aynı akışı gösterir.

5.5.1 Dil sunucusu kipi (mode: "lsp")

open mesajında mode: "lsp" verilirse oturum MQL metnini hedef lehçeye çeviren dil sunucusu olur: bağlantı #mode convert to <target> kipinde (target, öndeğer postgresql), veritabanının yerleşik GUEST kimliğiyle ve kip kilidiyle çalışır - DML ve DDL yalnızca metne çevrilir, çalıştırılmaz; bu yüzden SYSADMIN rolü istenmez, geçerli bir MASTER login'i yeter. database kayıt adıdır (boş = MASTER), searchPath verilmezse netsim, eklenti, public uygulanır. Çevrim script ile istenir; yanıtın results[] öğeleri çevrilmiş deyimler (sql / text), uyarılar ve hatalardır (error: SQLSTATE, satır, sütun, deyim); errorCount sıfır değilse çıktı kullanılmamalıdır.

Geliştirme kipi (development: true) tasarım zamanı içindir: kayıtlı bir veritabanına bağlanmak yerine oturuma özel bir bellek içi katalog kurulur, oturumun ilk script'i bootstrap: true ile şemayı o kataloğa yazar ve bağlantı ardından çevrim kipine geçip kilitlenir; oturum kapanınca katalog düşer. Bu kip conf'ta lspDevelopmentMode ile açılır (öndeğer kapalı): bootstrap betiği DDL koşturur - kendi bellek içi kataloğunda ve CREATE / DROP DATABASE reddedilerek, ama koşturur - bu yüzden üretim ajanında kapalı durur.

5.5.2 Hata ayıklama (debug)

Bir IVEDI oturumu kendi deyimlerinin PSQL kodunu (saklı yordam, fonksiyon, paket gövdesi, tetikleyici, EXECUTE BLOCK, betik) durma noktasında durdurur, adım adım yürütür, çağrı yığınını ve değişkenleri okur, istisnada durur. Kapı iki katlıdır: uygulamanın debugMode anahtarı açık olmalı ve login MASTER'da DEBUGGER rolünü taşımalıdır (grant "DEBUGGER" to <login>; SYSDBA muaftır; rol veritabanı hakkı vermez, SYSADMIN'e içkin değildir). İzin open yanıtının capabilities listesinde "debug" olarak görünür.

Akış: debug action: "enable" ile açılır, setBreakpoints ile nesne (ŞEMA.AD, satırlar nesnenin CREATE metnine göre 1 tabanlı) ya da betik için durma noktaları konur; deyim koşarken motor bir durma noktasına gelince sunucu aynı sokete notification: "debug", state: "stopped" çerçevesini yazar (çağrı yığını frames ile), istemci aynı soketten variables / evaluate / stepOver / stepInto / stepOut / continue / terminate gönderir. Koşan bir deyim POST /ivedi/debug ({connectionId, cancelKey, action: "pause"}, iptal ucunun sözleşmesi) ile bir sonraki PSQL deyiminde durdurulur. Duraklama boyunca işlem ve kilitler açık kalır, deyim süre sınırı askıdadır; bağlantı koparsa deyim sonlandırılır. Komut ve çerçeve alanları protokol belgesi §7.10'dadır.

Kapı DEBUGGER rolüdür: değişken değerleri açığa çıktığı için rol yalnız geliştiricilere verilir; debugMode: false ajanı bütünüyle kapatır. Depoya devredilen (EXECUTION STORAGE) yordam ve tetikleyiciler motorda koşmadığından ayıklanamaz.

5.5.3 Başarım

Ölçüm ivedi_api_test.py --only-bench --workers multiProcess|multiThread ile yapılır (Debug ajan, Python istemci, yerel ağ, 10.000 düz satırlık ve 1.000 satır x 2 KB blob'lu tablo, 20 eş zamanlı oturum). Bir kurulumu değerlendirirken bu sayılar ölçek verir:

ÖlçümmultiProcessmultiThread
10.000 executePrepared INSERT, tek tek (JSON)4,32 s4,23 s
1.000 blob'lu INSERT (writeBlob + executePrepared)0,98 s0,98 s
SELECT 10.000 düz satır, JSON, fetchSize 10000,33 s, 534 KB0,32 s, 534 KB
SELECT 10.000 düz satır, BSON, fetchSize 10000,34 s, 798 KB0,35 s, 798 KB
SELECT 1.000 satır x 2 KB blob, JSON, fetchSize 2000,06 s, 2.688 KB0,06 s, 2.688 KB
SELECT 1.000 satır x 2 KB blob, BSON, fetchSize 2000,04 s, 2.040 KB0,04 s, 2.040 KB
20 eş zamanlı oturum (open + 3 sorgu + close)toplam 3,27 s, open ort. 2,22 stoplam 2,12 s, open ort. 1,33 s

Okuma: BSON düz satırda JSON'dan büyüktür (satır dizisinin her öğesine anahtar, tip ve uzunluk yazar), yalnız ikili değer taşıyan sonuç kümelerinde küçüktür (base64 payı yoktur); süre farkı yoktur. Öndeğer JSON kalır, blob taşıyan sorgularda BSON seçilir. İki işçi modeli deyim başına aynı hızdadır: multiThread'de etkin bir WebSocket bağlantısı kendi iş parçacığında kalır ve ancak 200 ms çerçeve gelmezse park edilir; park edilen bağlantıyı dinleyici döngüsü 1 ms adımla yoklar. multiProcess'te oturum açmak daha pahalıdır (bağlantı başına bir işçi süreç); kısa, tek seferlik istekler için durumsuz POST /ivedi/execute ucu vardır, çok sayıda küçük yazma işi tek istekte toplanır (script, Array DML).