เบื้องหลังข้อมูลราคาน้ำมันวันนี้ที่คุณเห็น ไม่ใช่แค่ตัวเลขบนป้ายไฟ
ทุกเช้าที่ผู้ใช้เปิดแอปพลิเคชันเพื่อเช็ค ราคา น้ำมัน วัน นี้ พวกเขาอาจไม่เคยรู้ว่ามีระบบซอฟต์แวร์ที่ซับซ้อนทำงานอยู่เบื้องหลัง เพื่อให้ตัวเลขนั้นถูกต้อง แม่นยำ และปรากฏได้ภายในเสี้ยววินาที ในบทความนี้เราจะพาไปดูมุมมองวิศวกรรมของระบบที่ขับเคลื่อนการรายงานราคาน้ำมันแบบเรียลไทม์ ตั้งแต่ Data Pipeline - API Gateway, Edge Computing ไปจนถึง Observability และ Machine Learning
การที่เราจะส่งมอบ ราคา น้ำมัน วัน นี้ ให้ถึงมือผู้ใช้นับล้านได้อย่างต่อเนื่อง ไม่ได้พึ่งพาแค่การอัปเดตฐานข้อมูลเพียงครั้งเดียว แต่คือการออกแบบระบบกระจายตัว (Distributed System) ที่ต้องรับมือกับความล่าช้าของเครือข่าย ความไม่สอดคล้องของข้อมูลจากหลายแหล่ง และการเปลี่ยนราคากะทันหันตามนโยบายภาครัฐ ในฐานะทีมวิศวกรที่เคยพัฒนาแพลตฟอร์มเปรียบเทียบราคาพลังงาน เราพบว่าเรื่องเล็กๆ อย่าง Timezone และ Latency สามารถทำให้ผู้ใช้เห็นราคาผิดพลาดได้ทั้งวัน
วันนี้เราจะถอดบทเรียนทางเทคนิคจากประสบการณ์จริง พร้อมแนวทางที่เราใช้เพื่อให้ "ราคาน้ำมันวันนี้" ที่คุณเช็คคือตัวเลขเดียวกันกับที่ปั๊ม ไม่ว่าจะอยู่จังหวัดไหนเวลาใดก็ตาม
ต้นกำเนิดข้อมูลราคาน้ำมันวันนี้: จากโรงกลั่นถึงหน้าจอใน 2 วินาที
ก่อนจะถึงหน้าจอมือถือ ราคา น้ำมัน วัน นี้ เริ่มต้นจากระบบ ERP ของบริษัทน้ำมันแต่ละแห่ง เช่น PTT, Bangchak, Shell ที่ประกาศราคาขายปลีกผ่าน API ภายใน หรือบางกรณีใช้การดึงข้อมูลจากหน้าเว็บ (Web Scraping) เมื่อข้อมูลเหล่านั้นยังไม่มีช่องทางมาตรฐาน เราเคยต้องสร้าง Connector มากกว่า 10 รูปแบบเพื่อรับ XML, JSON, CSV และแม้กระทั่งข้อมูลในรูปแบบสเปรดชีตที่ส่งอีเมลมาทุกเช้า
ปัญหาที่พบคือรูปแบบข้อมูลไม่เป็นมาตรฐานเดียวกัน ฟิลด์ "price" อาจมีค่าเป็น "35. 45" หรือ "35. 45 บาท" หรือ "35. 45 THB" และบางครั้งใช้หน่วยเป็นสตางค์ ทำให้ขั้นตอน Data Ingestion ต้องมี Layer สำหรับ Normalization โดยเฉพาะ เราใช้ Apache NiFi เป็นตัวกลางทำ Data Routing และเพิ่ม Metadata เช่น source_timestamp เพื่อตรวจสอบที่มาภายหลัง
สถาปัตยกรรม Real-time Data Ingestion สำหรับราคาน้ำมัน
เมื่อพูดถึง Real-time หลายคนคิดถึง Kafka ทันที แต่ในการส่งข้อมูล ราคา น้ำมัน วัน นี้ ที่อัปเดตเพียงวันละ 1-2 ครั้ง เราพบว่าการใช้ Change Data Capture (CDC) จากฐานข้อมูลต้นทางร่วมกับระบบ Pub/Sub บนคลาวด์ เช่น Google Cloud Pub/Sub เพียงพอและมีค่าใช้จ่ายต่ำกว่า เราออกแบบให้ทุกครั้งที่มีการเปลี่ยนแปลงในตาราง fuel_price ของผู้ให้บริการ จะส่ง Event ผ่าน Topic ทันที โดยใช้ Debezium เชื่อมต่อกับ PostgreSQL ของแหล่งข้อมูล
ความท้าทายคืออัตราการอัปเดตที่ไม่สม่ำเสมอ - บางวันมีการเปลี่ยนแปลงราคากลางวันเมื่อนโยบายรัฐเปลี่ยน - ทำให้ระบบต้องรองรับ Burst Traffic ได้ เราจึงใช้ Queue-Based Load Leveling ด้วย Amazon SQS เพื่อป้องกันไม่ให้ Consumer อย่าง Mobile Backend ล่มเมื่อมีหลายพัน Event ในวินาทีเดียว ผลลัพธ์คือการประมวลผลราคาน้ำมันวันนี้จากต้นทางถึงผู้ใช้เฉลี่ยอยู่ที่ 1. 8 วินาที แม้ในวันที่มีการประกาศราคาพิเศษ
การต่อสู้กับ Dirty Data: ทำความสะอาดราคาน้ำมันวันนี้ด้วย ETL Pipelines
ข้อมูลดิบที่เข้ามามักปนเปื้อนค่าที่ไม่สมเหตุสมผล เช่น ราคาน้ำมันดีเซลลดลงเหลือ 12 บาท หรือเพิ่มเป็น 55 บาทในเวลาเดียว เราสร้าง ETL Pipeline ด้วย Apache Beam ที่ทำงานบน Dataflow เพื่อทำ Validation แบบมี State กล่าวคือ ถ้าราคา ราคา น้ำมัน วัน นี้ เปลี่ยนแปลงเกิน 10% จากค่าเฉลี่ย 7 วัน ระบบจะระงับการเผยแพร่และแจ้งเตือนทีม Operation ทันที
นอกจากนี้ เรายังใช้ Great Expectations library สำหรับ Data Quality Checks โดยนิยาม Expectation Suite ว่า "ราคาทุกประเภทต้องอยู่ระหว่าง 15. 00-50. 00 บาท" และ "ค่าราคาต้องไม่เป็น null หากแหล่งข้อมูลมีสถานะ Active" การตรวจสอบนี้รันทุก 5 นาที และบันทึกผลลง Data Catalog เพื่อให้ทีม Data Science นำไปวิเคราะห์ anomaly ภายหลัง วิธีนี้ลดจำนวนครั้งที่แอปแสดงราคาผิดพลาดลง 92%
API Gateway และ Cache Strategy รองรับผู้ใช้หลักล้านที่เช็คราคาน้ำมันวันนี้
แอปเช็ค ราคา น้ำมัน วัน นี้ ยอดนิยมมีผู้ใช้หลายล้านคนต่อวัน แต่ข้อมูลดิบเปลี่ยนแปลงน้อยมาก คำถามคือจะลด Latency อย่างไรโดยไม่เพิ่มค่าใช้จ่ายเซิร์ฟเวอร์? เราออกแบบ API Gateway ด้วย Kong โดยทำ Response Caching ที่ระดับ Gateway เป็นเวลา 10 นาที พร้อมกำหนด Cache Key จาก query parameters เช่นเชื้อเพลิงและจังหวัด
อย่างไรก็ตาม เมื่อเกิดการเปลี่ยนราคาจริง เราต้องทำให้ Cache Invalid ทั่วทั้งระบบแบบ Near Real-time เราใช้ Event-Driven Cache Eviction ด้วยการ Subscribe Topic เดียวกับ Data Pipeline แล้วเรียก Admin API ของ Kong เพื่อล้าง Cache เฉพาะทรัพยากรที่เกี่ยวข้อง ทดสอบแล้วพบว่า 99% ของผู้ใช้ได้รับราคาล่าสุดภายใน 15 วินาทีหลังการเปลี่ยนแปลง และระบบรับ Traffic ได้มากกว่า 50,000 requests/วินาที โดยไม่ต้อง Scale Out ฐานข้อมูล
Edge Computing กับปั๊มน้ำมัน: อัปโหลดราคาน้ำมันวันนี้จากหน้างาน
ในระบบที่เราออกแบบให้เจ้าของปั๊มสามารถยืนยัน ราคา น้ำมัน วัน นี้ ของหน้าร้านผ่าน Tablet เราพบปัญหาการเชื่อมต่อไม่เสถียรในพื้นที่ห่างไกล ทางออกคือการใช้ Offline-First Architecture ด้วย AWS IoT Greengrass ที่ Edge Device สามารถบันทึกราคาลงฐานข้อมูล SQLite ในเครื่อง และซิงค์กับคลาวด์เมื่อสัญญาณกลับมา
ความท้าทายคือการตรวจจับความขัดแย้ง (Conflict Resolution) เมื่อพนักงาน 2 คนแก้ไขราคาพร้อมกัน เราใช้ CRDT (Conflict-free Replicated Data Type) บนฐานข้อมูลไร้เซิร์ฟเวอร์เช่น AWS AppSync ทำให้ทุกอุปกรณ์มีสถานะราคาที่สอดคล้องกันในที่สุด โดยไม่ต้องล็อกส่วนกลาง แนวทางนี้ช่วยให้ข้อมูลราคาน้ำมันวันนี้จากปั๊มขนาดเล็กในชนบทสะท้อนเข้าสู่ระบบกลางได้แม่นยำขึ้น 75%
ความท้าทายของ Time Synchronization และ Consistency ในระบบกระจายตัว
เมื่อแหล่งข้อมูลหลายแห่งรายงาน ราคา น้ำมัน วัน นี้ ณ เวลาต่างกัน การระบุว่า "ราคาล่าสุด" คือค่าใดกลายเป็นปัญหาเชิงเวลา เราบังคับใช้ NTP (Network Time Protocol) ทุกเซิร์ฟเวอร์ และประทับเวลาแบบ UTC ในทุก Message พร้อมใช้เทคนิค Hybrid Logical Clock (HLC) ตามแนวคิดใน paper "Logical Physical Clocks" เพื่อเรียงลำดับเหตุการณ์โดยไม่ต้องพึ่งพาแหล่งเวลาภายนอกโดยสมบูรณ์
เพื่อหลีกเลี่ยง Phantom Read ที่ผู้ใช้เห็นราคาคนละค่าในเวลาเดียวกัน เราใช้ Read-Your-Writes Consistency ในระดับ Session บน Redis Cluster โดยกำหนดให้ผู้ใช้ที่เพิ่งร้องขอราคาเมื่อ 2 นาทีก่อน จะได้รับข้อมูลจาก Master Node เสมอ ไม่ใช่ Slave ที่อาจตามหลัง ผลลัพธ์คือการร้องเรียนเรื่องราคาไม่ตรงลดลง 60
.Need a Custom App Built?
Let's discuss your project and bring your ideas to life.
Contact Me Today →