2026-04-10 23:20:41 -04:00
---
layout: default
title: "Teknik Özellikler: Çok Kiracı lı Destek"
parent: "Turkish (Beta)"
---
2026-04-11 01:08:44 +00:00
# Teknik Özellikler: Çok Kiracı lı Destek
2026-04-10 23:20:41 -04:00
> **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.
2026-04-11 01:08:44 +00:00
## 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`