MarketFirstPreprocessHubλ μΉ΄νμΉ΄ ν ν½μμ μμ§ν λ°μ΄ν°λ₯Ό 1μ°¨ μ μ²λ¦¬νλ ν΄λμ€μ
λλ€. μ΄ ν΄λμ€λ
λ κ°μ§ μ£Όμ μΉ΄ν
κ³ λ¦¬λ‘ λλλ©°, κ°κ° Tickerμ OrderbookμΌλ‘ ꡬμ±λμ΄ μμ΅λλ€.
classDiagram
class RegionTickerOrderbookProcessor {
+process_ticker()
+_create_task()
+_create_region_tasks()
}
class AsyncKafkaHandler {
+initialize()
+close()
+processing_message()
}
class CommonConsumerSettingProcessor {
+batch_process_messages()
+start_processing_with_partition_management()
}
class BaseAsyncTickerProcessor {
+data_task_a_crack_ticker()
+get_timestamp()
+get_data()
}
class BaseAsyncOrderbookProcessor {
+calculate_total_bid_ask()
+process_order_data()
+orderbook_common_processing()
+order_preprocessing()
}
class ExchangeProcessors {
+PROCESSORS
+get_processor()
}
class BatchProcessor {
+process_current_batch()
+_check_memory_usage()
+_batch_send_kafka()
}
class TimeStacker {
+add_item()
+should_flush()
+flush()
}
class PartitionManager {
+start_monitoring()
+stop_monitoring()
+_monitor_partitions()
}
class AsyncLogger {
+debug()
+info()
+warning()
+error()
}
class MarketData {
+_signed_change_price()
+from_api()
}
class TickerPerformanceTester {
+generate_test_data()
+run_memory_test()
+run_speed_test()
+run_profiling()
}
class CoinMarketCollection {
+region
+market
+coin_symbol
+timestamp
+data
}
class ProcessedOrderBook {
+region
+market
+symbol
+highest_bid
+lowest_ask
+total_bid_volume
+total_ask_volume
+timestamp
}
class KafkaS3Connector {
+_get_topic_name()
}
class KafkaS3ConnectorConfig {
+<attributes>
}
class BatchConfig {
+<attributes>
}
class AsyncKafkaProducer {
+init_producer()
+stop()
}
class TimeStack {
+add_item()
+should_flush()
+flush()
}
class StackConfig {
+topic
+partition
+max_size
+timeout_ms
}
class TimeStacker {
+start()
+stop()
+add_item()
}
AsyncKafkaHandler <|-- CommonConsumerSettingProcessor
CommonConsumerSettingProcessor <|-- BaseAsyncTickerProcessor
CommonConsumerSettingProcessor <|-- BaseAsyncOrderbookProcessor
RegionTickerOrderbookProcessor --> ExchangeProcessors
RegionTickerOrderbookProcessor --> BaseAsyncTickerProcessor
RegionTickerOrderbookProcessor --> BaseAsyncOrderbookProcessor
CommonConsumerSettingProcessor --> BatchProcessor
BatchProcessor --> TimeStacker
AsyncKafkaHandler --> PartitionManager
AsyncKafkaHandler --> AsyncLogger
BaseAsyncTickerProcessor --> MarketData
BaseAsyncOrderbookProcessor --> MarketData
TickerPerformanceTester --> BaseAsyncTickerProcessor
CoinMarketCollection --> MarketData
ProcessedOrderBook --> BaseAsyncOrderbookProcessor
KafkaS3Connector --> KafkaS3ConnectorConfig
BatchProcessor --> BatchConfig
BatchProcessor --> AsyncKafkaProducer
TimeStacker --> TimeStack
TimeStacker --> StackConfig
TimeStacker --> TimeStack
AsyncKafkaProducer --> KafkaS3Connector
- λͺ©μ : λ€μν κ±°λμμμ μ 곡νλ κ°κ²© μ 보λ₯Ό μ€μκ°μΌλ‘ μμ§νκ³ κ°κ³΅νμ¬, ν¨μ¨μ μΌλ‘ λ°μ΄ν° λΆμ λ° κ±°λ κ²°μ μ μ§μν©λλ€.
- μ§μ μ§μ λ° κ±°λμ:
- νκ΅:
- μ λΉνΈ
- λΉμΈ
- μ½λΉ
- μ½μΈμ
- μμμ:
- OKX
- Bybit
- Gateio
- μ λ½ λ° λ―Έκ΅:
- λ°μ΄λΈμ€
- ν¬λΌμΌ
- νκ΅:
- λͺ©μ : κ° κ±°λμμ μ£Όλ¬Έμ λ°μ΄ν°λ₯Ό μ€μκ°μΌλ‘ μμ§νκ³ , μ΄λ₯Ό λΆμνμ¬ μμ₯μ μ λμ±κ³Ό μ¬λ¦¬λ₯Ό νμ νλ λ° λμμ μ€λλ€. μ΄ μ 보λ₯Ό ν΅ν΄ μ¬μ©μλ€μ λ λμ κ±°λ μ λ΅μ μ립ν μ μμ΅λλ€.
- μ§μ μ§μ λ° κ±°λμ:
- νκ΅:
- μ λΉνΈ
- λΉμΈ
- μ½λΉ
- μ½μΈμ
- μμμ:
- OKX
- Bybit
- Gateio
- μ λ½ λ° λ―Έκ΅:
- λ°μ΄λΈμ€
- ν¬λΌμΌ
- νκ΅:
- κ° partition λ³ μ§μ λ νν°μ μΌλ‘ μλ μ‘°μ
- ticker:
Ticker_group_id_AsiaTicker_group_id_KoreaTicker_group_id_NE
- Orderbook:
Orderbook_group_id_AsiaOrderbook_group_id_KoreaOrderbook_group_id_NE
- Ticker:
asiaSocketDataIn-ticker(partition=3κ°)koraSocketDataIn-ticker(partition=4κ°)neSocketDataIn-ticker(partition=2κ°)
- Orderbook:
asiaSocketDataIn-Orderbook(partition=3κ°)koraSocketDataIn-Orderbook(partition=4κ°)neSocketDataIn-Orderbook(partition=2κ°)
-
Ticker:
Region.Asia_TickerPreprocessing(partition=3κ°)Region.Korea_TickerPreprocessing(partition=4κ°)Region.NE_TickerPreprocessing(partition=2κ°)
-
Orderbook:
Region.Asia_OrderbookPreprocessing(partition=3κ°)Region.Korea_OrderbookPreprocessing(partition=4κ°)Region.NE_OrderbookPreprocessing(partition=2κ°)
- μ΄ μμ€ν μ Kafka Connectorλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό MinIOλ‘ μ μ‘ν©λλ€.
- μ μ‘ μ‘°κ±΄:
- Ticker μ μ²λ¦¬ ν ν½ λ°μ΄ν°: 20κ° μμ§ ν μ μ‘
- Orderbook μ μ²λ¦¬ ν ν½ λ°μ΄ν°: 50κ° μμ§ ν μ μ‘
- Orderbook:
{
"region": "Asia",
"market": "OKX",
"coin_symbol": "BTC",
"highest_bid": 66609.22,
"lowest_ask": 66619.98,
"spread": 10.759999999994761,
"total_bid_volume": 0.0016,
"total_ask_volume": 0.259115,
"timestamp": "2024-10-23 10:25:00.050791+00:00"
}- Ticker:
{
"region": "Asia",
"market": "OKX",
"coin_symbol": "BTC",
"timestamp": 1729678813578.0,
"data": [
{
"opening_price": "67006.4",
"trade_price": "66199.8",
"max_price": "66568.8",
"min_price": "67838.0",
"prev_closing_price": "66568.8",
"acc_trade_volume_24h": "7828.8",
"signed_change_price": "0.8",
"signed_change_rate": "0.000000"
}
]
}π κΈ°λ₯
β’ λ°μ΄ν° μμ§: μΉ΄νμΉ΄λ₯Ό ν΅ν΄ κ° κ±°λμμμ μ€μκ°μΌλ‘ λ°μ΄ν°λ₯Ό μμ§ν©λλ€.
β’ λ°μ΄ν° μ μ : μμ§ν λ°μ΄ν°λ₯Ό λΆμνκΈ° μ©μ΄ν ννλ‘ λ³ννκ³ , λΆνμν μ 보λ₯Ό μ κ±°ν©λλ€.
β’ μλ¬ μ²λ¦¬: λ°μ΄ν° μμ§ λ° μ²λ¦¬ κ³Όμ μμ λ°μν μ μλ λ€μν μ€λ₯λ₯Ό ν¨κ³Όμ μΌλ‘ μ²λ¦¬νμ¬ μμ€ν
μ μμ μ±μ λμ
λλ€.
poetry shell
python main.py
βββ π README.md # νλ‘μ νΈ μ€λͺ
λ¬Έμ
βββ π logs # λ‘κ·Έ νμΌ μ μ₯ λλ ν 리
βββ π main.py # νλ‘κ·Έλ¨ μ§μ
μ , μΉμμΌ ν΄λΌμ΄μΈνΈ μ΄κΈ°ν
βββ π¦ mq # λ©μμ§ ν κ΄λ ¨ λͺ¨λ
β βββ π dlt_producer.py # Dead Letter Topic νλ‘λμ
β βββ β οΈ exception # μμΈ μ²λ¦¬ λͺ¨λ
β β βββ __init__.py
β β βββ π m_exception.py # μ¬μ©μ μ μ μμΈ ν΄λμ€
β βββ π οΈ kafka_config.py # Kafka μ€μ κ΄λ¦¬
β βββ π m_comsumer.py # Kafka 컨μλ¨Έ ꡬν
β βββ π m_producer.py # Kafka νλ‘λμ ꡬν
β βββ π partition_manager.py # Kafka νν°μ
λͺ¨λν°λ§
βββ π order_ticker.py # μ£Όλ¬Έμ/ν°μ»€ μ²λ¦¬ λ©μΈ ν΄λμ€
βββ π¦ poetry.lock # Poetry μμ‘΄μ± μ κΈ νμΌ
βββ π pyproject.toml # Poetry νλ‘μ νΈ μ€μ
βββ π requirements.txt # νλ‘μ νΈ μμ‘΄μ± λͺ©λ‘
βββ π run_tests.py # ν
μ€νΈ μ€ν μ€ν¬λ¦½νΈ
βββ βοΈ setting # μ€μ κ΄λ¦¬
β βββ π οΈ ticker.yml # ν°μ»€ μ²λ¦¬ μ€μ
β βββ π οΈ yml_load.py # YAML μ€μ λ‘λ
βββ π sink_connector.py # Kafka to S3 컀λ₯ν°
βββ π src # μμ€ μ½λ
β βββ π common # κ³΅ν΅ λͺ¨λ
β β βββ π admin # κ΄λ¦¬ κΈ°λ₯
β β β βββ π batch_processor.py # λ°°μΉ μ²λ¦¬ κ΄λ¦¬
β β β βββ π logging # λ‘κΉ
κ΄λ ¨
β β β β βββ π logger.py # λΉλκΈ° λ‘κ±°
β β β β βββ π logging_text.py # λ‘κ·Έ λ©μμ§ ν¬λ§·
β β β βββ π time_stracker.py # μκ° κΈ°λ° λ°μ΄ν° μ€ννΉ
β β βββ π common_consumer.py # κ³΅ν΅ μ»¨μλ¨Έ μ€μ
β β βββ π common_orderbook.py # κ³΅ν΅ μ£Όλ¬Έμ μ²λ¦¬
β β βββ π common_ticker.py # κ³΅ν΅ ν°μ»€ μ²λ¦¬
β βββ π οΈ config.py # μ ν리μΌμ΄μ
μ€μ
β βββ π orderbook # μ£Όλ¬Έμ μ²λ¦¬
β β βββ π asia_orderbook.py # μμμ κ±°λμ
β β βββ π korea_orderbook.py # νκ΅ κ±°λμ
β β βββ π ne_orderbook.py # NE κ±°λμ
β βββ π ticker # ν°μ»€ μ²λ¦¬
β βββ π korea_ticker.py # νκ΅ κ±°λμ
β βββ π ne_asia_ticker.py # NE/μμμ κ±°λμ
βββ π tests # ν
μ€νΈ
β βββ π performance_test.py # μ±λ₯ ν
μ€νΈ
β βββ π run_performance_tests.py # ν
μ€νΈ μ€ν
βββ π type_model # λ°μ΄ν° λͺ¨λΈ
βββ __init__.py
βββ π config_model.py # μ€μ λͺ¨λΈ
βββ π kafka_model.py # Kafka κ΄λ ¨ λͺ¨λΈ
βββ π orderbook_model.py # μ£Όλ¬Έμ λ°μ΄ν° λͺ¨λΈ
βββ π ticker_model.py # ν°μ»€ λ°μ΄ν° λͺ¨λΈ