mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-26 00:46:22 +02:00
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`
|