forex

ClickHouse Analytics Event Driven Design

clickhouse analytics event driven design
ClickHouse Analytics Event Driven Design

ClickHouse Analytics Event Driven Design คืออะไร

ClickHouse Analytics Event Driven Design

ClickHouse เป็น columnar database สำหรับ real-time analytics ที่เร็วที่สุดตัวหนึ่ง รองรับ queries บน billions of rows ภายในวินาที Event Driven Design เป็นรูปแบบสถาปัตยกรรมที่ระบบตอบสนองต่อ events แทนการ polling ใช้ message brokers เช่น Kafka, RabbitMQ เป็นตัวกลาง การรวม ClickHouse กับ Event Driven Architecture ช่วยสร้าง real-time analytics platform ที่รับ events จำนวนมหาศาล ประมวลผลทันที และ query ได้เร็วมาก เหมาะสำหรับ clickstream analytics, IoT telemetry, financial data และ observability

ClickHouse Kafka Integration

-- clickhouse_kafka.sql — ClickHouse Kafka Engine setup



-- 1. Create Kafka Engine table (consumer)

CREATE TABLE events_kafka (

    event_id String,

    user_id String,

    event_type String,

    page_url String,

    referrer String,

    device_type String,

    country String,

    properties String,  -- JSON string

    timestamp DateTime64(3)

) ENGINE = Kafka

SETTINGS

    kafka_broker_list = 'kafka-1:9092, kafka-2:9092, kafka-3:9092',

    kafka_topic_list = 'user-events',

    kafka_group_name = 'clickhouse-consumer',

    kafka_format = 'JSONEachRow',

    kafka_num_consumers = 4,

    kafka_max_block_size = 65536;



-- 2. Create MergeTree storage table

CREATE TABLE events (

    event_id String,

    user_id String,

    event_type LowCardinality(String),

    page_url String,

    referrer String,

    device_type LowCardinality(String),

    country LowCardinality(String),

    properties String,

    timestamp DateTime64(3),

    date Date MATERIALIZED toDate(timestamp)

) ENGINE = MergeTree()

PARTITION BY toYYYYMM(date)

ORDER BY (event_type, user_id, timestamp)

TTL date + INTERVAL 90 DAY

SETTINGS index_granularity = 8192;



-- 3. Materialized View (auto-insert from Kafka → MergeTree)

CREATE MATERIALIZED VIEW events_mv TO events AS

SELECT * FROM events_kafka;



-- 4. Pre-aggregated hourly stats (Materialized View)

CREATE TABLE hourly_stats (

    hour DateTime,

    event_type LowCardinality(String),

    country LowCardinality(String),

    event_count UInt64,

    unique_users AggregateFunction(uniq, String)

) ENGINE = AggregatingMergeTree()

PARTITION BY toYYYYMM(hour)

ORDER BY (hour, event_type, country);



CREATE MATERIALIZED VIEW hourly_stats_mv TO hourly_stats AS

SELECT

    toStartOfHour(timestamp) AS hour,

    event_type,

    country,

    count() AS event_count,

    uniqState(user_id) AS unique_users

FROM events

GROUP BY hour, event_type, country;



-- 5. Query examples

-- Real-time event count (last 5 minutes)

SELECT

    event_type,

    count() AS cnt,

    uniq(user_id) AS unique_users

FROM events

WHERE timestamp > now() - INTERVAL 5 MINUTE

GROUP BY event_type

ORDER BY cnt DESC;



-- Funnel analysis

SELECT

    countIf(event_type = 'page_view') AS views,

    countIf(event_type = 'add_to_cart') AS carts,

    countIf(event_type = 'checkout') AS checkouts,

    countIf(event_type = 'purchase') AS purchases,

    round(countIf(event_type = 'purchase') / countIf(event_type = 'page_view') * 100, 2) AS conversion_pct

FROM events

WHERE date = today();
ClickHouse Analytics Event Driven Design

FAQ - คำถามที่พบบ่อย

Q: ClickHouse กับ BigQuery อันไหนดีสำหรับ event analytics?

A: ClickHouse: self-hosted, real-time (sub-second), no query cost, full control BigQuery: managed, serverless, pay-per-query, easy setup ClickHouse ดีกว่า: real-time requirements (< 1s latency), high query volume, cost control BigQuery ดีกว่า: team เล็กไม่อยาก manage infra, ad-hoc analytics, GCP ecosystem

เนื้อหาเกี่ยวข้อง — Mintlify Docs CQRS Event Sourcing

Q: Kafka Engine กับ custom consumer อันไหนดี?

แนะนำเพิ่มเติม — อีบุ๊กการลงทุน SiamCafeBook

A: Kafka Engine: ง่ายที่สุด — ClickHouse consume จาก Kafka โดยตรง, auto-insert ผ่าน Materialized View Custom consumer: flexible กว่า — transform, validate, enrich ก่อน insert แนะนำ: เริ่มจาก Kafka Engine → ถ้าต้อง transform ซับซ้อน ใช้ Flink/custom consumer

เนื้อหาเกี่ยวข้อง — ทำความเข้าใจ Bull Trap — กับดักขาขึ้นที่นักเทรดต้องระวัง

Q: Event schema evolution จัดการอย่างไร?

A: ClickHouse: ALTER TABLE ADD COLUMN (online, ไม่ block queries) Kafka: ใช้ Schema Registry (Avro/Protobuf) สำหรับ backward compatibility Strategy: เพิ่ม columns ได้เสมอ, อย่าลบ columns, ใช้ Nullable สำหรับ optional fields default values สำหรับ new columns → backward compatible

แนะนำเพิ่มเติม — บทวิเคราะห์จาก XM Signal

เนื้อหาเกี่ยวข้อง — แนะนำให้อ่าน Web Components Distributed System — คู่มือฉบับสมบูรณ์ 2026

Q: Data retention จัดการอย่างไร?

A: ClickHouse TTL: TTL date + INTERVAL 90 DAY → auto-delete data เก่ากว่า 90 วัน Tiered storage: hot (SSD, 7 days) → warm (HDD, 90 days) → cold (S3, 1 year) DROP PARTITION: ลบ partition ทั้ง month ได้ทันที (เร็วมาก) Kafka retention: ตั้ง retention.ms สำหรับ replay window (e.g., 7 days)

เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: Betteruptime Backup Recovery Strategy

เปิดบัญชีเทรดกับ XM — โบรกที่ อ.บอม ใช้เทรดจริง (พาร์ทเนอร์ XM)

XM Legend · เทรดเดอร์ & ผู้สอน Forex 13 ปี

ผู้ก่อตั้ง SiamCafe ตั้งแต่ปี 1997 · เทรดเดอร์สาย Forex มากกว่า 13 ปี ได้รับการยกย่องเป็น XM Legend · แบ่งปันความรู้ Forex, ไอที, AI และการเทรด จากประสบการณ์จริงในตลาดจริง