9 คะแนน โดย GN⁺ 2025-04-30 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • เว็บไซต์ทดลอง 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 ความคิดเห็น

 
roxie 2025-05-03

ถ้าลดขนาดลงอีกนิดจะดีกว่าไหม... โอกาสที่จะได้เจอใครสักคนมีน้อยเกินไปเลย 555 ฮือฮือ

 
ifmkl 2025-04-30

ลองทดสอบดูแล้ว รู้สึกว่าน่าสนใจตรงที่ตอนนี้สามารถออกนอกตารางไปยังกระดานหมากรุกด้านล่างโดยอิงฝั่งดำได้

 
GN⁺ 2025-04-30
ความเห็นจาก Hacker News
  • สวัสดี! ผมเป็นคนทำเอง ขอโทษที่คำอธิบายในบล็อกยังไม่มากพอ ถ้ามีคำถามเกี่ยวกับสถาปัตยกรรมก็ยินดีตอบมาก ผมทุ่มเทกับการทำให้โปรเจกต์นี้รองรับไคลเอนต์พร้อมกันหลายพันคนได้ด้วยโปรเซสเดียว และ golang ก็เหมาะกับงานนี้มาก

  • เกมนี้เริ่มน่าสนใจขึ้นแล้ว เช่น ผู้คนค้นพบว่ากระดานเดี่ยวที่เติมขอบรอบนอกลึกสองช่องจะไม่มีใครสู้ได้ ชอบมากที่ได้เห็น emergent gameplay นี่คือความอัจฉริยะของโปรเจกต์ของ eieio ภายนอกดูเรียบง่าย แต่เมื่อขยายสเกลแล้วกลับทำให้ค้นพบความเป็นไปได้ที่น่าสนใจ

  • มีคนใช้เรือประมาณ 40 ตัวล้อมคิงไว้ ผมบุกเข้าไปด้วยม้า แล้วก็โดนคิงกินทันที จากนั้นอีกฝั่งก็ใช้เรือตัวอื่นปิดช่องว่าง สนุกดี

  • ย้ายข้ามกระดานได้ แต่กินข้ามกระดานไม่ได้ จุดแปลกคือไม่ใช่ว่าการเดินจะไม่ถูกฉายต่อไป เช่น เส้นสีน้ำเงินของควีนชี้ข้ามขอบกระดานได้อย่างถูกต้อง แต่จะหยุดที่หมากทุกตัวบนกระดานอื่น ทำได้ดีมากในฐานะแบบฝึกหัดเรื่องสเกล

  • เจอบั๊ก: Uncaught TypeError: ไม่สามารถอ่านพร็อพเพอร์ตีของ null ได้

  • ผมนึกว่าแต่ละกระดานจะมี "เทิร์น" ของตัวเอง ไม่คิดเลยว่าจะสามารถเลือกกระดานแบบสุ่มแล้วปล่อยควีนสีดำออกมา จากนั้นเก็บหมากสีขาวทั้งหมดได้ในขณะที่อีกฝ่ายทำอะไรไม่ได้เลย

  • มีคนโกงโดยเล่นอีกสีหนึ่ง ผมเหมือนจะเห็นเมื่อวาน แต่วันนี้เห็นชัดแน่ ๆ ดูเหมือนใช้เพื่อการล้างแค้น พอป้อมปราการฝั่งดำถูกทำลาย หมากของป้อมปราการสีขาวที่อยู่ใกล้ที่สุดก็ขยับไปยังตำแหน่งที่แย่ที่สุดทันที

  • คาดว่าเรื่องนี้จะพัฒนาไปเป็นสงครามบอตได้ เช่น มีโค้ดชิ้นหนึ่งสำหรับดันเบี้ยไปข้างหน้า

  • การไล่ตามคนอื่นสนุกมาก ถึงไม่ใช่เพราะหมากรุกก็ยังเพลิน

  • ใช้งานได้ดีบน Firefox บนโทรศัพท์ Android ทำได้ดีมาก