Proje Önbelleği
Project Cache API, API işlemleri için projelerin bellek içi yüklenmesini yönetir. Projelerin ne zaman yüklenmesi gerektiğini anlamak, verimli API kullanımı için esastır.
Temel Kavramlar
Birleşik Önbellek Mimarisi
API ve UI aynı bellek içi önbelleği paylaşır. API üzerinden bir proje yüklendiğinde, UI tarafından kullanılan önbellek ile aynıdır. Bu şu anlamlara gelir:
- Paylaşılan Durum: API işlemleri UI kullanıcılarıyla aynı veriyi görür
- Paylaşılan Sonuçlar: Çalıştırma sonuçları API ve UI tarafından görünür
- Farklı Görünümler Yok: API ve UI'nın proje üzerinde farklı görüşleri olması imkansızdır
İşlem Kategorileri
API işlemleri önbellekleme gereksinimleri açısından üç kategoriye ayrılır:
| Kategori | Açıklama | Proje Yüklemesi Gerekli mi? | Örnekler |
|---|---|---|---|
| Direct DB | Sadece okuma işlemleri | Hayır | GET uç noktaları, tenant/kullanıcı yönetimi |
| Auto-Load | Değişiklik işlemleri | Hayır (otomatik yükler) | Araştırmalar, not defterleri, bloklar üzerinde POST/PUT/DELETE |
| Requires Load | Çalıştırma işlemleri | Evet | Not defteri çalıştırma, çalıştırma sonuçlarını alma |
Otomatik Yükleme Deseni (Basitleştirilmiş İş Akışı)
Çoğu CRUD işlemi için proje açıkça yüklenmesine gerek yoktur. API gerektiğinde projeyi otomatik olarak yükler:
# ESKİ iş akışı (CRUD için artık gerekmez):
# manager.load_project(project_id) # Gerekli değil!
# YENİ iş akışı - sadece işlemi doğrudan çağırın:
response = requests.put(
f"{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/notebook/{notebook_id}",
json={"Name": "Updated Name"},
headers=headers
)
# Gerekirse proje otomatik olarak yüklenir
Ne Zaman Açık Yükleme GEREKLİDİR
Projenin açıkça yüklenmesi hala çalıştırma işlemleri için zorunludur:
POST /execution/notebook/{notebookId}- Not defterini çalıştırGET /execution/notebook/{notebookId}/results- Çalıştırma sonuçlarını alGET /execution/status/{notebookId}- Çalıştırma durumunu kontrol et
Projeyi Önbelleğe Yükle
GET /api/{tenantId}/project/{projectId}/load
Projeyi paylaşılan önbelleğe yükler. Not defterlerini çalıştırmadan önce kullanın.
Yol Parametreleri
| Parametre | Tür | Zorunlu | Açıklama |
|---|---|---|---|
tenantId |
GUID | Evet | Tenant kimliği |
projectId |
GUID | Evet | Proje kimliği |
Yanıt (200 OK)
{
"projectId": "87654321-4321-4321-4321-210987654321",
"projectName": "Purchase Order Analysis",
"tenantName": "acme-corp",
"investigationCount": 5,
"notebookCount": 12,
"datasetCount": 3,
"loadedFromCache": false,
"message": "Project loaded from database"
}
Yanıt Alanları
| Alan | Tür | Açıklama |
|---|---|---|
projectId |
GUID | Proje kimliği |
projectName |
string | Proje adı |
tenantName |
string | Tenant adı |
investigationCount |
integer | Araştırma sayısı |
notebookCount |
integer | Not defteri sayısı |
datasetCount |
integer | Veri seti sayısı |
loadedFromCache |
boolean | Eğer önbellekte mevcutsa true, veritabanından yüklendiyse false |
message |
string | İnsan tarafından okunabilir durum mesajı |
Önbellek Davranışı
| Senaryo | Yanıt | Performans |
|---|---|---|
| İlk çağrı (önbellek yok) | loadedFromCache: false |
~1000ms (veritabanı sorgusu) |
| Sonraki çağrılar (önbellek var) | loadedFromCache: true |
~75ms (13 kat daha hızlı) |
| 30 dk hareketsizlik sonrası | Önbellek süresi dolar | Sonraki çağrı tekrar yükler |
Önbellek Özellikleri
- Süre: Son erişimden sonra 30 dakika
- Otomatik yenileme: Projeye yapılan her API çağrısı 30 dakikalık sayacı sıfırlar
- Paylaşılan: Aynı önbellek UI ve API tarafından kullanılır
- Bellek Yönetimi: %90 bellek kullanımında otomatik temizlik
Projeyi Önbellekten Kaldır
DELETE /api/{tenantId}/project/{projectId}/unload
Projeyi önbellekten kaldırır, belleği boşaltır.
Yol Parametreleri
| Parametre | Tür | Zorunlu | Açıklama |
|---|---|---|---|
tenantId |
GUID | Evet | Tenant kimliği |
projectId |
GUID | Evet | Proje kimliği |
Yanıt (200 OK)
{
"projectId": "87654321-4321-4321-4321-210987654321",
"wasInCache": true,
"message": "Project unloaded from cache successfully"
}
İş Akışı Örnekleri
İş Akışı A: CRUD İşlemleri (Otomatik Yükleme)
Araştırma, not defteri veya blok oluşturma, güncelleme veya silme için:
import requests
headers = {"Authorization": f"Bearer {API_KEY}"}
# Yalnızca işlemi doğrudan çağırın - yüklemeye gerek yok!
response = requests.post(
f"{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/investigation",
json={"name": "New Investigation", "description": "Created via API"},
headers=headers
)
# Gerekirse proje otomatik olarak yüklenir
İş Akışı B: Not Defteri Çalıştırma (Yükleme Gerekir)
Not defterlerini çalıştırmak ve sonuçları almak için:
import requests
import time
headers = {"Authorization": f"Bearer {API_KEY}"}
# Adım 1: Projeyi yükle (Çalıştırma için GEREKLİ)
response = requests.get(
f"{BASE_URL}/api/{TENANT_ID}/project/{PROJECT_ID}/load",
headers=headers
)
print(f"Proje yüklendi: {response.json()['projectName']}")
# Adım 2: Not defterini çalıştır
response = requests.post(
f"{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/execution/notebook/{NOTEBOOK_ID}",
headers=headers
)
print(f"Çalıştırma kuyruğa alındı: {response.json()['status']}")
# Adım 3: Tamamlanmayı kontrol et
while True:
response = requests.get(
f"{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/execution/status/{NOTEBOOK_ID}",
headers=headers
)
status = response.json()
print(f"Durum: {status['status']} ({status['progress']}%)")
if status['status'] == 'Completed':
break
time.sleep(2)
# Adım 4: Sonuçları al
response = requests.get(
f"{BASE_URL}/api/{TENANT_ID}/{PROJECT_ID}/execution/notebook/{NOTEBOOK_ID}/results",
headers=headers
)
results = response.json()
# Adım 5: Projeyi önbellekten kaldır (isteğe bağlı temizlik)
requests.delete(
f"{BASE_URL}/api/{TENANT_ID}/project/{PROJECT_ID}/unload",
headers=headers
)
Uygulama Örnekleri
cURL
# Projeyi önbelleğe yükle
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/load" \
-H "Authorization: Bearer YOUR_API_KEY"
# Projeyi önbellekten kaldır
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/unload" \
-H "Authorization: Bearer YOUR_API_KEY"
Python
import requests
TENANT_ID = '12345678-1234-1234-1234-123456789012'
BASE_URL = 'https://your-mindzie-instance.com'
class ProjectCacheManager:
def __init__(self, token):
self.headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
self.loaded_projects = set()
def load_project(self, project_id):
"""Projeyi önbelleğe yükle (çalıştırma işlemleri için gereklidir)."""
url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/load'
response = requests.get(url, headers=self.headers)
response.raise_for_status()
result = response.json()
self.loaded_projects.add(project_id)
status = "önbellekten" if result['loadedFromCache'] else "veritabanından"
print(f"Proje '{result['projectName']}' {status} yüklendi")
return result
def unload_project(self, project_id):
"""Projeyi önbellekten kaldır."""
url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/unload'
response = requests.delete(url, headers=self.headers)
response.raise_for_status()
self.loaded_projects.discard(project_id)
return response.json()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
for project_id in list(self.loaded_projects):
self.unload_project(project_id)
# Context manager ile kullanım
with ProjectCacheManager('your-api-key') as cache:
result = cache.load_project('87654321-4321-4321-4321-210987654321')
# Burada not defterlerini çalıştır...
# Çıkarken projeler otomatik kaldırılır
JavaScript/Node.js
const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const BASE_URL = 'https://your-mindzie-instance.com';
class ProjectCacheManager {
constructor(token) {
this.headers = {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
};
this.loadedProjects = new Set();
}
async loadProject(projectId) {
const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/load`;
const response = await fetch(url, { headers: this.headers });
if (!response.ok) throw new Error(`Başarısız: ${response.status}`);
const result = await response.json();
this.loadedProjects.add(projectId);
console.log(`Yüklendi: ${result.projectName} (önbellekten: ${result.loadedFromCache})`);
return result;
}
async unloadProject(projectId) {
const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/unload`;
const response = await fetch(url, {
method: 'DELETE',
headers: this.headers
});
this.loadedProjects.delete(projectId);
return response.json();
}
async unloadAll() {
await Promise.all(
Array.from(this.loadedProjects).map(id => this.unloadProject(id))
);
}
}
// Kullanım
const cache = new ProjectCacheManager('your-api-key');
try {
await cache.loadProject('87654321-4321-4321-4321-210987654321');
// Burada not defterlerini çalıştır...
} finally {
await cache.unloadAll();
}
En İyi Uygulamalar
- CRUD İşlemleri: Açıkça yükleme yapmayın - otomatik yükleme işinizi görsün
- Çalıştırma İşlemleri: Projeyi önce mutlaka yükleyin
- Uzun Süre Çalışan İstemciler: İşiniz bittiğinde projeleri yüklemeden kaldırın, belleği boşaltın
- Context Manager Kullanımı: Temizlik için Python'da
with, diğerlerinde try/finally kullanın - Bellek Bilinci: Önbellek %90 bellek kullanımında otomatik temizler; ancak açık kaldırma daha iyidir
- Paylaşılan Önbellek: UI kullanıcılarının sizin API işlemlerinizle aynı proje durumunu gördüğünü unutmayın