Tags:
Node Thumbnail

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

Get latest news from Blognone

Comments

By: panurat2000
ContributorSymbianUbuntuIn Love
on 12 June 2015 - 06:10 #819471
panurat2000's picture

การอัพเกรดเวอร์ชั่นใหม่ใช่เวลาลดลงจาก 30 นาทีเหลือ 3 นาที

ใช่เวลา => ใช้เวลา

By: AlninlA
ContributorAndroidUbuntu
on 12 June 2015 - 08:30 #819497 Reply to:819471
AlninlA's picture

สุดท้ายทีมงานเลือก C# และ Go เป็นสองตัวเลือกสุดท้ายเพราะรองรับ asynchronous ในตัวภาษาเอง ส่วน C# ตกไป

ตรง C# ยังงงๆ ครับ

edit: อ่อ เข้าใจแล้ว :)

By: sukjai
iPhoneAndroidRed HatUbuntu
on 12 June 2015 - 06:30 #819475

ต้องไปดูๆ GO บ้างแล้ว, แต่ c# ก็มี Mono นี่ครับที่ทำงานบน Linux หรือมาช้าไป ว่าแต่ทำไมไม่เลือก java ด้วยละงง

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 June 2015 - 06:39 #819476 Reply to:819475
UltimaWeapon's picture

Mono Regular Expression ช้ามากคับ

Java ไม่มี Syntax เฉพาะสำหรับทำ Asynchronous คับ ทำให้เขียนลำบาก

By: sukjai
iPhoneAndroidRed HatUbuntu
on 12 June 2015 - 06:47 #819477 Reply to:819476

ขอบคุณครับ

By: WattZ
AndroidRed HatSymbianWindows
on 12 June 2015 - 08:56 #819505
WattZ's picture

ทีมงานลืม Node,js ไปหรือเปล่า

By: bluezip
AndroidUbuntuWindows
on 12 June 2015 - 09:15 #819516 Reply to:819505

ผมว่า node.js ยังไม่ดีพอนะครับดูตัวอย่างภาษาที่ทีมเขาเลือกใช้ EventMachine, JRuby, C++, C#, Go

ทาง Parse หาทางออกอื่นๆ ด้วยการหาโมเดลการให้บริการแบบ asynchronous ที่แต่ละโปรเซสสามารถรองรับการเชื่อมต่อได้จำนวนมากๆ ทีมงานศึกษาศึกษาทางเลือกหลายทาง ได้แก่ EventMachine, JRuby, C++, C#, และ Go สุดท้ายทีมงานเลือก C# และ Go เป็นสองตัวเลือกสุดท้ายเพราะรองรับ asynchronous ในตัวภาษาเอง ส่วน C# ตกไปเพราะไม่สามารถทำงานกับลินุกซ์ได้ดีพอ

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 June 2015 - 09:16 #819519 Reply to:819505
UltimaWeapon's picture

ไม่ต่างอะไรกับ Java เลยคับ ไม่มี Syntax สำหรับ Asynchronous โดยเฉพาะ

By: bluezip
AndroidUbuntuWindows
on 12 June 2015 - 09:50 #819536 Reply to:819519

ผมว่า node.js ในตัวภาษาของมันเองเลยก็มี class Promise ให้หรือจะใช้การ callback ก็ได้นะครับ น่าจะพอเทียบเคียง Asynchronous ได้

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 June 2015 - 10:06 #819539 Reply to:819536
UltimaWeapon's picture

งั้นแบบนี้ต้องลองไปใช้ Go Routine ของ Go หรือ async/await ของ C# ดูคับ แล้วจะเข้าใจที่ผมบอก

By: heha
Android
on 12 June 2015 - 10:11 #819540 Reply to:819519

Node.JS นี่ Asynchronous เป็นงานหลักเลยนะครับ Library 90% ก็เป็น Asynchronous ทำงานได้รวดเร็วเช่นกันเพราะใช้ Engine V8 จาก Google เป็นจุดเด่นของ Node เลยแต่ข้อเสียของ Node คือถ้าเป็น Project ขนาดใหญ่มาก Code Maintain ยากมากครับ (ถึงจะใช้ promise ก็เถอะ) มาตรฐาน ES6 ก็ไม่ standard สักที (ผมรอมา 3 ปีแล้วมั้งจากที่เริ่มใช้)

By: bluezip
AndroidUbuntuWindows
on 12 June 2015 - 11:20 #819565 Reply to:819519

ไม่รู้ว่าผมเข้าใจถูกหรือเปล่า

synchronous = พร้อมกัน
asynchronous = ไม่พร้อมกัน

ปกติ node.js จะทำงานแบบ asynchronous คือทำงานแบบตามลำดับไปเรื่อยๆ จากบนลงล่าง แต่ด้วยความฉลาดของมันมันจะข้ามการทำงานที่ต้องรอนานๆ มันข้ามไปเลยมันไม่รอให้เสร็จก่อน การข้ามไปของมันทำมันจึงดูคล้ายๆกับการทำงานแบบ synchronous แต่อย่างที่รู้กันงานบางอย่างทำงานเรียงลำดับกัน ที่เรียกว่า asynchronous ซึ่ง node.js จะมีวิธีจัดการพวกนี้หลักๆ อยู่ 3 วิธีมีชื่อว่า
1. promise
2. callback
3. event

ยกตัวอย่างงานง่ายๆ asynchronous เอาข้อมูลเข้าดาต้าเบส งานต่อไปดูข้อมูลทั้งหมดในด้าต้าเบสรวมข้อมูลใหม่ที่เอาเข้าไปด้วย

ถ้าเป็นภาษาทั่วไปจะเขียน

  1. เอาข้อมูลเขาดาต้าเบส
  2. ดูข้อมูลทั้งหมดที่มีในดาต้าเบส

ถ้าเป็น node.js จะเขียนแบบข้างบนไม่ได้ จะไม่ได้ข้อมูลล่าสุดที่เอาเข้าไป จะต้องเขียนประมาณนี้

  1. ทำงานแรก
  2. รอ(promise callback event)
  3. ทำงานที่สองต่อ
By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 June 2015 - 11:34 #819573 Reply to:819519
UltimaWeapon's picture

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
})

By: heha
Android
on 12 June 2015 - 11:41 #819575 Reply to:819573

โทษทีครับ ผมอ่านตกไป ขออภัย

By: bluezip
AndroidUbuntuWindows
on 12 June 2015 - 11:59 #819582 Reply to:819573

เข้าใจแล้วครับแต่ node.js จริงๆก็มี function ประมาณนี้เหมือนกันนะ เพียงแต่มีน้อย

fs.mkdirSync
fs.readdirSync
fs.writeSync
fs.closeSync
fs.readSync

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 12 June 2015 - 12:02 #819585 Reply to:819582
UltimaWeapon's picture

อันนี้มัน Synchronous ไม่ใช่เหรอคับ

By: bluezip
AndroidUbuntuWindows
on 12 June 2015 - 12:40 #819587 Reply to:819582

บอกไม่ถูกแต่น่าจะเหมือนกันนะ

ปกติถ้าเขียน node.js จะเขียนประมาณนี้ใช้ไหม

fs.readFile('xxxx.txt', function(err, data){

});

แต่ถ้าใช้ fs.readFileSync() จะเขียนแบบนี้ได้

var data = fs.readFileSync('xxxx.txt');

ขอโทษครับ ผมไม่เข้าใจเรื่อง asynchronous เอง แต่ล่ะภาษาอาจใช้ไม่เหมือนกันด้วย

By: war11ck
AndroidSymbianUbuntuWindows
on 12 June 2015 - 15:29 #819684 Reply to:819587
war11ck's picture

คอนเซ็ปคล้ายกัน ต่างกันที่ตัวภาษาครับ ข้อมูลเพิ่มเติม
http://stackoverflow.com/questions/21336976/node-js-vs-async-await-in-net

By: 7elven
ContributoriPhoneWindows PhoneAndroid
on 6 September 2017 - 21:23 #1005994 Reply to:819573

ทุกวันนี้ nodejs มี async/await ใช้แล้วนะครับ

By: automaetic9@gma...
Windows PhoneAndroidRed HatUbuntu
on 30 September 2017 - 13:46 #1010666 Reply to:819519
automaetic9@gmail.com's picture

Babel สิครับ

By: lew
FounderJusci's WriterMEconomicsAndroid
on 12 June 2015 - 10:38 #819549 Reply to:819505
lew's picture

เท่าที่ใช้งานมา โค้ดมันอ่านยาก/maintain ยากมากครับ


lewcpe.com, @public_lewcpe

By: chenke on 12 June 2015 - 11:41 #819576 Reply to:819505

Node.js ทำงาน thread เดียว(ถ้าไม่ได้เขียน cluster) Go lang เป็น multi-thread หรือป่าว

By: watch99
AndroidRed HatUbuntu
on 12 June 2015 - 12:18 #819590
watch99's picture

มันต่างกันอย่างไรกับการเขียน โปรแกรมให้ทำ multithreading ครับ

By: lew
FounderJusci's WriterMEconomicsAndroid
on 12 June 2015 - 12:21 #819591 Reply to:819590
lew's picture

goroutine เบากว่าเยอะครับ ใช้แรมต่อชุดน้อยกว่า


lewcpe.com, @public_lewcpe

By: watch99
AndroidRed HatUbuntu
on 12 June 2015 - 12:31 #819598 Reply to:819591
watch99's picture

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

By: vegetable
iPhoneWindows PhoneAndroidUbuntu
on 12 June 2015 - 14:52 #819668

จริงๆ แล้ว 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

By: nutchapon
iPhone
on 13 June 2015 - 02:41 #819786

ใช้ Ruby เหมือนกันครับ ( แต่ไม่ได้เขียนซะทีเดียว ผมทำ UI )

ไม่รู้ว่าจะเกี่ยวกับหัวข้อข่าวไหม แต่เมื่อประมาณต้นๆปี เคยนั่งฟังกับพี่คนนึง พี่แกบอกว่า Ruby กำลังมาก็จริง แต่เมื่อถึงจุดนึงที่ App ใหญ่มากๆ code เยอะและฟีเจอร์บานบ้อง ruby จะไปไม่ไหว ยิ่งวาง architecture ไม่ดีก็จบกัน เพราะเหมือนจะมีปัญหาเรื่องการจัดการทรัพยากรอยู่ จะไปเพิ่มเครื่องก็มีแต่แก้ปัญหาปลายเหตุ และก็ต้องทำแบบนี้ไปเรื่อยๆ แต่ทำแบบนี้ไม่ได้นานหรอก เดี๋ยวถึงจุดนึงมันก็จะน๊อคไปเอง

เรื่องนี้พี่แกพูดไว้จะปีกว่าแล้ว แต่ไม่ค่อยมีใครสนใจ ยิ่งมาเห็นข่าวนี้ยิ่งทำให้ชัดแจ่มขึ้น แค่คนรอบตัวตอนนี้ยังไม่รู้ตัว คิดแล้วก็หนาว :(

By: notnoyyyyy
iPhoneWindows PhoneAndroidBlackberry
on 12 January 2016 - 09:42 #874495 Reply to:819786
notnoyyyyy's picture

startup ใหญ่ ๆ ระดับโลกก็เปลี่ยนจาก RoR ไปใช้ภาษาอื่น ๆ เยอะเหมือนกันครับ ผมว่ามันเหมาะกับโปรเจคสำหรับเริ่มต้นถึงกลางมากกว่า มันพัฒนาได้ไวมาก ไม่ต่างไรกับ django เลย ไวข้ามโลก แต่golang นี่เหมือนจะเลือกหยิบอะไรต่อมิอะไรให้เหมาะต่อการทำงานได้ดีมาก เฉียด c++ ในเรื่อง perfermance แต่ชนะในเรื่อง fun and beautyful

By: lancaster
ContributorUbuntuWindows
on 13 June 2015 - 13:29 #819838

หึ

By: notnoyyyyy
iPhoneWindows PhoneAndroidBlackberry
on 12 January 2016 - 09:38 #874492
notnoyyyyy's picture

ดีกว่า java ทุกอย่างยกเว้น community and library ครับ ความเร็ว default ชนะ ความ fun ชนะ beauty ชนะ . ผมย้ายมาฝั่งนี้แล้วแหละ คนเล่นน้อย ไว้เผื่อจะได้เป็นคนแก่ของ golang thailand บ้าง