- เว็บไซต์ทดลอง One Million Chessboards มอบ กระดานหมากรุก 1 ล้านกระดานที่ใครก็ควบคุมได้พร้อมกัน
- เมื่อมีคนขยับหมาก การเปลี่ยนแปลงจะสะท้อนแบบเรียลไทม์ไปยังผู้ใช้ทุกคน และ ยังย้ายข้ามกระดานได้อย่างอิสระโดยไม่มีเทิร์น
- สถานะของกระดานทั้งหมดถูกเก็บไว้ใน อาร์เรย์หน่วยความจำ 2 มิติที่ประกอบด้วย
uint64 64 ล้านค่า และใช้เซิร์ฟเวอร์เพียงเครื่องเดียว
- เป็น โปรเจกต์แรกที่เขียนด้วย Go และซิงก์ข้อมูลด้วย ข้อความ Protobuf ที่บีบอัดด้วย zstd บน WebSocket
- เป็นโปรเจกต์ที่ท้าทายมากในเชิงเทคนิค ถึงขั้นใช้เวลาหนึ่งสัปดาห์ไปกับการทำ ลอจิกฝั่งไคลเอนต์แบบ optimistic apply + rollback เพียงอย่างเดียว
One Million Chessboards
- One Million Chessboards มีกระดานหมากรุก 1 ล้านกระดาน และ ทุกคนสามารถขยับหมากได้พร้อมกัน
- ไม่ได้เล่นแบบผลัดเทิร์น เมื่อมีคนขยับหมาก ผู้ใช้ทุกคนจะเห็นผลทันที
- ย้ายข้ามกระดานได้อย่างอิสระ มอบประสบการณ์ที่ไม่เคยมีมาก่อน
ที่มา
- เป็นผลงานทดลองต่อจากโปรเจกต์ One Million Checkboxes ที่ทำไว้ก่อนหน้า โดยตั้งเป้าจะขยายสเกลและความท้าทายให้มากขึ้น
- ผู้สร้างทุ่มเวลาให้กับโปรเจกต์นี้อย่างมาก และหวังว่าทุกคนจะสนุกกับมัน
วิธีการทำงานทางเทคนิค
- โปรเจกต์นี้เป็นงานที่ ท้าทายทางเทคนิคมากที่สุดชิ้นหนึ่ง ในบรรดางานที่ทำมาล่าสุด
- ภาพรวมเทคนิคหลัก:
- ออกแบบโดยคำนึงถึงการขยายระบบ
- ทำงานบนเซิร์ฟเวอร์เดียว
- เก็บกระดานหมากรุกทั้งหมดไว้ในอาร์เรย์
uint64 2 มิติในหน่วยความจำ (รวม 64 ล้านเซลล์)
- แบ็กเอนด์เขียนด้วย Go ซึ่งเป็น โปรเจกต์ Go แรกของผู้สร้าง
- writer thread เดียว + reader thread หลายตัว และควบคุมการเข้าถึงด้วย mutex
- ไคลเอนต์ใช้ optimistic update และหากได้รับอัปเดตที่ชนกันจากเซิร์ฟเวอร์ก็จะ rollback
- ส่ง ข้อความ protobuf ที่บีบอัดด้วย zstd ไปยังไคลเอนต์ผ่าน WebSocket
- ไคลเอนต์ถูกแบ่งเป็น โซน 50x50 และรับเฉพาะการเคลื่อนไหวของโซนข้างเคียง
- ข้อมูลส่วนกลาง (สถิติ, มินิแมป ฯลฯ) ถูก polling ผ่าน HTTP GET โดยใช้ Cloudflare cache
แกนสำคัญของการทำงานฝั่งไคลเอนต์
- แนวทาง optimistic update + rollback มีความยาวราว 1,600 บรรทัดของโค้ด และใช้เวลาพัฒนาแบบทุ่มเต็มที่ 7 วัน
> “มันเป็นปัญหาที่ต่อสู้ด้วยยากที่สุดในช่วงหลังนี้”
กระแสตอบรับหลังเปิดตัว
- ภายใน 8 ชั่วโมงหลังเปิดตัว มี การขยับหมากมากกว่า 1.3 ล้านครั้ง และมี ผู้ใช้งานพร้อมกันราว 400 คน
- ภาระบนเซิร์ฟเวอร์ ต่ำจนแทบมองข้ามได้
สถิติปัจจุบัน
- จำนวน ผู้เล่นออนไลน์ : 199,276 คน
- จำนวนการขยับทั้งหมด: 5,238,978 ครั้ง
- จำนวนหมากทั้งหมด: 1,490,061,914 ตัว
- จำนวนคิง: 9,035,389 ตัว
3 ความคิดเห็น
ถ้าลดขนาดลงอีกนิดจะดีกว่าไหม... โอกาสที่จะได้เจอใครสักคนมีน้อยเกินไปเลย 555 ฮือฮือ
ลองทดสอบดูแล้ว รู้สึกว่าน่าสนใจตรงที่ตอนนี้สามารถออกนอกตารางไปยังกระดานหมากรุกด้านล่างโดยอิงฝั่งดำได้
ความเห็นจาก Hacker News
สวัสดี! ผมเป็นคนทำเอง ขอโทษที่คำอธิบายในบล็อกยังไม่มากพอ ถ้ามีคำถามเกี่ยวกับสถาปัตยกรรมก็ยินดีตอบมาก ผมทุ่มเทกับการทำให้โปรเจกต์นี้รองรับไคลเอนต์พร้อมกันหลายพันคนได้ด้วยโปรเซสเดียว และ golang ก็เหมาะกับงานนี้มาก
เกมนี้เริ่มน่าสนใจขึ้นแล้ว เช่น ผู้คนค้นพบว่ากระดานเดี่ยวที่เติมขอบรอบนอกลึกสองช่องจะไม่มีใครสู้ได้ ชอบมากที่ได้เห็น emergent gameplay นี่คือความอัจฉริยะของโปรเจกต์ของ eieio ภายนอกดูเรียบง่าย แต่เมื่อขยายสเกลแล้วกลับทำให้ค้นพบความเป็นไปได้ที่น่าสนใจ
มีคนใช้เรือประมาณ 40 ตัวล้อมคิงไว้ ผมบุกเข้าไปด้วยม้า แล้วก็โดนคิงกินทันที จากนั้นอีกฝั่งก็ใช้เรือตัวอื่นปิดช่องว่าง สนุกดี
ย้ายข้ามกระดานได้ แต่กินข้ามกระดานไม่ได้ จุดแปลกคือไม่ใช่ว่าการเดินจะไม่ถูกฉายต่อไป เช่น เส้นสีน้ำเงินของควีนชี้ข้ามขอบกระดานได้อย่างถูกต้อง แต่จะหยุดที่หมากทุกตัวบนกระดานอื่น ทำได้ดีมากในฐานะแบบฝึกหัดเรื่องสเกล
เจอบั๊ก: Uncaught TypeError: ไม่สามารถอ่านพร็อพเพอร์ตีของ null ได้
ผมนึกว่าแต่ละกระดานจะมี "เทิร์น" ของตัวเอง ไม่คิดเลยว่าจะสามารถเลือกกระดานแบบสุ่มแล้วปล่อยควีนสีดำออกมา จากนั้นเก็บหมากสีขาวทั้งหมดได้ในขณะที่อีกฝ่ายทำอะไรไม่ได้เลย
มีคนโกงโดยเล่นอีกสีหนึ่ง ผมเหมือนจะเห็นเมื่อวาน แต่วันนี้เห็นชัดแน่ ๆ ดูเหมือนใช้เพื่อการล้างแค้น พอป้อมปราการฝั่งดำถูกทำลาย หมากของป้อมปราการสีขาวที่อยู่ใกล้ที่สุดก็ขยับไปยังตำแหน่งที่แย่ที่สุดทันที
คาดว่าเรื่องนี้จะพัฒนาไปเป็นสงครามบอตได้ เช่น มีโค้ดชิ้นหนึ่งสำหรับดันเบี้ยไปข้างหน้า
การไล่ตามคนอื่นสนุกมาก ถึงไม่ใช่เพราะหมากรุกก็ยังเพลิน
ใช้งานได้ดีบน Firefox บนโทรศัพท์ Android ทำได้ดีมาก