mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 16:36:21 +02:00
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.
780 lines
31 KiB
Markdown
780 lines
31 KiB
Markdown
---
|
||
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`
|