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();

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)





