AgentSkillsCN

service-discovery

SignalDB的服务发现——基于能力的路由策略、ServiceBootstrap模式、Catalog Schema、连接池管理,以及心跳机制。适用于服务注册、能力路由,或服务间通信场景时使用。

SKILL.md
--- frontmatter
name: service-discovery
description: SignalDB service discovery - capability-based routing, ServiceBootstrap pattern, catalog schema, connection pooling, and heartbeat mechanism. Use when working with service registration, capability routing, or inter-service communication.
user-invocable: false

SignalDB Service Discovery

Capability-Based Routing

Services register with specific capabilities for automatic routing:

ServiceCapabilitiesDiscovery Pattern
AcceptorTraceIngestionClients connect directly via OTLP
WriterTraceIngestion, StorageAcceptors discover via Storage capability
RouterRoutingClients connect directly via HTTP
QuerierQueryExecutionRouters discover via QueryExecution capability

ServiceBootstrap Pattern

Every service uses ServiceBootstrap at startup:

  1. Connects to service catalog (SQLite or PostgreSQL from [discovery] or [database] DSN)
  2. Generates unique UUID service_id
  3. Registers in ingesters table with service_type, address, capabilities (comma-separated)
  4. Spawns background heartbeat task updating last_seen
  5. On shutdown: deregisters and stops heartbeat
rust
let bootstrap = ServiceBootstrap::new(config).await?;
bootstrap.register().await?;
// ... service runs ...
// Automatic deregistration on drop/shutdown

Service Catalog Schema

sql
CREATE TABLE ingesters (
    id UUID PRIMARY KEY,
    address TEXT NOT NULL,
    last_seen TIMESTAMP WITH TIME ZONE,
    stopped_at TIMESTAMP WITH TIME ZONE
);

Discovery Mechanism

  • InMemoryFlightTransport: Connection pooling (max 50 connections, 30s timeout, 5min expiry) + capability-based client lookup
  • ServiceRegistry (Router-specific): Cached HashMap of services, polls catalog at configurable interval
  • Service selection: Currently picks first available (round-robin planned)
  • TTL-based cleanup: Stale services auto-removed

Configuration

toml
[database]
dsn = "sqlite://.data/signaldb.db"

[discovery]
dsn = "sqlite://.data/signaldb.db"   # Falls back to [database].dsn
heartbeat_interval = "30s"
poll_interval = "60s"
ttl = "300s"

Key Implementation Files

FilePurpose
src/common/src/catalog.rsCatalog trait + implementations
src/common/src/service_bootstrap.rsServiceBootstrap registration
src/common/src/flight/transport.rsInMemoryFlightTransport, connection pooling
src/router/src/service_registry.rsRouter's cached service registry