Feat: TrustGraph i18n & Documentation Translation Updates (#781)

Native CLI i18n: The TrustGraph CLI has built-in translation support
that dynamically loads language strings. You can test and use
different languages by simply passing the --lang flag (e.g., --lang
es for Spanish, --lang ru for Russian) or by configuring your
environment's LANG variable.

Automated Docs Translations: This PR introduces autonomously
translated Markdown documentation into several target languages,
including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew,
Arabic, Simplified Chinese, and Russian.
This commit is contained in:
Alex Jenkins 2026-04-14 07:07:58 -04:00 committed by GitHub
parent 19f73e4cdc
commit f95fd4f052
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
560 changed files with 236300 additions and 99 deletions

View 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`