بنقرة واحدة
project-architecture
High-level architecture and design patterns for the crypto-scout ecosystem
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
High-level architecture and design patterns for the crypto-scout ecosystem
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Java 25 development patterns for the crypto-scout ecosystem including microservices, ActiveJ, and async I/O
Maven build configuration for the crypto-scout multi-module Java 25 project
Podman Compose orchestration for crypto-scout services including RabbitMQ, TimescaleDB, and microservices
RabbitMQ Streams and AMQP messaging patterns for the crypto-scout ecosystem
TimescaleDB data modeling and operations for crypto market time-series data
| name | project-architecture |
| description | High-level architecture and design patterns for the crypto-scout ecosystem |
| license | MIT |
| compatibility | opencode |
| metadata | {"domain":"architecture","pattern":"microservices","style":"event-driven"} |
Provide comprehensive guidance on the architecture, design patterns, and system interactions within the crypto-scout ecosystem.
flowchart TB
subgraph External["External APIs"]
Bybit["Bybit API<br/>WebSocket + REST"]
CMC["CoinMarketCap API<br/>REST"]
end
subgraph Library["Core Library"]
JCL["jcryptolib v0.0.4<br/>(Bybit Stream, CMC Parser,<br/>Analysis Engine)"]
end
subgraph Messaging["RabbitMQ Messaging"]
BS["bybit-stream"]
CS["crypto-scout-stream"]
CQ["collector-queue"]
end
subgraph Services["Microservices"]
Client["crypto-scout-client v0.0.1<br/>(Data Collection)"]
Collector["crypto-scout-collector v0.0.1<br/>(Data Persistence)"]
Analyst["crypto-scout-analyst v0.0.1<br/>(Analysis)"]
end
subgraph Storage["Data Storage"]
DB[("TimescaleDB<br/>Time-series data")]
end
Bybit -->|WebSocket| JCL
CMC -->|REST| JCL
JCL -->|Uses| Client
Client -->|Publish| BS
Client -->|Publish| CS
BS -->|Consume| Collector
CS -->|Consume| Collector
Collector -->|JDBC| DB
BS -->|Consume| Analyst
CS -->|Consume| Analyst
CQ -->|AMQP| Collector
Purpose: Core cryptocurrency library shared across all services
Components:
bybit/stream/): WebSocket client with resilience patterns
BybitStream: Main streaming class with auto-reconnect, ping/pongBybitParser: REST API data fetchingPingPongHandler: WebSocket heartbeat managementRequests/Responses: Message builders/parserscmc/parser/): REST API client with scheduling
CmcParser: Main parser with rate limitingCmcConfig: Configuration managementanalysis/engine/): Technical indicators
AnalystEngine: Main analysis orchestratorSmaIndicator: Simple Moving AverageEmaIndicator: Exponential Moving AverageBitcoinRiskIndicator: BTC risk assessmentresilience/): Circuit breaker, rate limiter, health checksstream/): Payload, Message, Provider, Source, Statisticutil/): JsonUtils, ParserUtils, TimeUtils, ValueUtils, SecUtilsexception/): 10 exception types with hierarchyUsage: Dependency for all other Java modules
Purpose: Shared test utilities library
Components:
MockData: Typed access to JSON test fixtures (bybit-spot, bybit-linear, crypto-scout)PodmanCompose: Container lifecycle managementStreamTestPublisher/StreamTestConsumer: RabbitMQ Streams test utilitiesAmqpTestPublisher/AmqpTestConsumer: AMQP test utilitiesDBUtils: Database operations for testsAssertions: Custom test assertionsUsage: Test-scoped dependency in collector and analyst
Purpose: Real-time market data collection
Data Sources:
Architecture:
Client (Launcher)
├── CoreModule (Reactor, Executor)
├── WebModule (HTTP server, Health)
├── ClientModule (AmqpPublisher)
├── BybitSpotModule (WebSocket consumers)
│ ├── BybitSpotBtcUsdtConsumer
│ └── BybitSpotEthUsdtConsumer
├── BybitLinearModule (WebSocket consumers)
│ ├── BybitLinearBtcUsdtConsumer
│ └── BybitLinearEthUsdtConsumer
├── CmcParserModule (HTTP parser)
│ └── CmcParserConsumer
└── JmxModule (Monitoring)
Publishing Strategy:
bybit-streamcrypto-scout-streamPurpose: Data persistence and storage
Stream Consumers:
bybit-stream → BybitStreamServicecrypto-scout-stream → CryptoScoutServicecollector-queue (AMQP) → AmqpConsumerData Flow:
StreamService
├── BybitStreamService
│ ├── BybitSpotRepository (spot tables)
│ └── BybitLinearRepository (linear tables)
└── CryptoScoutService
└── CryptoScoutRepository (fgi, klines, risk)
AmqpConsumer
└── Command/Control messages
Repositories:
BybitSpotRepository: Spot market dataBybitLinearRepository: Linear/perp market dataCryptoScoutRepository: CMC/analysis dataAnalystRepository: Analyst-specific tablesStreamOffsetsRepository: Offset trackingOffset Management: DB-backed offsets for exactly-once processing
Purpose: Market analysis and alerting
Architecture:
Analyst (Launcher)
├── CoreModule (Reactor, Executor)
├── WebModule (HTTP server, Health)
├── AnalystModule (Analysis services)
│ ├── StreamService
│ │ ├── BybitStreamService
│ │ └── CryptoScoutService
│ ├── Stream transformers
│ │ ├── BytesToPayloadTransformer
│ │ └── AnalystTransformer
│ ├── DataService (async processing)
│ └── StreamPublisher (output)
└── JmxModule (Monitoring)
Stream Processing Pipeline:
RabbitMQ Stream → Consumer → BytesToPayloadTransformer → AnalystTransformer → DataService → Output
Components:
StreamService: Orchestrates stream consumptionCryptoScoutService: Consumes from crypto-scout-stream with transformersBybitStreamService: Consumes from bybit-streamDataService: Processes payloads asynchronouslyAnalystTransformer: Stream transformer for preprocessingStreamPublisher: Output publisherPurpose: Messaging infrastructure (not a Java module)
Components:
Streams:
| Stream | Purpose | Retention |
|---|---|---|
bybit-stream | Bybit market data | 1 day, 2GB max |
crypto-scout-stream | CMC/parser data | 1 day, 2GB max |
Queues:
| Queue | Purpose | Arguments |
|---|---|---|
collector-queue | Command/control messages | lazy mode, TTL 6h, max 2500 |
chatbot-queue | Chatbot notifications | lazy mode, TTL 6h, max 2500 |
dlx-queue | Dead letter handling | lazy mode, TTL 7d |
Deployment: Podman Compose with persistent volumes
Bybit WebSocket → crypto-scout-client → bybit-stream → crypto-scout-collector → TimescaleDB
CMC REST API → crypto-scout-client → crypto-scout-stream → crypto-scout-collector → TimescaleDB
Streams → crypto-scout-analyst → [Transformers] → DataService → Output/Alerts
External → collector-queue (AMQP) → crypto-scout-collector → Action
public final class Service extends Launcher {
@Override
protected Module getModule() {
return combine(
CoreModule.create(), // Reactor + Executor
ServiceModule.create(), // Service-specific
WebModule.create() // HTTP + Health
);
}
@Override
protected void run() throws Exception {
awaitShutdown(); // Block until SIGTERM
}
}
public final class MyService extends AbstractReactive implements ReactiveService {
@Override
public Promise<Void> start() {
return Promise.ofBlocking(executor, () -> {
// Initialize resources
});
}
@Override
public Promise<Void> stop() {
return Promise.ofBlocking(executor, () -> {
// Cleanup resources
});
}
}
public final class DataRepository {
private final DataSource dataSource;
public void saveBatch(final List<Data> data) throws SQLException {
try (final var conn = dataSource.getConnection();
final var stmt = conn.prepareStatement(SQL)) {
for (final var d : data) {
// set parameters
stmt.addBatch();
}
stmt.executeBatch();
}
}
}
public final class AnalystTransformer extends AbstractStreamTransformer<StreamPayload, StreamPayload> {
@Override
protected StreamDataAcceptor<StreamPayload> onResumed(final StreamDataAcceptor<StreamPayload> output) {
return in -> {
final var result = process(in);
output.accept(result);
};
}
}
public final class Service {
public static Service create(final NioReactor reactor,
final Executor executor) {
return new Service(reactor, executor);
}
private Service(final NioReactor reactor, final Executor executor) {
// Private constructor
}
}
src/main/resources/application.properties-D flagsserver.port → SERVER_PORT
amqp.rabbitmq.host → AMQP_RABBITMQ_HOST
jdbc.datasource.url → JDBC_DATASOURCE_URL
static final String VALUE = System.getProperty("key", "default");
IllegalStateException for invalid statescrypto-scout-bridgeGET /health → "ok" (200) or "not-ready" (503)
# Local with Podman Compose
podman-compose up -d # All services
# Individual service deployment
podman-compose up -d crypto-scout-client
podman-compose up -d crypto-scout-collector
podman-compose up -d crypto-scout-analyst
Use this skill when: