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