mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-26 00:46:22 +02:00
Structure the tech specs directory (#836)
Tech spec some subdirectories for different languages
This commit is contained in:
parent
48da6c5f8b
commit
e7efb673ef
423 changed files with 0 additions and 0 deletions
780
docs/tech-specs/tr/multi-tenant-support.tr.md
Normal file
780
docs/tech-specs/tr/multi-tenant-support.tr.md
Normal file
|
|
@ -0,0 +1,780 @@
|
|||
---
|
||||
layout: default
|
||||
title: "Teknik Özellikler: Çok Kiracılı Destek"
|
||||
parent: "Turkish (Beta)"
|
||||
---
|
||||
|
||||
# Teknik Özellikler: Çok Kiracılı Destek
|
||||
|
||||
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
|
||||
|
||||
## Genel Bakış
|
||||
|
||||
Kuyumuzu özelleştirmeyi engelleyen parametre adı eşleşmezliklerini düzelterek ve Cassandra anahtar alanı parametrelemesini ekleyerek çok kiracılı dağıtımları etkinleştirin.
|
||||
|
||||
## Mimari Bağlam
|
||||
|
||||
### Akış Tabanlı Kuyruk Çözümlemesi
|
||||
|
||||
TrustGraph sistemi, dinamik kuyruk çözümlemesi için **akış tabanlı bir mimari** kullanır ve bu, doğal olarak çok kiracılığı destekler:
|
||||
|
||||
**Akış Tanımları**, Cassandra'da saklanır ve arayüz tanımları aracılığıyla kuyruk adlarını belirtir.
|
||||
**Kuyruk adları**, akış örneği kimlikleriyle değiştirilen `{id}` değişkenlerine sahip **şablonlar** kullanır.
|
||||
**Hizmetler**, istek zamanında akış yapılandırmalarını arayarak **kuyrukları dinamik olarak çözümler**.
|
||||
**Her kiracı, farklı kuyruk adlarına sahip benzersiz akışlara sahip olabilir**, bu da izolasyon sağlar.
|
||||
|
||||
Örnek akış arayüz tanımı:
|
||||
```json
|
||||
{
|
||||
"interfaces": {
|
||||
"triples-store": "persistent://tg/flow/triples-store:{id}",
|
||||
"graph-embeddings-store": "persistent://tg/flow/graph-embeddings-store:{id}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Kiracı A, `tenant-a-prod` akışını başlatığında ve kiracı B, `tenant-b-prod` akışını başlattığında, otomatik olarak izole edilmiş kuyruklar elde ederler:
|
||||
`persistent://tg/flow/triples-store:tenant-a-prod`
|
||||
`persistent://tg/flow/triples-store:tenant-b-prod`
|
||||
|
||||
**Çoklu kiracılığa doğru şekilde tasarlanmış hizmetler:**
|
||||
✅ **Bilgi Yönetimi (çekirdekler)** - İsteğe eklenen akış yapılandırmasından kuyrukları dinamik olarak çözer.
|
||||
|
||||
**Düzeltilmesi gereken hizmetler:**
|
||||
🔴 **Yapılandırma Hizmeti** - Parametre adı eşleşmezliği, kuyruk özelleştirmesini engeller.
|
||||
🔴 **Kütüphaneci Hizmeti** - Sabit kodlanmış depolama yönetimi konuları (aşağıda açıklanmıştır).
|
||||
🔴 **Tüm Hizmetler** - Cassandra anahtar alanını özelleştiremezsiniz.
|
||||
|
||||
## Sorun Tanımı
|
||||
|
||||
### Sorun #1: AsyncProcessor'daki Parametre Adı Eşleşmezliği
|
||||
**CLI tanımları:** `--config-queue` (belirsiz adlandırma)
|
||||
**Argparse'ın dönüştürdüğü:** `config_queue` (params sözlüğünde)
|
||||
**Kodun aradığı:** `config_push_queue`
|
||||
**Sonuç:** Parametre göz ardı edilir ve varsayılan olarak `persistent://tg/config/config` olur.
|
||||
**Etkisi:** AsyncProcessor'dan türeyen 32'den fazla hizmeti etkiler.
|
||||
**Engeller:** Çoklu kiracılı dağıtımlar, kiracıya özel yapılandırma kuyruklarını kullanamaz.
|
||||
**Çözüm:** CLI parametresinin adını `--config-push-queue` olarak değiştirerek netliği artırın (özellik şu anda bozuk olduğundan, bozucu değişiklik kabul edilebilir).
|
||||
|
||||
### Sorun #2: Yapılandırma Hizmetindeki Parametre Adı Eşleşmezliği
|
||||
**CLI tanımları:** `--push-queue` (belirsiz adlandırma)
|
||||
**Argparse'ın dönüştürdüğü:** `push_queue` (params sözlüğünde)
|
||||
**Kodun aradığı:** `config_push_queue`
|
||||
**Sonuç:** Parametre göz ardı edilir.
|
||||
**Etkisi:** Yapılandırma hizmeti, özel bir push kuyruğunu kullanamaz.
|
||||
**Çözüm:** CLI parametresinin adını `--config-push-queue` olarak değiştirerek tutarlılığı ve netliği artırın (bozucu değişiklik kabul edilebilir).
|
||||
|
||||
### Sorun #3: Sabit Kodlanmış Cassandra Anahtar Alanı
|
||||
**Mevcut durum:** Anahtar alanı, çeşitli hizmetlerde `"config"`, `"knowledge"`, `"librarian"` olarak sabit kodlanmıştır.
|
||||
**Sonuç:** Çoklu kiracılı dağıtımlar için anahtar alanı özelleştirilemez.
|
||||
**Etkisi:** Yapılandırma, çekirdek ve kütüphaneci hizmetleri.
|
||||
**Engeller:** Birden fazla kiracı, ayrı Cassandra anahtar alanlarını kullanamaz.
|
||||
|
||||
### Sorun #4: Koleksiyon Yönetimi Mimarisi ✅ TAMAMLANDI
|
||||
**Önceki durum:** Koleksiyonlar, ayrı koleksiyon tablosu aracılığıyla Cassandra kütüphaneci anahtar alanında depolanıyordu.
|
||||
**Önceki durum:** Kütüphaneci, koleksiyon oluşturma/silme işlemini koordine etmek için 4 sabit kodlanmış depolama yönetimi konusunu kullanıyordu:
|
||||
`vector_storage_management_topic`
|
||||
`object_storage_management_topic`
|
||||
`triples_storage_management_topic`
|
||||
`storage_management_response_topic`
|
||||
**Sorunlar (Çözüldü):**
|
||||
Sabit kodlanmış konular, çoklu kiracılı dağıtımlar için özelleştirilemezdi.
|
||||
Kütüphaneci ile 4+ depolama hizmeti arasında karmaşık asenkron koordinasyon.
|
||||
Ayrı bir Cassandra tablosu ve yönetim altyapısı.
|
||||
Kritik işlemler için kalıcı olmayan istek/yanıt kuyrukları.
|
||||
**Uygulanan Çözüm:** Koleksiyonları yapılandırma hizmeti depolamasına taşıdık, dağıtım için yapılandırma push'u kullandık.
|
||||
**Durum:** Tüm depolama arka uçları `CollectionConfigHandler` modeline taşınmıştır.
|
||||
|
||||
## Çözüm
|
||||
|
||||
Bu özellik, Sorunlar #1, #2, #3 ve #4'ü ele alır.
|
||||
|
||||
### 1. Bölüm: Parametre Adı Eşleşmezliklerini Düzeltme
|
||||
|
||||
#### Değişiklik 1: AsyncProcessor Temel Sınıfı - CLI Parametresinin Adını Değiştirme
|
||||
**Dosya:** `trustgraph-base/trustgraph/base/async_processor.py`
|
||||
**Satır:** 260-264
|
||||
|
||||
**Mevcut:**
|
||||
```python
|
||||
parser.add_argument(
|
||||
'--config-queue',
|
||||
default=default_config_queue,
|
||||
help=f'Config push queue {default_config_queue}',
|
||||
)
|
||||
```
|
||||
|
||||
**Sabit:**
|
||||
```python
|
||||
parser.add_argument(
|
||||
'--config-push-queue',
|
||||
default=default_config_queue,
|
||||
help=f'Config push queue (default: {default_config_queue})',
|
||||
)
|
||||
```
|
||||
|
||||
**Gerekçe:**
|
||||
Daha açık, daha kesin bir adlandırma
|
||||
İç değişken adıyla eşleşiyor: `config_push_queue`
|
||||
Özellik şu anda çalışmadığı için, bu bir değişikliktir ve kabul edilebilir.
|
||||
params.get() içinde herhangi bir kod değişikliğine gerek yok; zaten doğru adı arıyor.
|
||||
|
||||
#### Değişiklik 2: Konfigürasyon Servisi - CLI Parametresinin Yeniden Adlandırılması
|
||||
**Dosya:** `trustgraph-flow/trustgraph/config/service/service.py`
|
||||
**Satır:** 276-279
|
||||
|
||||
**Mevcut:**
|
||||
```python
|
||||
parser.add_argument(
|
||||
'--push-queue',
|
||||
default=default_config_push_queue,
|
||||
help=f'Config push queue (default: {default_config_push_queue})'
|
||||
)
|
||||
```
|
||||
|
||||
**Sabit:**
|
||||
```python
|
||||
parser.add_argument(
|
||||
'--config-push-queue',
|
||||
default=default_config_push_queue,
|
||||
help=f'Config push queue (default: {default_config_push_queue})'
|
||||
)
|
||||
```
|
||||
|
||||
**Gerekçe:**
|
||||
Daha anlaşılır bir adlandırma - "config-push-queue", sadece "push-queue"den daha açık.
|
||||
İç değişken adıyla eşleşiyor: `config_push_queue`
|
||||
AsyncProcessor'ın `--config-push-queue` parametresiyle tutarlı.
|
||||
Özellik şu anda çalışmadığı için değişiklik kabul edilebilir.
|
||||
params.get() içinde herhangi bir kod değişikliğine gerek yok - zaten doğru adı arıyor.
|
||||
|
||||
### 2. Bölüm: Cassandra Keyspace Parametrelendirmesi
|
||||
|
||||
#### 3. Değişiklik: cassandra_config Modülüne Keyspace Parametresi Ekle
|
||||
**Dosya:** `trustgraph-base/trustgraph/base/cassandra_config.py`
|
||||
|
||||
**CLI argümanı ekle** (`add_cassandra_args()` fonksiyonunda):
|
||||
```python
|
||||
parser.add_argument(
|
||||
'--cassandra-keyspace',
|
||||
default=None,
|
||||
help='Cassandra keyspace (default: service-specific)'
|
||||
)
|
||||
```
|
||||
|
||||
**Ortam değişkeni desteği ekleyin** (`resolve_cassandra_config()` fonksiyonunda):
|
||||
```python
|
||||
keyspace = params.get(
|
||||
"cassandra_keyspace",
|
||||
os.environ.get("CASSANDRA_KEYSPACE")
|
||||
)
|
||||
```
|
||||
|
||||
**`resolve_cassandra_config()`'nin dönüş değerini güncelleyin:**
|
||||
Şu anda döndürüyor: `(hosts, username, password)`
|
||||
Aşağıdaki değeri döndürmesi için değiştirin: `(hosts, username, password, keyspace)`
|
||||
|
||||
**Gerekçe:**
|
||||
Mevcut Cassandra yapılandırma kalıbıyla tutarlı
|
||||
`add_cassandra_args()` aracılığıyla tüm hizmetlere erişilebilir
|
||||
Hem CLI hem de ortam değişkeni yapılandırmasını destekler
|
||||
|
||||
#### Değişiklik 4: Yapılandırma Hizmeti - Parametreli Keyspace Kullanımı
|
||||
**Dosya:** `trustgraph-flow/trustgraph/config/service/service.py`
|
||||
|
||||
**30. Satır** - Sabit kodlanmış keyspace'i kaldırın:
|
||||
```python
|
||||
# DELETE THIS LINE:
|
||||
keyspace = "config"
|
||||
```
|
||||
|
||||
**69-73 satırları** - Cassandra yapılandırma çözümlemesi güncellendi:
|
||||
|
||||
**Mevcut:**
|
||||
```python
|
||||
cassandra_host, cassandra_username, cassandra_password = \
|
||||
resolve_cassandra_config(params)
|
||||
```
|
||||
|
||||
**Sabit:**
|
||||
```python
|
||||
cassandra_host, cassandra_username, cassandra_password, keyspace = \
|
||||
resolve_cassandra_config(params, default_keyspace="config")
|
||||
```
|
||||
|
||||
**Gerekçe:**
|
||||
"config" varsayılan olarak kullanılarak geriye dönük uyumluluk sağlanır.
|
||||
`--cassandra-keyspace` veya `CASSANDRA_KEYSPACE` ile geçersiz kılınabilir.
|
||||
|
||||
#### Değişiklik 5: Cores/Bilgi Hizmeti - Parametreleştirilmiş Anahtar Alanı Kullanımı
|
||||
**Dosya:** `trustgraph-flow/trustgraph/cores/service.py`
|
||||
|
||||
**Satır 37** - Sabit kodlanmış anahtar alanını kaldırın:
|
||||
```python
|
||||
# DELETE THIS LINE:
|
||||
keyspace = "knowledge"
|
||||
```
|
||||
|
||||
**Cassandra yapılandırma çözümlemesi güncellendi** (yapılandırma hizmetiyle benzer konumda):
|
||||
```python
|
||||
cassandra_host, cassandra_username, cassandra_password, keyspace = \
|
||||
resolve_cassandra_config(params, default_keyspace="knowledge")
|
||||
```
|
||||
|
||||
#### Değişiklik 6: Kütüphaneci Hizmeti - Parametreleştirilmiş Anahtar Alanı Kullanımı
|
||||
**Dosya:** `trustgraph-flow/trustgraph/librarian/service.py`
|
||||
|
||||
**Satır 51** - Sabit kodlanmış anahtar alanını kaldır:
|
||||
```python
|
||||
# DELETE THIS LINE:
|
||||
keyspace = "librarian"
|
||||
```
|
||||
|
||||
**Cassandra yapılandırma çözümlemesi güncellendi** (yapılandırma hizmetiyle benzer konumda):
|
||||
```python
|
||||
cassandra_host, cassandra_username, cassandra_password, keyspace = \
|
||||
resolve_cassandra_config(params, default_keyspace="librarian")
|
||||
```
|
||||
|
||||
### 3. Bölüm: Koleksiyon Yönetimini Config Servisine Taşıma
|
||||
|
||||
#### Genel Bakış
|
||||
Koleksiyonları Cassandra librarian anahtar alanından config servisi depolama alanına taşıyın. Bu, sabit kodlanmış depolama yönetimi konularını ortadan kaldırır ve dağıtım için mevcut config push mekanizmasını kullanarak mimariyi basitleştirir.
|
||||
|
||||
#### Mevcut Mimari
|
||||
```
|
||||
API Request → Gateway → Librarian Service
|
||||
↓
|
||||
CollectionManager
|
||||
↓
|
||||
Cassandra Collections Table (librarian keyspace)
|
||||
↓
|
||||
Broadcast to 4 Storage Management Topics (hardcoded)
|
||||
↓
|
||||
Wait for 4+ Storage Service Responses
|
||||
↓
|
||||
Response to Gateway
|
||||
```
|
||||
|
||||
#### Yeni Mimari
|
||||
```
|
||||
API Request → Gateway → Librarian Service
|
||||
↓
|
||||
CollectionManager
|
||||
↓
|
||||
Config Service API (put/delete/getvalues)
|
||||
↓
|
||||
Cassandra Config Table (class='collections', key='user:collection')
|
||||
↓
|
||||
Config Push (to all subscribers on config-push-queue)
|
||||
↓
|
||||
All Storage Services receive config update independently
|
||||
```
|
||||
|
||||
#### Değişiklik 7: Koleksiyon Yöneticisi - Config Hizmeti API'sini Kullanın
|
||||
**Dosya:** `trustgraph-flow/trustgraph/librarian/collection_manager.py`
|
||||
|
||||
**Kaldırılacaklar:**
|
||||
`LibraryTableStore` kullanımı (33, 40-41 satırları)
|
||||
Depolama yönetimi üreticilerinin başlatılması (86-140 satırları)
|
||||
`on_storage_response` metodu (400-430 satırları)
|
||||
`pending_deletions` takibi (57, 90-96 satırları ve tüm kullanım alanları)
|
||||
|
||||
**Eklenecekler:**
|
||||
API çağrıları için Config hizmeti istemcisi (istek/yanıt kalıbı)
|
||||
|
||||
**Config İstemcisi Kurulumu:**
|
||||
```python
|
||||
# In __init__, add config request/response producers/consumers
|
||||
from trustgraph.schema.services.config import ConfigRequest, ConfigResponse
|
||||
|
||||
# Producer for config requests
|
||||
self.config_request_producer = Producer(
|
||||
client=pulsar_client,
|
||||
topic=config_request_queue,
|
||||
schema=ConfigRequest,
|
||||
)
|
||||
|
||||
# Consumer for config responses (with correlation ID)
|
||||
self.config_response_consumer = Consumer(
|
||||
taskgroup=taskgroup,
|
||||
client=pulsar_client,
|
||||
flow=None,
|
||||
topic=config_response_queue,
|
||||
subscriber=f"{id}-config",
|
||||
schema=ConfigResponse,
|
||||
handler=self.on_config_response,
|
||||
)
|
||||
|
||||
# Tracking for pending config requests
|
||||
self.pending_config_requests = {} # request_id -> asyncio.Event
|
||||
```
|
||||
|
||||
**`list_collections`'ı Değiştirin (145-180. satırlar):**
|
||||
```python
|
||||
async def list_collections(self, user, tag_filter=None, limit=None):
|
||||
"""List collections from config service"""
|
||||
# Send getvalues request to config service
|
||||
request = ConfigRequest(
|
||||
id=str(uuid.uuid4()),
|
||||
operation='getvalues',
|
||||
type='collections',
|
||||
)
|
||||
|
||||
# Send request and wait for response
|
||||
response = await self.send_config_request(request)
|
||||
|
||||
# Parse collections from response
|
||||
collections = []
|
||||
for key, value_json in response.values.items():
|
||||
if ":" in key:
|
||||
coll_user, collection = key.split(":", 1)
|
||||
if coll_user == user:
|
||||
metadata = json.loads(value_json)
|
||||
collections.append(CollectionMetadata(**metadata))
|
||||
|
||||
# Apply tag filtering in-memory (as before)
|
||||
if tag_filter:
|
||||
collections = [c for c in collections if any(tag in c.tags for tag in tag_filter)]
|
||||
|
||||
# Apply limit
|
||||
if limit:
|
||||
collections = collections[:limit]
|
||||
|
||||
return collections
|
||||
|
||||
async def send_config_request(self, request):
|
||||
"""Send config request and wait for response"""
|
||||
event = asyncio.Event()
|
||||
self.pending_config_requests[request.id] = event
|
||||
|
||||
await self.config_request_producer.send(request)
|
||||
await event.wait()
|
||||
|
||||
return self.pending_config_requests.pop(request.id + "_response")
|
||||
|
||||
async def on_config_response(self, message, consumer, flow):
|
||||
"""Handle config response"""
|
||||
response = message.value()
|
||||
if response.id in self.pending_config_requests:
|
||||
self.pending_config_requests[response.id + "_response"] = response
|
||||
self.pending_config_requests[response.id].set()
|
||||
```
|
||||
|
||||
**`update_collection`'yi değiştirin (182-312. satırlar):**
|
||||
```python
|
||||
async def update_collection(self, user, collection, name, description, tags):
|
||||
"""Update collection via config service"""
|
||||
# Create metadata
|
||||
metadata = CollectionMetadata(
|
||||
user=user,
|
||||
collection=collection,
|
||||
name=name,
|
||||
description=description,
|
||||
tags=tags,
|
||||
)
|
||||
|
||||
# Send put request to config service
|
||||
request = ConfigRequest(
|
||||
id=str(uuid.uuid4()),
|
||||
operation='put',
|
||||
type='collections',
|
||||
key=f'{user}:{collection}',
|
||||
value=json.dumps(metadata.to_dict()),
|
||||
)
|
||||
|
||||
response = await self.send_config_request(request)
|
||||
|
||||
if response.error:
|
||||
raise RuntimeError(f"Config update failed: {response.error.message}")
|
||||
|
||||
# Config service will trigger config push automatically
|
||||
# Storage services will receive update and create collections
|
||||
```
|
||||
|
||||
**`delete_collection`'ı Değiştirin (314-398. satırlar):**
|
||||
```python
|
||||
async def delete_collection(self, user, collection):
|
||||
"""Delete collection via config service"""
|
||||
# Send delete request to config service
|
||||
request = ConfigRequest(
|
||||
id=str(uuid.uuid4()),
|
||||
operation='delete',
|
||||
type='collections',
|
||||
key=f'{user}:{collection}',
|
||||
)
|
||||
|
||||
response = await self.send_config_request(request)
|
||||
|
||||
if response.error:
|
||||
raise RuntimeError(f"Config delete failed: {response.error.message}")
|
||||
|
||||
# Config service will trigger config push automatically
|
||||
# Storage services will receive update and delete collections
|
||||
```
|
||||
|
||||
**Koleksiyon Meta Veri Formatı:**
|
||||
`config` tablosunda şu şekilde saklanır: `class='collections', key='user:collection'`
|
||||
Değer, zaman damgası alanları olmadan JSON olarak seri hale getirilmiş `CollectionMetadata`'dır.
|
||||
Alanlar: `user`, `collection`, `name`, `description`, `tags`
|
||||
Örnek: `class='collections', key='alice:my-docs', value='{"user":"alice","collection":"my-docs","name":"My Documents","description":"...","tags":["work"]}'`
|
||||
|
||||
#### 8. Değişiklik: Kütüphane Hizmeti - Depolama Yönetimi Altyapısını Kaldır
|
||||
**Dosya:** `trustgraph-flow/trustgraph/librarian/service.py`
|
||||
|
||||
**Kaldır:**
|
||||
Depolama yönetimi üreticileri (173-190. satırlar):
|
||||
`vector_storage_management_producer`
|
||||
`object_storage_management_producer`
|
||||
`triples_storage_management_producer`
|
||||
Depolama yanıt tüketici (192-201. satırlar)
|
||||
`on_storage_response` işleyici (467-473. satırlar)
|
||||
|
||||
**Değiştir:**
|
||||
`CollectionManager` başlatma (215-224. satırlar) - depolama üretici parametrelerini kaldır
|
||||
|
||||
**Not:** Harici koleksiyon API'si değişmeden kalır:
|
||||
`list-collections`
|
||||
`update-collection`
|
||||
`delete-collection`
|
||||
|
||||
#### 9. Değişiklik: Koleksiyonlar Tablosunu `LibraryTableStore`'dan Kaldır
|
||||
**Dosya:** `trustgraph-flow/trustgraph/tables/library.py`
|
||||
|
||||
**Sil:**
|
||||
Koleksiyonlar tablosu `CREATE` ifadesi (114-127. satırlar)
|
||||
Koleksiyonlar için hazırlanmış ifadeler (205-240. satırlar)
|
||||
Tüm koleksiyon metotları (578-717. satırlar):
|
||||
`ensure_collection_exists`
|
||||
`list_collections`
|
||||
`update_collection`
|
||||
`delete_collection`
|
||||
`get_collection`
|
||||
`create_collection`
|
||||
|
||||
**Gerekçe:**
|
||||
Koleksiyonlar artık `config` tablosunda saklanıyor
|
||||
Uyumluluk bozan bir değişiklik kabul edilebilir - veri taşıma işlemine gerek yok
|
||||
Kütüphane hizmetini önemli ölçüde basitleştirir
|
||||
|
||||
#### 10. Değişiklik: Depolama Hizmetleri - Yapılandırmaya Dayalı Koleksiyon Yönetimi ✅ TAMAMLANDI
|
||||
|
||||
**Durum:** 11 depolama arka ucunun tamamı, `CollectionConfigHandler`'ı kullanmak üzere güncellendi.
|
||||
|
||||
**Etkilenen Hizmetler (toplam 11):**
|
||||
Belge gömülüleri: milvus, pinecone, qdrant
|
||||
Grafik gömülüleri: milvus, pinecone, qdrant
|
||||
Nesne depolama: cassandra
|
||||
Üçlü depolama: cassandra, falkordb, memgraph, neo4j
|
||||
|
||||
**Dosyalar:**
|
||||
`trustgraph-flow/trustgraph/storage/doc_embeddings/milvus/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/doc_embeddings/pinecone/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/doc_embeddings/qdrant/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/graph_embeddings/milvus/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/graph_embeddings/pinecone/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/graph_embeddings/qdrant/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/objects/cassandra/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/triples/cassandra/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/triples/falkordb/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/triples/memgraph/write.py`
|
||||
`trustgraph-flow/trustgraph/storage/triples/neo4j/write.py`
|
||||
|
||||
**Uygulama Deseni (tüm hizmetler):**
|
||||
|
||||
1. **Yapılandırma işleyiciyi `__init__` içinde kaydedin:**
|
||||
```python
|
||||
# Add after AsyncProcessor initialization
|
||||
self.register_config_handler(self.on_collection_config)
|
||||
self.known_collections = set() # Track (user, collection) tuples
|
||||
```
|
||||
|
||||
2. **Yapılandırma yöneticisini uygulayın:**
|
||||
```python
|
||||
async def on_collection_config(self, config, version):
|
||||
"""Handle collection configuration updates"""
|
||||
logger.info(f"Collection config version: {version}")
|
||||
|
||||
if "collections" not in config:
|
||||
return
|
||||
|
||||
# Parse collections from config
|
||||
# Key format: "user:collection" in config["collections"]
|
||||
config_collections = set()
|
||||
for key in config["collections"].keys():
|
||||
if ":" in key:
|
||||
user, collection = key.split(":", 1)
|
||||
config_collections.add((user, collection))
|
||||
|
||||
# Determine changes
|
||||
to_create = config_collections - self.known_collections
|
||||
to_delete = self.known_collections - config_collections
|
||||
|
||||
# Create new collections (idempotent)
|
||||
for user, collection in to_create:
|
||||
try:
|
||||
await self.create_collection_internal(user, collection)
|
||||
self.known_collections.add((user, collection))
|
||||
logger.info(f"Created collection: {user}/{collection}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to create {user}/{collection}: {e}")
|
||||
|
||||
# Delete removed collections (idempotent)
|
||||
for user, collection in to_delete:
|
||||
try:
|
||||
await self.delete_collection_internal(user, collection)
|
||||
self.known_collections.discard((user, collection))
|
||||
logger.info(f"Deleted collection: {user}/{collection}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to delete {user}/{collection}: {e}")
|
||||
```
|
||||
|
||||
3. **Başlangıçta bilinen koleksiyonları başlatın:**
|
||||
```python
|
||||
async def start(self):
|
||||
"""Start the processor"""
|
||||
await super().start()
|
||||
await self.sync_known_collections()
|
||||
|
||||
async def sync_known_collections(self):
|
||||
"""Query backend to populate known_collections set"""
|
||||
# Backend-specific implementation:
|
||||
# - Milvus/Pinecone/Qdrant: List collections/indexes matching naming pattern
|
||||
# - Cassandra: Query keyspaces or collection metadata
|
||||
# - Neo4j/Memgraph/FalkorDB: Query CollectionMetadata nodes
|
||||
pass
|
||||
```
|
||||
|
||||
4. **Mevcut işleyici metotları yeniden düzenleyin:**
|
||||
```python
|
||||
# Rename and remove response sending:
|
||||
# handle_create_collection → create_collection_internal
|
||||
# handle_delete_collection → delete_collection_internal
|
||||
|
||||
async def create_collection_internal(self, user, collection):
|
||||
"""Create collection (idempotent)"""
|
||||
# Same logic as current handle_create_collection
|
||||
# But remove response producer calls
|
||||
# Handle "already exists" gracefully
|
||||
pass
|
||||
|
||||
async def delete_collection_internal(self, user, collection):
|
||||
"""Delete collection (idempotent)"""
|
||||
# Same logic as current handle_delete_collection
|
||||
# But remove response producer calls
|
||||
# Handle "not found" gracefully
|
||||
pass
|
||||
```
|
||||
|
||||
5. **Depolama yönetimi altyapısını kaldırın:**
|
||||
`self.storage_request_consumer` kurulumunu ve başlatmayı kaldırın
|
||||
`self.storage_response_producer` kurulumunu kaldırın
|
||||
`on_storage_management` dağıtıcı yöntemini kaldırın
|
||||
Depolama yönetimi için metrikleri kaldırın
|
||||
Aşağıdaki import'ları kaldırın: `StorageManagementRequest`, `StorageManagementResponse`
|
||||
|
||||
**Arka Uç Özel Hususlar:**
|
||||
|
||||
**Vektör depoları (Milvus, Pinecone, Qdrant):** `known_collections` içinde mantıksal `(user, collection)`'ı takip edin, ancak her boyut için birden fazla arka uç koleksiyonu oluşturabilir. Tembel oluşturma modeline devam edin. Silme işlemleri, tüm boyut varyantlarını kaldırmalıdır.
|
||||
|
||||
**Cassandra Nesneleri:** Koleksiyonlar, yapılar değil, satır özellikleridir. Veritabanı seviyesindeki bilgileri takip edin.
|
||||
|
||||
**Grafik depoları (Neo4j, Memgraph, FalkorDB):** Başlangıçta `CollectionMetadata` düğümlerini sorgulayın. Senkronizasyon sırasında meta veri düğümlerini oluşturun/silin.
|
||||
|
||||
**Cassandra Üçlüleri:** Koleksiyon işlemleri için `KnowledgeGraph` API'sini kullanın.
|
||||
|
||||
**Temel Tasarım Noktaları:**
|
||||
|
||||
**Son tutarlılık:** İstek/yanıt mekanizması yoktur, yapılandırma itmesi yayınlanır
|
||||
**Tekrarlanabilirlik:** Tüm oluşturma/silme işlemleri, yeniden denenmek üzere güvenli olmalıdır
|
||||
**Hata işleme:** Hataları günlüğe kaydedin, ancak yapılandırma güncellemelerini engellemeyin
|
||||
**Kendini iyileştirme:** Başarısız işlemler, bir sonraki yapılandırma itmesinde yeniden denenecektir
|
||||
**Koleksiyon anahtar biçimi:** `config["collections"]` içinde `"user:collection"`
|
||||
|
||||
#### Değişiklik 11: Koleksiyon Şemasını Güncelle - Zaman Damgalarını Kaldır
|
||||
**Dosya:** `trustgraph-base/trustgraph/schema/services/collection.py`
|
||||
|
||||
**CollectionMetadata'ı değiştirin (Satırlar 13-21):**
|
||||
Aşağıdaki alanları kaldırın: `created_at` ve `updated_at`:
|
||||
```python
|
||||
class CollectionMetadata(Record):
|
||||
user = String()
|
||||
collection = String()
|
||||
name = String()
|
||||
description = String()
|
||||
tags = Array(String())
|
||||
# Remove: created_at = String()
|
||||
# Remove: updated_at = String()
|
||||
```
|
||||
|
||||
**CollectionManagementRequest'i Değiştir (25-47. satırlar):**
|
||||
Zaman damgası alanlarını kaldır:
|
||||
```python
|
||||
class CollectionManagementRequest(Record):
|
||||
operation = String()
|
||||
user = String()
|
||||
collection = String()
|
||||
timestamp = String()
|
||||
name = String()
|
||||
description = String()
|
||||
tags = Array(String())
|
||||
# Remove: created_at = String()
|
||||
# Remove: updated_at = String()
|
||||
tag_filter = Array(String())
|
||||
limit = Integer()
|
||||
```
|
||||
|
||||
**Gerekçe:**
|
||||
Zaman damgaları, koleksiyonlar için değer katmaz.
|
||||
Yapılandırma hizmeti, kendi sürüm takibini yapar.
|
||||
Şemayı basitleştirir ve depolama alanını azaltır.
|
||||
|
||||
#### Yapılandırma Hizmeti Geçişinin Faydaları
|
||||
|
||||
1. ✅ **Sabit kodlanmış depolama yönetimi konularını ortadan kaldırır** - Çok kiracılı sorunu çözer.
|
||||
2. ✅ **Daha basit koordinasyon** - 4 veya daha fazla depolama yanıtı için karmaşık asenkron beklemeler olmaz.
|
||||
3. ✅ **Sonunda tutarlılık** - Depolama hizmetleri, yapılandırma itme yoluyla bağımsız olarak güncellenir.
|
||||
4. ✅ **Daha iyi güvenilirlik** - Kalıcı yapılandırma itme, kalıcı olmayan istek/yanıt yerine.
|
||||
5. ✅ **Birleşik yapılandırma modeli** - Koleksiyonlar, yapılandırma olarak ele alınır.
|
||||
6. ✅ **Karmaşıklığı azaltır** - Yaklaşık 300 satır koordinasyon kodunu kaldırır.
|
||||
7. ✅ **Çok kiracılı için hazır** - Yapılandırma, anahtar alanı aracılığıyla zaten kiracı izolasyonunu destekler.
|
||||
8. ✅ **Sürüm takibi** - Yapılandırma hizmeti sürüm mekanizması, denetim izi sağlar.
|
||||
|
||||
## Uygulama Notları
|
||||
|
||||
### Geriye Dönük Uyumluluk
|
||||
|
||||
**Parametre Değişiklikleri:**
|
||||
CLI parametrelerinin yeniden adlandırılması, bozucu değişikliklerdir ancak kabul edilebilir (özellik şu anda çalışmıyor).
|
||||
Hizmetler parametreler olmadan çalışır (varsayılanları kullanır).
|
||||
Varsayılan anahtar alanları korunur: "config", "knowledge", "librarian".
|
||||
Varsayılan kuyruk: `persistent://tg/config/config`
|
||||
|
||||
**Koleksiyon Yönetimi:**
|
||||
**Bozucu değişiklik:** Koleksiyon tablosu, "librarian" anahtar alanından kaldırılmıştır.
|
||||
**Veri geçişi sağlanmamıştır** - bu aşama için kabul edilebilir.
|
||||
Harici koleksiyon API'si değişmemiştir (listeleme/güncelleme/silme işlemleri).
|
||||
Koleksiyon meta veri biçimi basitleştirilmiştir (zaman damgaları kaldırılmıştır).
|
||||
|
||||
### Test Gereksinimleri
|
||||
|
||||
**Parametre Testi:**
|
||||
1. `--config-push-queue` parametresinin "graph-embeddings" hizmetinde çalıştığını doğrulayın.
|
||||
2. `--config-push-queue` parametresinin "text-completion" hizmetinde çalıştığını doğrulayın.
|
||||
3. `--config-push-queue` parametresinin yapılandırma hizmetinde çalıştığını doğrulayın.
|
||||
4. `--cassandra-keyspace` parametresinin yapılandırma hizmeti için çalıştığını doğrulayın.
|
||||
5. `--cassandra-keyspace` parametresinin "cores" hizmeti için çalıştığını doğrulayın.
|
||||
6. `--cassandra-keyspace` parametresinin "librarian" hizmeti için çalıştığını doğrulayın.
|
||||
7. Hizmetlerin parametreler olmadan çalıştığını (varsayılanları kullandığını) doğrulayın.
|
||||
8. Özel kuyruk adları ve anahtar alanı ile çok kiracılı dağıtımı doğrulayın.
|
||||
|
||||
**Koleksiyon Yönetimi Testi:**
|
||||
9. `list-collections` işlemini yapılandırma hizmeti aracılığıyla doğrulayın.
|
||||
10. `update-collection`'ın yapılandırma tablosunda oluşturulduğunu/güncellendiğini doğrulayın.
|
||||
11. `delete-collection`'ın yapılandırma tablosundan kaldırıldığını doğrulayın.
|
||||
12. Koleksiyon güncellemelerinde yapılandırma itmesinin tetiklendiğini doğrulayın.
|
||||
13. Etiket filtrelemenin yapılandırma tabanlı depolama ile çalıştığını doğrulayın.
|
||||
14. Koleksiyon işlemlerinin zaman damgası alanları olmadan çalıştığını doğrulayın.
|
||||
|
||||
### Çok Kiracılı Dağıtım Örneği
|
||||
```bash
|
||||
# Tenant: tg-dev
|
||||
graph-embeddings \
|
||||
-p pulsar+ssl://broker:6651 \
|
||||
--pulsar-api-key <KEY> \
|
||||
--config-push-queue persistent://tg-dev/config/config
|
||||
|
||||
config-service \
|
||||
-p pulsar+ssl://broker:6651 \
|
||||
--pulsar-api-key <KEY> \
|
||||
--config-push-queue persistent://tg-dev/config/config \
|
||||
--cassandra-keyspace tg_dev_config
|
||||
```
|
||||
|
||||
## Etki Analizi
|
||||
|
||||
### 1-2 Değişikliklerinden Etkilenen Hizmetler (CLI Parametre Adı Değişikliği)
|
||||
AsyncProcessor veya FlowProcessor'dan türeyen tüm hizmetler:
|
||||
config-service
|
||||
cores-service
|
||||
librarian-service
|
||||
graph-embeddings
|
||||
document-embeddings
|
||||
text-completion-* (tüm sağlayıcılar)
|
||||
extract-* (tüm çıkarıcılar)
|
||||
query-* (tüm sorgu hizmetleri)
|
||||
retrieval-* (tüm RAG hizmetleri)
|
||||
storage-* (tüm depolama hizmetleri)
|
||||
Ve 20'den fazla hizmet daha
|
||||
|
||||
### 3-6 Değişikliklerinden Etkilenen Hizmetler (Cassandra Keyspace)
|
||||
config-service
|
||||
cores-service
|
||||
librarian-service
|
||||
|
||||
### 7-11 Değişikliklerinden Etkilenen Hizmetler (Koleksiyon Yönetimi)
|
||||
|
||||
**Hızlı Uygulanacak Değişiklikler:**
|
||||
librarian-service (collection_manager.py, service.py)
|
||||
tables/library.py (collections tablosunun kaldırılması)
|
||||
schema/services/collection.py (zaman damgası kaldırma)
|
||||
|
||||
**Tamamlanan Değişiklikler (Değişiklik 10):** ✅
|
||||
Tüm depolama hizmetleri (toplam 11) - `CollectionConfigHandler` üzerinden koleksiyon güncellemeleri için yapılandırma itme işlemine geçirildi
|
||||
Depolama yönetimi şeması `storage.py`'dan kaldırıldı
|
||||
|
||||
## Gelecek Hususlar
|
||||
|
||||
### Kullanıcı Başına Keyspace Modeli
|
||||
|
||||
Bazı hizmetler, her kullanıcının kendi Cassandra keyspace'ine sahip olduğu **kullanıcı başına keyspace**'leri dinamik olarak kullanır:
|
||||
|
||||
**Kullanıcı başına keyspace kullanan hizmetler:**
|
||||
1. **Triples Sorgu Hizmeti** (`trustgraph-flow/trustgraph/query/triples/cassandra/service.py:65`)
|
||||
`keyspace=query.user` kullanır
|
||||
2. **Objects Sorgu Hizmeti** (`trustgraph-flow/trustgraph/query/objects/cassandra/service.py:479`)
|
||||
`keyspace=self.sanitize_name(user)` kullanır
|
||||
3. **KnowledgeGraph Doğrudan Erişim** (`trustgraph-flow/trustgraph/direct/cassandra_kg.py:18`)
|
||||
Varsayılan parametre `keyspace="trustgraph"`
|
||||
|
||||
**Durum:** Bu, bu belirtimde **değiştirilmemiştir**.
|
||||
|
||||
**Gelecekte İnceleme Gerekli:**
|
||||
Kullanıcı başına keyspace modelinin kiracı izolasyonu sorunlarına neden olup olmadığını değerlendirin
|
||||
Çok kiracılı dağıtımların keyspace önek kalıplarına (örneğin, `tenant_a_user1`) ihtiyaç duyup duymadığını düşünün
|
||||
Kiracılar arasında potansiyel kullanıcı kimliği çakışmalarını gözden geçirin
|
||||
Tek, paylaşılan keyspace'in, kullanıcı tabanlı satır izolasyonu ile birlikte daha mı tercih edilebilir olduğunu değerlendirin
|
||||
|
||||
**Not:** Bu, mevcut çok kiracılı uygulamayı engellemez, ancak üretim çok kiracılı dağıtımlardan önce incelenmelidir.
|
||||
|
||||
## Uygulama Aşamaları
|
||||
|
||||
### Aşama 1: Parametre Düzeltmeleri (Değişiklikler 1-6)
|
||||
`--config-push-queue` parametre adlandırmasını düzeltin
|
||||
`--cassandra-keyspace` parametre desteğini ekleyin
|
||||
**Sonuç:** Çok kiracılı kuyruk ve keyspace yapılandırması etkinleştirildi
|
||||
|
||||
### Aşama 2: Koleksiyon Yönetimi Geçişi (Değişiklikler 7-9, 11)
|
||||
Koleksiyon depolamasını yapılandırma hizmetine geçirin
|
||||
librarian'dan koleksiyon tablosunu kaldırın
|
||||
Koleksiyon şemasını güncelleyin (zaman damgalarını kaldırın)
|
||||
**Sonuç:** Sabit kodlu depolama yönetimi konuları ortadan kaldırılır, librarian basitleştirilir
|
||||
|
||||
### Aşama 3: Depolama Hizmeti Güncellemeleri (Değişiklik 10) ✅ TAMAMLANDI
|
||||
Tüm depolama hizmetlerini koleksiyonlar için yapılandırma itme işlemine almak için güncelleyin `CollectionConfigHandler`
|
||||
Depolama yönetimi istek/yanıt altyapısını kaldırın
|
||||
Eski şema tanımlarını kaldırın
|
||||
**Sonuç:** Tamamen yapılandırmaya dayalı koleksiyon yönetimi elde edildi
|
||||
|
||||
## Referanslar
|
||||
GitHub Sorunu: https://github.com/trustgraph-ai/trustgraph/issues/582
|
||||
İlgili Dosyalar:
|
||||
`trustgraph-base/trustgraph/base/async_processor.py`
|
||||
`trustgraph-base/trustgraph/base/cassandra_config.py`
|
||||
`trustgraph-base/trustgraph/schema/core/topic.py`
|
||||
`trustgraph-base/trustgraph/schema/services/collection.py`
|
||||
`trustgraph-flow/trustgraph/config/service/service.py`
|
||||
`trustgraph-flow/trustgraph/cores/service.py`
|
||||
`trustgraph-flow/trustgraph/librarian/service.py`
|
||||
`trustgraph-flow/trustgraph/librarian/collection_manager.py`
|
||||
`trustgraph-flow/trustgraph/tables/library.py`
|
||||
Loading…
Add table
Add a link
Reference in a new issue