Parse ผู้ให้บริการ API สำหรับแอพพลิเคชั่นบนสมาร์ทโฟนพัฒนาบริการขึ้นมาจาก Ruby on Rails เป็นหลัก แต่เมื่อจำนวนเครื่องลูกข่ายที่ต้องให้บริการเพิ่มขึ้นอย่างรวดเร็วและโค้ดมีขนาดใหญ่ขึ้นเรื่อยๆ Ruby on Rails กลับแสดงปัญหา
เพียงแค่ปี 2012 ทาง Parse ต้องดูแลเซิร์ฟเวอร์ถึง 200 เครื่องบน AWS เป็น unicorn worker 24 โปรเซสต่อเครื่องให้บริการ 3000 ครั้งต่อวินาทีให้กับแอพพลิเคชั่น 60,000 แอพ ระยะเวลาการขึ้นระบบแต่ละรอบใช้เวลา 20 นาที
ทาง Parse หาทางออกอื่นๆ ด้วยการหาโมเดลการให้บริการแบบ asynchronous ที่แต่ละโปรเซสสามารถรองรับการเชื่อมต่อได้จำนวนมากๆ ทีมงานศึกษาศึกษาทางเลือกหลายทาง ได้แก่ EventMachine, JRuby, C++, C#, และ Go สุดท้ายทีมงานเลือก C# และ Go เป็นสองตัวเลือกสุดท้ายเพราะรองรับ asynchronous ในตัวภาษาเอง ส่วน C# ตกไปเพราะไม่สามารถทำงานกับลินุกซ์ได้ดีพอ
ทีมงานพบว่า Go ทำงานได้อย่างน่าประทับใจ แต่ละการเชื่อมต่อกินหน่วยความจำเพียง 4 กิโลไบต์ ระบบพุชข้อความรองรับการเชื่อมต่อได้ 1.5 ล้านการเชื่อมต่อ จากเดิมที่ได้เพียง 250,000 การเชื่อมต่อ
ความยากในการพอร์ต API จาก Ruby มายัง Go คือการรองรับความผิดพลาดแบบเดียวกับที่ Ruby รองรับ เช่นการ encode ตัวอักขระแบบ Unicode อย่างผิดพลาด, หรือเนื้อข้อความใน HTTP ที่ไม่ควรมีเนื้อ ทีมงานต้องพอร์ตพฤติกรรมเหล่านี้มายัง Go เพื่อให้ API ทำงานได้เหมือนเดิม
การอัพเกรดเวอร์ชั่นใหม่ใช่เวลาลดลงจาก 30 นาทีเหลือ 3 นาที กระบวนการทดสอบ API ใช้เวลาจาก 25 นาทีเหลือ 2 นาที และ Go รองรับการรีสตาร์ตเซิร์ฟเวอร์โดยไม่ตัดการเชื่อมต่อผ่านแพ็กเกจ grace (พัฒนาโดยเฟซบุ๊กบริษัทแม่ของ Parse)
ทาง Parse จะไปร่วมงาน GopherCon ในปีนี้
ที่มา - Parse
Comments
ใช่เวลา => ใช้เวลา
ตรง C# ยังงงๆ ครับ
edit: อ่อ เข้าใจแล้ว :)
ต้องไปดูๆ GO บ้างแล้ว, แต่ c# ก็มี Mono นี่ครับที่ทำงานบน Linux หรือมาช้าไป ว่าแต่ทำไมไม่เลือก java ด้วยละงง
Mono Regular Expression ช้ามากคับ
Java ไม่มี Syntax เฉพาะสำหรับทำ Asynchronous คับ ทำให้เขียนลำบาก
ขอบคุณครับ
ทีมงานลืม Node,js ไปหรือเปล่า
ผมว่า node.js ยังไม่ดีพอนะครับดูตัวอย่างภาษาที่ทีมเขาเลือกใช้ EventMachine, JRuby, C++, C#, Go
ไม่ต่างอะไรกับ Java เลยคับ ไม่มี Syntax สำหรับ Asynchronous โดยเฉพาะ
ผมว่า node.js ในตัวภาษาของมันเองเลยก็มี class Promise ให้หรือจะใช้การ callback ก็ได้นะครับ น่าจะพอเทียบเคียง Asynchronous ได้
งั้นแบบนี้ต้องลองไปใช้ Go Routine ของ Go หรือ async/await ของ C# ดูคับ แล้วจะเข้าใจที่ผมบอก
Node.JS นี่ Asynchronous เป็นงานหลักเลยนะครับ Library 90% ก็เป็น Asynchronous ทำงานได้รวดเร็วเช่นกันเพราะใช้ Engine V8 จาก Google เป็นจุดเด่นของ Node เลยแต่ข้อเสียของ Node คือถ้าเป็น Project ขนาดใหญ่มาก Code Maintain ยากมากครับ (ถึงจะใช้ promise ก็เถอะ) มาตรฐาน ES6 ก็ไม่ standard สักที (ผมรอมา 3 ปีแล้วมั้งจากที่เริ่มใช้)
ไม่รู้ว่าผมเข้าใจถูกหรือเปล่า
synchronous = พร้อมกัน
asynchronous = ไม่พร้อมกัน
ปกติ node.js จะทำงานแบบ asynchronous คือทำงานแบบตามลำดับไปเรื่อยๆ จากบนลงล่าง แต่ด้วยความฉลาดของมันมันจะข้ามการทำงานที่ต้องรอนานๆ มันข้ามไปเลยมันไม่รอให้เสร็จก่อน การข้ามไปของมันทำมันจึงดูคล้ายๆกับการทำงานแบบ synchronous แต่อย่างที่รู้กันงานบางอย่างทำงานเรียงลำดับกัน ที่เรียกว่า asynchronous ซึ่ง node.js จะมีวิธีจัดการพวกนี้หลักๆ อยู่ 3 วิธีมีชื่อว่า
1. promise
2. callback
3. event
ยกตัวอย่างงานง่ายๆ asynchronous เอาข้อมูลเข้าดาต้าเบส งานต่อไปดูข้อมูลทั้งหมดในด้าต้าเบสรวมข้อมูลใหม่ที่เอาเข้าไปด้วย
ถ้าเป็นภาษาทั่วไปจะเขียน
ถ้าเป็น node.js จะเขียนแบบข้างบนไม่ได้ จะไม่ได้ข้อมูลล่าสุดที่เอาเข้าไป จะต้องเขียนประมาณนี้
JavaScript มัน "ไม่มี Syntax สำหรับ Asynchronous โดยเฉพาะ" อ่านดีๆคับ ผมไม่ได้บอกว่ามันทำ Asynchronous ไม่ได้ รู้มั้ยคับ ว่า Go เวลาเขียน Asynchronous ทำไง? เขียนเหมือน Synchronous เลยคับ ไม่มี callback ไม่มี promise เช่น
len, data := sock.Recv()
ข้างบนไม่ใช่ Code จริงนะคับ แต่ก็ประมาณนี้ละ บรรทัดนี้มันจะรอจนกว่าจะมี Data เข้ามาที่ Socket ถึงจะอ่านได้ แต่ถ้าไม่มี Thread นี้จะวิ่งไปรัน Go Routine ตัวอื่นที่พร้อมจะรันแล้ว พอบรรทัดข้างบนมันพร้อมแล้วมันถึงจะวิ่งมารันอัตโนมัติ
ส่วนของ C# นี่ก็คล้ายๆกันคับ
result = await sock.RecvAsync();
แต่ของ C# Flow จะต่างจากของ Go คือ มันจะรีเทินจากฟังชั่นนี้ทันทีถ้ายังไม่มี Data เข้ามา พอมี Data เข้ามาถึงจะวิ่ง Code ข้างล่างต่อใน Thread เดิม
ส่วนภาษาที่ไม่มี Syntax เฉพาะ ก้ต้องอาศัย callback หรือ promise อะไรก็ว่าไป ถ้า Node ก็อารมณ์ราวๆ
sock.recv(function () {
// do something
})
โทษทีครับ ผมอ่านตกไป ขออภัย
เข้าใจแล้วครับแต่ node.js จริงๆก็มี function ประมาณนี้เหมือนกันนะ เพียงแต่มีน้อย
fs.mkdirSync
fs.readdirSync
fs.writeSync
fs.closeSync
fs.readSync
อันนี้มัน Synchronous ไม่ใช่เหรอคับ
บอกไม่ถูกแต่น่าจะเหมือนกันนะ
ปกติถ้าเขียน node.js จะเขียนประมาณนี้ใช้ไหม
fs.readFile('xxxx.txt', function(err, data){
});
แต่ถ้าใช้ fs.readFileSync() จะเขียนแบบนี้ได้
var data = fs.readFileSync('xxxx.txt');
ขอโทษครับ ผมไม่เข้าใจเรื่อง asynchronous เอง แต่ล่ะภาษาอาจใช้ไม่เหมือนกันด้วย
คอนเซ็ปคล้ายกัน ต่างกันที่ตัวภาษาครับ ข้อมูลเพิ่มเติม
http://stackoverflow.com/questions/21336976/node-js-vs-async-await-in-net
ทุกวันนี้ nodejs มี async/await ใช้แล้วนะครับ
Babel สิครับ
เท่าที่ใช้งานมา โค้ดมันอ่านยาก/maintain ยากมากครับ
lewcpe.com, @wasonliw
Node.js ทำงาน thread เดียว(ถ้าไม่ได้เขียน cluster) Go lang เป็น multi-thread หรือป่าว
มันต่างกันอย่างไรกับการเขียน โปรแกรมให้ทำ multithreading ครับ
goroutine เบากว่าเยอะครับ ใช้แรมต่อชุดน้อยกว่า
lewcpe.com, @wasonliw
เข้าใจถูกไหมว่า มันก็คือการทำงาน ขัดจังหวะ โดยไม่แยก เทรดใหม่ มันสามารถ ทำงานพร้อมกันได้ใน เทรดเดียวใช่ไหมครับ ผมเข้าใจถูกไหม
จริงๆ แล้ว Ruby ก็มีตัวช่วยเกี่ยวกับ Async เยอะเหมือนกันนะครับ
อย่าง EventMachine ที่ใช้ syntax คล้ายๆ node.js
หรือ SideKiq ที่ใช้ Redis Server มาช่วยงาน
หรือจะเป็น Promise framework Ruby ก็มีครับ
หรือจะ built-in มากับภาษาเลย อย่าง fiber
ที่ดูน่าลองตอนนี้ Ilya Grigorik ซึ่งเป็น engineer อยู่ที่ Google
เค้าเอาแรงบันดาลใจมาจากภาษา Go นี่แหละ มาทำ Ruby gem ที่ชื่อ Agent
https://github.com/igrigorik/agent
และก็มีคนเอามาทำ abstraction class gem คลุมออกมา
https://github.com/ruby-concurrency/concurrent-ruby
ใช้ Ruby เหมือนกันครับ ( แต่ไม่ได้เขียนซะทีเดียว ผมทำ UI )
ไม่รู้ว่าจะเกี่ยวกับหัวข้อข่าวไหม แต่เมื่อประมาณต้นๆปี เคยนั่งฟังกับพี่คนนึง พี่แกบอกว่า Ruby กำลังมาก็จริง แต่เมื่อถึงจุดนึงที่ App ใหญ่มากๆ code เยอะและฟีเจอร์บานบ้อง ruby จะไปไม่ไหว ยิ่งวาง architecture ไม่ดีก็จบกัน เพราะเหมือนจะมีปัญหาเรื่องการจัดการทรัพยากรอยู่ จะไปเพิ่มเครื่องก็มีแต่แก้ปัญหาปลายเหตุ และก็ต้องทำแบบนี้ไปเรื่อยๆ แต่ทำแบบนี้ไม่ได้นานหรอก เดี๋ยวถึงจุดนึงมันก็จะน๊อคไปเอง
เรื่องนี้พี่แกพูดไว้จะปีกว่าแล้ว แต่ไม่ค่อยมีใครสนใจ ยิ่งมาเห็นข่าวนี้ยิ่งทำให้ชัดแจ่มขึ้น แค่คนรอบตัวตอนนี้ยังไม่รู้ตัว คิดแล้วก็หนาว :(
startup ใหญ่ ๆ ระดับโลกก็เปลี่ยนจาก RoR ไปใช้ภาษาอื่น ๆ เยอะเหมือนกันครับ ผมว่ามันเหมาะกับโปรเจคสำหรับเริ่มต้นถึงกลางมากกว่า มันพัฒนาได้ไวมาก ไม่ต่างไรกับ django เลย ไวข้ามโลก แต่golang นี่เหมือนจะเลือกหยิบอะไรต่อมิอะไรให้เหมาะต่อการทำงานได้ดีมาก เฉียด c++ ในเรื่อง perfermance แต่ชนะในเรื่อง fun and beautyful
หึ
ดีกว่า java ทุกอย่างยกเว้น community and library ครับ ความเร็ว default ชนะ ความ fun ชนะ beauty ชนะ . ผมย้ายมาฝั่งนี้แล้วแหละ คนเล่นน้อย ไว้เผื่อจะได้เป็นคนแก่ของ golang thailand บ้าง