sol_parser_sdk/common/
config.rs

1use super::constants::*;
2
3/// Backpressure handling strategy
4#[derive(Debug, Clone, Copy)]
5pub enum BackpressureStrategy {
6    /// Block and wait (default)
7    Block,
8    /// Drop messages
9    Drop,
10}
11
12impl Default for BackpressureStrategy {
13    fn default() -> Self {
14        Self::Block
15    }
16}
17
18/// Backpressure configuration
19#[derive(Debug, Clone)]
20pub struct BackpressureConfig {
21    /// Channel size (default: 1000)
22    pub permits: usize,
23    /// Backpressure handling strategy (default: Block)
24    pub strategy: BackpressureStrategy,
25}
26
27impl Default for BackpressureConfig {
28    fn default() -> Self {
29        Self { permits: 3000, strategy: BackpressureStrategy::default() }
30    }
31}
32
33/// Connection configuration
34#[derive(Debug, Clone)]
35pub struct ConnectionConfig {
36    /// Connection timeout in seconds (default: 10)
37    pub connect_timeout: u64,
38    /// Request timeout in seconds (default: 60)
39    pub request_timeout: u64,
40    /// Maximum decoding message size in bytes (default: 10MB)
41    pub max_decoding_message_size: usize,
42}
43
44impl Default for ConnectionConfig {
45    fn default() -> Self {
46        Self {
47            connect_timeout: DEFAULT_CONNECT_TIMEOUT,
48            request_timeout: DEFAULT_REQUEST_TIMEOUT,
49            max_decoding_message_size: DEFAULT_MAX_DECODING_MESSAGE_SIZE,
50        }
51    }
52}
53
54/// Common client configuration
55#[derive(Debug, Clone)]
56pub struct StreamClientConfig {
57    /// Connection configuration
58    pub connection: ConnectionConfig,
59    /// Backpressure configuration
60    pub backpressure: BackpressureConfig,
61    /// Whether performance monitoring is enabled (default: false)
62    pub enable_metrics: bool,
63}
64
65impl Default for StreamClientConfig {
66    fn default() -> Self {
67        Self {
68            connection: ConnectionConfig::default(),
69            backpressure: BackpressureConfig::default(),
70            enable_metrics: false,
71        }
72    }
73}
74
75impl StreamClientConfig {
76    /// Creates a high-throughput configuration optimized for high-concurrency scenarios.
77    ///
78    /// This configuration prioritizes throughput over latency by:
79    /// - Implementing a drop strategy for backpressure to avoid blocking
80    /// - Setting a large permit buffer (5,000) to handle burst traffic
81    ///
82    /// Ideal for scenarios where you need to process large volumes of data
83    /// and can tolerate occasional message drops during peak loads.
84    pub fn high_throughput() -> Self {
85        Self {
86            connection: ConnectionConfig::default(),
87            backpressure: BackpressureConfig {
88                permits: 20000,
89                strategy: BackpressureStrategy::Drop,
90            },
91            enable_metrics: false,
92        }
93    }
94
95    /// Creates a low-latency configuration optimized for real-time scenarios.
96    ///
97    /// This configuration prioritizes latency over throughput by:
98    /// - Processing events immediately without buffering
99    /// - Implementing a blocking backpressure strategy to ensure no data loss
100    /// - Setting optimal permits (4000) for balanced throughput and latency
101    ///
102    /// Ideal for scenarios where every millisecond counts and you cannot
103    /// afford to lose any events, such as trading applications or real-time monitoring.
104    pub fn low_latency() -> Self {
105        Self {
106            connection: ConnectionConfig::default(),
107            backpressure: BackpressureConfig { permits: 4000, strategy: BackpressureStrategy::Block },
108            enable_metrics: false,
109        }
110    }
111
112}