แนวคิด Gumon¶
Gumon คือระบบแบบ Composable System = Microservices + Event-Driven แอปหนึ่งตัวเกิดจากการหยิบ service สำเร็จรูปหลายตัวมาประกอบกัน service ตัวเดียวให้บริการได้หลายแอปพร้อมกัน · สร้างแอปใหม่จาก service ที่มีอยู่ได้ทันที · เพิ่ม service ใหม่ได้โดยไม่กระทบของเดิม
- 3 ชั้นของระบบ
- กฎ: service คุยกันผ่าน Kafka เท่านั้น
- app และ organization
- header appKey และ serviceKey
- core set กับ service ธุรกิจ
3 ชั้นของระบบ¶
Data Stream Layer (Kafka) ◀──▶ API Service Layer ◀──▶ Application Layer
event streaming / data sync core set + service ธุรกิจ หน้าบ้าน: admin · เว็บ · มือถือ · kiosk
| ชั้น | หน้าที่ |
|---|---|
| Data Stream Layer | Kafka เป็นทางเดินข้อมูลระหว่าง service ทั้งหมด ทั้ง event และการ sync ข้อมูล |
| API Service Layer | service พร้อมใช้ แต่ละตัวมี GraphQL API ของตัวเอง ฐานข้อมูลของตัวเอง และรองรับหลายแอป |
| Application Layer | หน้าบ้านทุกชนิด เรียก GraphQL ของแต่ละ service ตรง ดู หน้าบ้าน (Admin UI) |
กฎ: service ↔ service คุยกันผ่าน Kafka เท่านั้น¶
- service ห้าม เรียก API (GraphQL/HTTP) ของ service อื่นตรง ๆ ให้ส่งและรับข้อมูลผ่าน Kafka topic
- หน้าบ้าน เรียก GraphQL API ของแต่ละ service ได้ตรง
ทำไมต้องเป็น event¶
ถ้า service A เรียก service B ตรง ๆ วันที่มี service C อยากรู้เหตุการณ์เดียวกันเพื่อไปทำงานของตัวเองต่อ ต้องกลับไปแก้ A ถ้า A ปล่อย event ออกมา C แค่ subscribe topic นั้นเพิ่ม ของเดิมไม่ต้องแตะเลย
ผลที่ได้ตามมา
- แต่ละ service เก็บ สำเนา ข้อมูลที่ตัวเองต้องใช้ (ข้อมูลแอป, organization, สิทธิ์ผู้ใช้ ฯลฯ) ไว้ใน DB/Redis ของตัวเอง ⇒ ไม่ต้องรอถามใคร ทำงานต่อได้แม้ต้นทางไม่อยู่
- service ที่เข้ามาทีหลังตามข้อมูลเดิมทันได้ด้วย topic
refresh-data(ดู วงจรชีวิตของ service) - ตรวจสิทธิ์ได้ในตัว เพราะ UserPolicy ถูกส่งมาให้ล่วงหน้าผ่าน
sync-user-policyไม่ต้องถาม service อื่นตอนรับ request - service เดียวกันรันหลาย replica ได้ — consumer group ของ Kafka ส่งแต่ละข้อความให้ replica เดียว
สิ่งที่ต้องออกแบบรองรับ: ข้อมูลระหว่าง service เป็นแบบ eventually consistent (สำเนาจะตามมาภายหลังเล็กน้อย)
app และ organization¶
app (appKey) ─┬─ organization (organizationId / orgKey) ─ องค์กรลูก
└─ user (authId) — บัญชีผูกกับแอป
| ระดับ | ความหมาย |
|---|---|
| app | โซลูชันหนึ่งชุด มีธีม โดเมน และ credential ของตัวเอง · ระบุด้วย appKey · แอป SYSTEM ถูกสร้างตอนตั้งระบบครั้งแรก |
| organization | หน่วยงานภายในแอป จัดเป็นต้นไม้ (มีองค์กรลูกได้) · role ระดับองค์กรกำหนดสิทธิ์ลงองค์กรลูกได้ |
| user | บัญชีผู้ใช้ผูกกับแอป — คนเดียวใช้ 2 แอปคือ 2 บัญชี |
ทุก service เก็บข้อมูลของทุกแอปไว้รวมกัน โดยทุก record มี appKey กำกับ
header appKey และ serviceKey¶
ข้อความ Kafka ระหว่าง service มี header 2 ตัว
| header | ความหมาย |
|---|---|
appKey |
ข้อความนี้เป็นข้อมูลของแอปไหน |
serviceKey |
service ปลายทาง ที่ข้อความนี้ส่งถึง (ไม่ใส่ = ส่งถึงทุก service) |
⚠️
serviceKeyคือ ปลายทาง ไม่ใช่ตัวผู้ส่ง เช่น service ธุรกิจส่งset-scheduleให้ใส่serviceKey: schedule· ส่งcreate-notificationใส่notification· ส่งsync-permissionใส่access-control· ส่งsync-file-uploadใส่storage
service ปลายทางรับข้อความของแอปใดได้ก็ต่อเมื่อตัวเองถูกเพิ่มเข้าแอปนั้นแล้ว (มี AppCertificate ของแอปนั้น) ดู วงจรชีวิตของ service
core set กับ service ธุรกิจ¶
ตอนลงทะเบียน service มีค่า isCoreSet
isCoreSet: true— service ที่ระบบต้องมีเพื่อให้ทำงานได้ โดยยังไม่มีธุรกิจใดเกี่ยวข้อง · ถูกตั้งขึ้นพร้อมกันตอนinit-systemและถูกผูกเข้าทุกแอปใหม่อัตโนมัติisCoreSet: false— service ธุรกิจ (ค่าเริ่มต้น) เช่น CMS, content หรือ service ที่ทีมสร้างเองตามงาน · ลงทะเบียนเข้าระบบและเพิ่มเข้าแอปที่ต้องใช้ทีละแอป
core set¶
| serviceKey | หน้าที่ |
|---|---|
core |
ทะเบียน service · ผู้ออกกุญแจ (SystemCertificate / AppCertificate) · ค่าตั้ง service · สั่ง refresh-data · init-system — Core Service |
authentication |
บัญชีผู้ใช้ · login ทุกแบบ · token · เจ้าของ AppCredential — Authentication Service |
application |
ข้อมูลแอปและธีม · HostTheme (โดเมน → แอป) — Application Service |
access-control |
ทะเบียน permission · role · Custom Menu · คอมไพล์ UserPolicy แล้วกระจาย — ACL Service |
unit |
organization (ต้นไม้) · นิยาม role · running number · รวมงาน label เดิมไว้ด้วย |
profile |
ข้อมูลส่วนตัวผู้ใช้ · ฟิลด์เสริมที่แอปกำหนดเอง |
notification |
แจ้งเตือน in-app · email · SMS — Notification Service |
schedule |
ตัวกลางตั้งเวลา (cron) ของทั้งระบบ — Schedule Service |
storage |
ไฟล์ · presigned URL · metadata — Storage Service |
labelเดิมถูกยุบรวมเข้าunitแล้ว ไม่นับเป็น service แยก
service ธุรกิจใช้ความสามารถของ core set ผ่าน topic เท่านั้น ดูรายการที่ Kafka topic มาตรฐาน
อัปเดตจากคำผู้พัฒนาและโค้ด gumon-tech · 2026-10-05