|
<< İç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ğer | Anlamı |
|---|---|---|
fetchSize | 500 | Bir 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. |
maxRows | 0 | Bir 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. |
maxFrameSize | 20000000 | Kabul edilen en büyük WebSocket çerçevesi (bayt). Dinleyicinin maxContentSize'ı WebSocket çerçevelerini kapsamaz; sınır burada uygulanır. |
cursorIdleTimeout | 300 | Boş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. |
statementTimeoutMs | 0 | Bir 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. |
maxInlineBlob | 1000000 | Satı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. |
lspDevelopmentMode | false | Dil 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. |
debugMode | true | PSQL 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"). |
debugStopTimeoutMs | 0 | Hata 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. |
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.
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.
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.
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.Ö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çüm | multiProcess | multiThread |
|---|---|---|
10.000 executePrepared INSERT, tek tek (JSON) | 4,32 s | 4,23 s |
1.000 blob'lu INSERT (writeBlob + executePrepared) | 0,98 s | 0,98 s |
| SELECT 10.000 düz satır, JSON, fetchSize 1000 | 0,33 s, 534 KB | 0,32 s, 534 KB |
| SELECT 10.000 düz satır, BSON, fetchSize 1000 | 0,34 s, 798 KB | 0,35 s, 798 KB |
| SELECT 1.000 satır x 2 KB blob, JSON, fetchSize 200 | 0,06 s, 2.688 KB | 0,06 s, 2.688 KB |
| SELECT 1.000 satır x 2 KB blob, BSON, fetchSize 200 | 0,04 s, 2.040 KB | 0,04 s, 2.040 KB |
| 20 eş zamanlı oturum (open + 3 sorgu + close) | toplam 3,27 s, open ort. 2,22 s | toplam 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).