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
on
การอัพเกรดเวอร์ชั่นใหม่ใช่เวล
panurat2000 Fri, 12/06/2015 - 06:10
ใช่เวลา => ใช้เวลา
สุดท้ายทีมงานเลือก C# และ Go
AlninlA Fri, 12/06/2015 - 08:30
In reply to การอัพเกรดเวอร์ชั่นใหม่ใช่เวล by panurat2000
ตรง C# ยังงงๆ ครับ
edit: อ่อ เข้าใจแล้ว :)
ต้องไปดูๆ GO บ้างแล้ว, แต่ c#
sukjai Fri, 12/06/2015 - 06:30
ต้องไปดูๆ GO บ้างแล้ว, แต่ c# ก็มี Mono นี่ครับที่ทำงานบน Linux หรือมาช้าไป ว่าแต่ทำไมไม่เลือก java ด้วยละงง
Mono Regular Expression
UltimaWeapon Fri, 12/06/2015 - 06:39
In reply to ต้องไปดูๆ GO บ้างแล้ว, แต่ c# by sukjai
Mono Regular Expression ช้ามากคับ
Java ไม่มี Syntax เฉพาะสำหรับทำ Asynchronous คับ ทำให้เขียนลำบาก
ขอบคุณครับ
sukjai Fri, 12/06/2015 - 06:47
In reply to Mono Regular Expression by UltimaWeapon
ขอบคุณครับ
ทีมงานลืม Node,js ไปหรือเปล่า
WattZ Fri, 12/06/2015 - 08:56
ทีมงานลืม Node,js ไปหรือเปล่า
ผมว่า node.js
bluezip Fri, 12/06/2015 - 09:15
In reply to ทีมงานลืม Node,js ไปหรือเปล่า by WattZ
ผมว่า node.js ยังไม่ดีพอนะครับดูตัวอย่างภาษาที่ทีมเขาเลือกใช้ EventMachine, JRuby, C++, C#, Go
ไม่ต่างอะไรกับ Java เลยคับ
UltimaWeapon Fri, 12/06/2015 - 09:16
In reply to ทีมงานลืม Node,js ไปหรือเปล่า by WattZ
ไม่ต่างอะไรกับ Java เลยคับ ไม่มี Syntax สำหรับ Asynchronous โดยเฉพาะ
ผมว่า node.js
bluezip Fri, 12/06/2015 - 09:50
In reply to ไม่ต่างอะไรกับ Java เลยคับ by UltimaWeapon
ผมว่า node.js ในตัวภาษาของมันเองเลยก็มี class Promise ให้หรือจะใช้การ callback ก็ได้นะครับ น่าจะพอเทียบเคียง Asynchronous ได้
งั้นแบบนี้ต้องลองไปใช้ Go
UltimaWeapon Fri, 12/06/2015 - 10:06
In reply to ผมว่า node.js by bluezip
งั้นแบบนี้ต้องลองไปใช้ Go Routine ของ Go หรือ async/await ของ C# ดูคับ แล้วจะเข้าใจที่ผมบอก
Node.JS นี่ Asynchronous
heha Fri, 12/06/2015 - 10:11
In reply to ไม่ต่างอะไรกับ Java เลยคับ by UltimaWeapon
Node.JS นี่ Asynchronous เป็นงานหลักเลยนะครับ Library 90% ก็เป็น Asynchronous ทำงานได้รวดเร็วเช่นกันเพราะใช้ Engine V8 จาก Google เป็นจุดเด่นของ Node เลยแต่ข้อเสียของ Node คือถ้าเป็น Project ขนาดใหญ่มาก Code Maintain ยากมากครับ (ถึงจะใช้ promise ก็เถอะ) มาตรฐาน ES6 ก็ไม่ standard สักที (ผมรอมา 3 ปีแล้วมั้งจากที่เริ่มใช้)
ไม่รู้ว่าผมเข้าใจถูกหรือเปล่า
bluezip Fri, 12/06/2015 - 11:20
In reply to ไม่ต่างอะไรกับ Java เลยคับ by UltimaWeapon
ไม่รู้ว่าผมเข้าใจถูกหรือเปล่า
synchronous = พร้อมกัน
asynchronous = ไม่พร้อมกัน
ปกติ node.js จะทำงานแบบ asynchronous คือทำงานแบบตามลำดับไปเรื่อยๆ จากบนลงล่าง แต่ด้วยความฉลาดของมันมันจะข้ามการทำงานที่ต้องรอนานๆ มันข้ามไปเลยมันไม่รอให้เสร็จก่อน การข้ามไปของมันทำมันจึงดูคล้ายๆกับการทำงานแบบ synchronous แต่อย่างที่รู้กันงานบางอย่างทำงานเรียงลำดับกัน ที่เรียกว่า asynchronous ซึ่ง node.js จะมีวิธีจัดการพวกนี้หลักๆ อยู่ 3 วิธีมีชื่อว่า
ยกตัวอย่างงานง่ายๆ asynchronous เอาข้อมูลเข้าดาต้าเบส งานต่อไปดูข้อมูลทั้งหมดในด้าต้าเบสรวมข้อมูลใหม่ที่เอาเข้าไปด้วย
ถ้าเป็นภาษาทั่วไปจะเขียน
ถ้าเป็น node.js จะเขียนแบบข้างบนไม่ได้ จะไม่ได้ข้อมูลล่าสุดที่เอาเข้าไป จะต้องเขียนประมาณนี้
JavaScript มัน "ไม่มี Syntax
UltimaWeapon Fri, 12/06/2015 - 11:34
In reply to ไม่ต่างอะไรกับ Java เลยคับ by UltimaWeapon
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
})
โทษทีครับ ผมอ่านตกไป ขออภัย
heha Fri, 12/06/2015 - 11:41
In reply to JavaScript มัน "ไม่มี Syntax by UltimaWeapon
โทษทีครับ ผมอ่านตกไป ขออภัย
เข้าใจแล้วครับแต่ node.js
bluezip Fri, 12/06/2015 - 11:59
In reply to JavaScript มัน "ไม่มี Syntax by UltimaWeapon
เข้าใจแล้วครับแต่ node.js จริงๆก็มี function ประมาณนี้เหมือนกันนะ เพียงแต่มีน้อย
fs.mkdirSync
fs.readdirSync
fs.writeSync
fs.closeSync
fs.readSync
อันนี้มัน Synchronous
UltimaWeapon Fri, 12/06/2015 - 12:02
In reply to เข้าใจแล้วครับแต่ node.js by bluezip
อันนี้มัน Synchronous ไม่ใช่เหรอคับ
บอกไม่ถูกแต่น่าจะเหมือนกันนะ
bluezip Fri, 12/06/2015 - 12:40
In reply to เข้าใจแล้วครับแต่ node.js by bluezip
บอกไม่ถูกแต่น่าจะเหมือนกันนะ
ปกติถ้าเขียน node.js จะเขียนประมาณนี้ใช้ไหม
fs.readFile('xxxx.txt', function(err, data){
});
แต่ถ้าใช้ fs.readFileSync() จะเขียนแบบนี้ได้
var data = fs.readFileSync('xxxx.txt');
ขอโทษครับ ผมไม่เข้าใจเรื่อง asynchronous เอง แต่ล่ะภาษาอาจใช้ไม่เหมือนกันด้วย
คอนเซ็ปคล้ายกัน
war11ck Fri, 12/06/2015 - 15:29
In reply to บอกไม่ถูกแต่น่าจะเหมือนกันนะ by bluezip
คอนเซ็ปคล้ายกัน ต่างกันที่ตัวภาษาครับ ข้อมูลเพิ่มเติม
http://stackoverflow.com/questions/21336976/node-js-vs-async-await-in-net
ทุกวันนี้ nodejs มี async
7elven Wed, 06/09/2017 - 21:23
In reply to JavaScript มัน "ไม่มี Syntax by UltimaWeapon
ทุกวันนี้ nodejs มี async/await ใช้แล้วนะครับ
Babel สิครับ
automaetic9@gm… Sat, 30/09/2017 - 13:46
In reply to ไม่ต่างอะไรกับ Java เลยคับ by UltimaWeapon
Babel สิครับ
เท่าที่ใช้งานมา
lew Fri, 12/06/2015 - 10:38
In reply to ทีมงานลืม Node,js ไปหรือเปล่า by WattZ
เท่าที่ใช้งานมา โค้ดมันอ่านยาก/maintain ยากมากครับ
Node.js ทำงาน thread
chenke Fri, 12/06/2015 - 11:41
In reply to ทีมงานลืม Node,js ไปหรือเปล่า by WattZ
Node.js ทำงาน thread เดียว(ถ้าไม่ได้เขียน cluster) Go lang เป็น multi-thread หรือป่าว
มันต่างกันอย่างไรกับการเขียน
watch99 Fri, 12/06/2015 - 12:18
มันต่างกันอย่างไรกับการเขียน โปรแกรมให้ทำ multithreading ครับ
goroutine เบากว่าเยอะครับ
lew Fri, 12/06/2015 - 12:21
In reply to มันต่างกันอย่างไรกับการเขียน by watch99
goroutine เบากว่าเยอะครับ ใช้แรมต่อชุดน้อยกว่า
เข้าใจถูกไหมว่า
watch99 Fri, 12/06/2015 - 12:31
In reply to goroutine เบากว่าเยอะครับ by lew
เข้าใจถูกไหมว่า มันก็คือการทำงาน ขัดจังหวะ โดยไม่แยก เทรดใหม่ มันสามารถ ทำงานพร้อมกันได้ใน เทรดเดียวใช่ไหมครับ ผมเข้าใจถูกไหม
จริงๆ แล้ว Ruby
vegetable Fri, 12/06/2015 - 14:52
จริงๆ แล้ว 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 เหมือนกันครับ (
nutchapon Sat, 13/06/2015 - 02:41
ใช้ Ruby เหมือนกันครับ ( แต่ไม่ได้เขียนซะทีเดียว ผมทำ UI )
ไม่รู้ว่าจะเกี่ยวกับหัวข้อข่าวไหม แต่เมื่อประมาณต้นๆปี เคยนั่งฟังกับพี่คนนึง พี่แกบอกว่า Ruby กำลังมาก็จริง แต่เมื่อถึงจุดนึงที่ App ใหญ่มากๆ code เยอะและฟีเจอร์บานบ้อง ruby จะไปไม่ไหว ยิ่งวาง architecture ไม่ดีก็จบกัน เพราะเหมือนจะมีปัญหาเรื่องการจัดการทรัพยากรอยู่ จะไปเพิ่มเครื่องก็มีแต่แก้ปัญหาปลายเหตุ และก็ต้องทำแบบนี้ไปเรื่อยๆ แต่ทำแบบนี้ไม่ได้นานหรอก เดี๋ยวถึงจุดนึงมันก็จะน๊อคไปเอง
เรื่องนี้พี่แกพูดไว้จะปีกว่าแล้ว แต่ไม่ค่อยมีใครสนใจ ยิ่งมาเห็นข่าวนี้ยิ่งทำให้ชัดแจ่มขึ้น แค่คนรอบตัวตอนนี้ยังไม่รู้ตัว คิดแล้วก็หนาว :(
startup ใหญ่ ๆ
notnoyyyyy Tue, 12/01/2016 - 09:42
In reply to ใช้ Ruby เหมือนกันครับ ( by nutchapon
startup ใหญ่ ๆ ระดับโลกก็เปลี่ยนจาก RoR ไปใช้ภาษาอื่น ๆ เยอะเหมือนกันครับ ผมว่ามันเหมาะกับโปรเจคสำหรับเริ่มต้นถึงกลางมากกว่า มันพัฒนาได้ไวมาก ไม่ต่างไรกับ django เลย ไวข้ามโลก แต่golang นี่เหมือนจะเลือกหยิบอะไรต่อมิอะไรให้เหมาะต่อการทำงานได้ดีมาก เฉียด c++ ในเรื่อง perfermance แต่ชนะในเรื่อง fun and beautyful
หึ
lancaster Sat, 13/06/2015 - 13:29
หึ
ดีกว่า java ทุกอย่างยกเว้น
notnoyyyyy Tue, 12/01/2016 - 09:38
ดีกว่า java ทุกอย่างยกเว้น community and library ครับ ความเร็ว default ชนะ ความ fun ชนะ beauty ชนะ . ผมย้ายมาฝั่งนี้แล้วแหละ คนเล่นน้อย ไว้เผื่อจะได้เป็นคนแก่ของ golang thailand บ้าง