Programming

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

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
MuvMi (Urban Mobility Tech Co.,Ltd.) company cover
MuvMi (Urban Mobility Tech Co.,Ltd.)
Shape the future of urban mobility towards affordable, clean, and safe solutions
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH company cover
LTMH
LTMH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

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

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

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

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

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

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

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

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

  1. ทำงานแรก
  2. รอ(promise callback event)
  3. ทำงานที่สองต่อ

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 จะเขียนประมาณนี้ใช้ไหม

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

});

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

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

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

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

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