https://avatars.githubusercontent.com/u/1217739?size=192

ลองสร้างระบบลงคะแนนเลือกตั้งด้วย Go และ Svelte

ช่วงนี้เห็นมีหาเสียงเลือกตั้งองค์กรปกครองส่วนท้องถิ่นกัน เลยถือโอกาสหยิบเว็บเทคโนโลยีนึงที่เหมือนจะถูกมองข้ามเช่น Server-Sent Events (SSE) มาสร้างเป็นระบบลงคะแนนเสียงแบบออนไลน์ที่รองรับการแสดงผลคะแนนแบบเรียลไทม์อย่างง่ายโดยใช้ภาษา Go สำหรับ backend และ Svelte สำหรับ frontend ดู

เขียน Go เรียกใช้ resource เดียวกันแต่ไม่อยากใช้ Exclusive Lock มีทางไหนบ้าง 🤔

ในภาษา Go การใช้ Mutex (Mutual Exclusion) เป็นวิธีการหนึ่งในการจัดการกับการเข้าถึงข้อมูลที่ใช้ร่วมกันในหลายๆ โค้ดหรือ Goroutine เพื่อป้องกันการเกิด Race Conditions ซึ่งอาจทำให้ข้อมูลเสียหายได้ แต่ในบางครั้งการใช้ Mutex ก็อาจทำให้เกิดปัญหาด้านประสิทธิภาพและความซับซ้อนของโปรแกรม และเสีย performance ดังนั้นเราลองมาเขียนโดยการหลีกเลี่ยง Mutex Lock โดยไม่จำเป็นกันดูว่าทำยังไงบ้าง

มาลองรู้จักการพยายามเขียนแบบ zero-allocation บน Go

คุณสมบัติอย่างหนึ่งของ Go คือ มันมี Garbage collector (GC) ทำให้ชีวิต Dev อย่างเรา ๆ ไม่ต้องมาปวดหัวกับการที่ต้องมาคอยจัดการหน่วยความจำ ซึ่งความสะดวกนี้มันก็มีสิ่งที่ต้องแลกมานั่นคือ ช่วงเวลาที่ต้องให้ GC ทำงานนั่นเอง ถึงจะไม่ขนาด stop-the-world ก็เถอะนะ เพิ่มเติม Go GC ได้ตามลิ้งก์นี้เลย แต่สำหรับบางงานที่ latency คือสิ่งสำคัญเราก็ต้องมาช่วยให้ GC ทำงานน้อยลงนั่นคือลด heap allocation ลงนั่นเอง เป็นที่มาว่าทำยังไงเราจะลด heap allocation ให้ได้มาและไม่ฝืนจนเกินไป

Messaging อย่างง่าย Go + NATS

ระหว่างที่รอเพื่อนร่วมทางที่ร้านกาแฟ พอมีเวลาว่างเลยนึกขึ้นได้ว่าเราเดินทางกับแบบ asynchronous task เลยนี่หว่า ใครออกมาก่อนทำก่อนถึงก่อน ในระหว่างที่คนอื่นก็เดินทางของตัวเองไป แล้วสุดท้ายมาเจอกันปลายทาง ก็เลยลองเขียน Go + NATS ทำ Pub/Sub ง่อย ๆ บันทึกไว้ว่ามันทำยังไง

ทริกง่าย ๆ กับการเขียนโค้ดไม่ให้บรรพบุรุษเดือดร้อน

ในการเขียนโค้ดกันเป็นทีมมันจะมีเรื่องชวนปวดหัวบ่อย ๆ เลยคือ ใครเขียนโค้ดนี้ว่ะ 🤬 เลยจะต้องมีสิ่งพึงละลึกร่วมกัน หรือตกลงกันในทีมในการเขียนโค้ดให้การกระทบกระทั้งกันน้อยลง โดยจะเอาวิธีง่าย ๆ ที่ช่วยให้ชีวิตชาวเราดีขึ้นมาเสนอลองพิจารณาดูครับ

GOMAXPROCS, GOMEMLIMIT กับ Kubernetes

Go runtime มีค่า ENV ที่สามารถตั้งค่าได้อยู่ไม่กี่ตัว แต่มันจะมีอยู่ 2 ค่าที่ชาว DevOps จะเอามาใช้เป็นค่าเริ่มต้นเลย คือ GOMAXPROCS และ GOMEMLIMIT โดยแต่ละค่าจะใช้ทำอะไรได้บ้างเรามาลองดูกัน