Categories
Dev

มาทำ Message Queue ง่ายๆด้วย RabbitMQ กันเถอะ

rabbitmq

ตอนฝึกงานอยู่มีโอกาสได้ใช้ Message Queue เยอะเหมือนกันแต่มันเป็น internal lib ที่เค้าเขัยนไว้ ทีนี้มีงานๆนึงที่รับมาแล้วมันต้องใช้ Message Queue ด้วยเพื่อความไวในการทำงาน เลยลองไปศึกษาดูว่าจะทำ Message Queue ยังไงดีนะ สรุปเลยเลือกใช้ RabbitMQ เรามาเริ่มกันเลยดีกว่า

Setup

ผมเป็นติ่ง docker ดังนั้นเราจะใช้ docker รัน RabbitMQ กันเพราะขี้เกียจลงนู่นนี่ลำบาก

เริ่มด้วยคำสั่ง

docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management

แอบติด management มาด้วยเพราะมันมี web-ui ดูได้สะดวก พอรันเสร็จก็ลองเข้าไปที่ http://localhost:8080 แล้ว login ด้วย guest:guest ก็จะได้หน้าตาแบบนี้Screen Shot 2560-01-02 at 3.44.34 PM

ถ้าได้หน้าตาอย่างในรูปด้านบนแปลว่าเราได้ RabbitMQ Server พร้อมที่จะยิงของเข้ามาแล้ว

 

** ใช้ภาษา Ruby บนเว็บ RabbitMQ เองก็มี Tutorials หลากหลายภาษาให้ดูอยู่เหมือนกัน **

Publisher

การที่เราเป็นคนส่งของเข้าไปใน Queue เนี่ยจะเรียกว่า Publisher เราทำได้โดย

 

พอเราลองรัน code ของเราเนี่ย message ของเราก็จะไปโผล่ที่ RabbitMQ Server แล้วโดยเข้าไปดูได้ที่ http://localhost:8080/#/queues (ในรูปที่ขึ้น 2 เพราะผมรัน code ไป 2 รอบนะครับ)

Message เข้า Queue แล้ว
Message เข้า Queue แล้ว

 

พอ Message เข้า Queue ไปแล้วเนี่ยก็ถึงขั้นตอนเอา Message Queue ออกมาใช้ล่ะ

Receiver

ตัวอย่างโค้ดตามนี้เลย

 

จะเห็นว่าแค่เขียนส่งเข้ากับเอา Message ออกมาเนี่ยง่ายแสนง่าย แต่ถ้าจะทำ Message Queue จริงๆยังขาดเรื่อง Priority, Reschedule On Fail, ฯลฯ เยอะแยะมากมาย เอาไว้เดี๋ยวมาต่อโพสต์หน้าครับ

Categories
Dev

มาทำ Message Queue ง่ายๆด้วย RabbitMQ กันเถอะ

rabbitmq

ตอนฝึกงานอยู่มีโอกาสได้ใช้ Message Queue เยอะเหมือนกันแต่มันเป็น internal lib ที่เค้าเขัยนไว้ ทีนี้มีงานๆนึงที่รับมาแล้วมันต้องใช้ Message Queue ด้วยเพื่อความไวในการทำงาน เลยลองไปศึกษาดูว่าจะทำ Message Queue ยังไงดีนะ สรุปเลยเลือกใช้ RabbitMQ เรามาเริ่มกันเลยดีกว่า

Setup

ผมเป็นติ่ง docker ดังนั้นเราจะใช้ docker รัน RabbitMQ กันเพราะขี้เกียจลงนู่นนี่ลำบาก

เริ่มด้วยคำสั่ง

docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management

แอบติด management มาด้วยเพราะมันมี web-ui ดูได้สะดวก พอรันเสร็จก็ลองเข้าไปที่ http://localhost:8080 แล้ว login ด้วย guest:guest ก็จะได้หน้าตาแบบนี้Screen Shot 2560-01-02 at 3.44.34 PM

ถ้าได้หน้าตาอย่างในรูปด้านบนแปลว่าเราได้ RabbitMQ Server พร้อมที่จะยิงของเข้ามาแล้ว

 

** ใช้ภาษา Ruby บนเว็บ RabbitMQ เองก็มี Tutorials หลากหลายภาษาให้ดูอยู่เหมือนกัน **

Publisher

การที่เราเป็นคนส่งของเข้าไปใน Queue เนี่ยจะเรียกว่า Publisher เราทำได้โดย

 

พอเราลองรัน code ของเราเนี่ย message ของเราก็จะไปโผล่ที่ RabbitMQ Server แล้วโดยเข้าไปดูได้ที่ http://localhost:8080/#/queues (ในรูปที่ขึ้น 2 เพราะผมรัน code ไป 2 รอบนะครับ)

Message เข้า Queue แล้ว
Message เข้า Queue แล้ว

 

พอ Message เข้า Queue ไปแล้วเนี่ยก็ถึงขั้นตอนเอา Message Queue ออกมาใช้ล่ะ

Receiver

ตัวอย่างโค้ดตามนี้เลย

 

จะเห็นว่าแค่เขียนส่งเข้ากับเอา Message ออกมาเนี่ยง่ายแสนง่าย แต่ถ้าจะทำ Message Queue จริงๆยังขาดเรื่อง Priority, Reschedule On Fail, ฯลฯ เยอะแยะมากมาย เอาไว้เดี๋ยวมาต่อโพสต์หน้าครับ

Categories
Dev Life

บันทึกฝึกงานครึ่งแรกที่ Proteus

ฝึกงานที่ Proteus มาได้ครึ่งทางพอดี (4 อาทิตย์) เลยอยากเขียนบันทึกไว้สักหน่อยว่าไปทำอะไรบ้าง

วันแรกที่ไปถึงก็เลือกว่าอยากทำอะไร ซึ่งส่วนนี้ผมอยากทำ Backend เลยได้อยู่ทีมเดียวกับพี่แมน ITE#13 หลังจากนั้นก็ไปตามหาคอมพิวเตอร์ที่ตัวเองจะใช้ คือไปเลือกคอมที่ว่างๆอยู่ใน บ. แล้วเอามาลงนู่นนี่นั่นเอาเองตามใจชอบ แล้วเพราะว่ามีพื้นฐาน Django มาบ้างแล้ว เลยไม่ต้องทำ tutorial กว่าจะจัดการเครื่อง + set up project ต่างๆก็หมดเวลาไป 1 วันเต็มๆ

เนื่องจากที่นี่ทำงานกันแบบ Agile + Sprint จึงมีการแบ่งงานที่ต้องทำออกเป็นการ์ดใบย่อยๆ คนในทีมก็จะหยิบการ์ดมาทำได้ตามใจชอบ ช่วงแรกๆหยิบการ์ดมาก็ยังไม่สามารถทำงานให้เสร็จด้วยตัวเองได้ต้องไปแพร์กับคนอื่นก่อน เพราะงานที่นี่แตกเป็น service ย่อยๆหลายสิบ service แล้วคุยกันแบบ fully asynchronous โค้ดทั้งหมดจึงซับซ้อนมากๆถ้าแกะด้วยตัวเองจะเสียเวลามาก

อาทิตย์ที่ 1-2

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

อาทิตย์ที่ 3

การ์ด Backend หมดเหลือแต่การ์ด DevOps เลยได้ทำบ้างนิดๆหน่อยๆ เป็นพวกเขียนสคริป Deployment, Docker, EC2 อาทิตย์ อาทิตย์นี้ที่บริษัทจัด Outing พอดี ซึ่งรู้มาว่าเป็นฝึกงานรุ่นที่โชคดีมากได้ไป Outing กับบริษัทเป็นปีแรก เพราะปีก่อนๆไม่ได้จัดช่วงนี้ เลยได้ไปเที่ยวพักผ่อนที่ปราณบุรี 3 วัน 2 คืน

13528913_10154916242522802_7763561130994783674_n

13483106_10204700966724094_8257724876958134766_o

อาทิตย์ที่ 4

Product Owner list งานมาให้ทีมเยอะมาก เราจึงเริ่มอาทิตย์ด้วย Sprint Planning คือการประเมินเวลาที่จะใช้ทำข้อต่างๆและเขียนเป็นการ์ดไว้ใน Backlog โดยงานที่จะมีต่อจากนี้รู้สึกได้ว่าจะมีแต่งาน Frontend แน่ๆจากการ์ดที่เขียนมา ซึ่งแน่นอนเราไม่มีความถนัดด้านนี้เลย อาทิตย์นี้เลยใช้เวลาส่วนใหญ่ไปกับการศึกษา Angular และวิธีการเขียนเทส frontend แล้วก็ทำการ์ดไป 1 ใบ แต่ที่ดีที่สุดอาทิตย์นี้คือพี่แอมป์เปิด Session Angular 101 จากที่รู้สึกเหมือนเส้นทางมืดมนหลังจากเข้าแล้วเหมือนเห็นแสงสว่างขึ้นมาบ้าง ก็หวังว่าอาทิตย์ต่อๆไปจะทำการ์ด Frontend ได้ดีขึ้นเรื่อยๆ

สอนดีกว่าที่เรียนมาในมหาลัยทุกวิชารวมกัน
สอนดีกว่าที่เรียนมาในมหาลัยทุกวิชารวมกัน

เรื่องงานหมดแล้วมาต่อเรื่องการใช้ชีวิตบ้าง

เนื่องจากที่ Proteus เรามีเวลาทำงานอยู่ที่ 13.00-23.00 4 วัน จันทร์พฤหัส หรือแล้วแต่ตกลงกันในแต่ละทีม จึงไม่มีปัญหาเรื่องการเดินทางในช่วงเวลาเร่งด่วน สบายๆไม่ต้องตื่นเช้า ไม่ต้องเจอคนเบียดแน่นๆ ไม่มีความเครียดจากการเดินทาง เรื่องอาหารการกินเราก็ซื้อกันแถวออฟฟิศแล้วเอาเข้ามานั่งกินด้วยกันที่ออฟฟิศ ซึ่งถ้าจัดการดีๆหน่อยเงิน 90 บาท หรือ สามารถมีชีวิตอยู่ในเอกมัยได้ 2 มื้อแบบไม่อดอยากเลย เพราะมีน้ำต่างๆที่ออฟฟิศฟรี จริงๆใช้น้อยกว่านี้ก็ได้ถ้าสามารถทนกินข้าวไข่เจียวได้ทุกวัน

ทีมที่ผมอยู่ เรา Team Building กันบ่อยมากด้วยการ กินเบียร์ (แทบจะทุกวัน) กินเนื้อย่าง ถ้าใครง่วงนอนก็มีโซฟาไว้ให้นอนพักได้ (เคยนอนพักเป็นชั่วโมงอยู่ 2 รอบ)

สร้างการ์ด -> กินเนื้อย่าง -> กินเบียร์
สร้างการ์ด -> กินเนื้อย่าง -> กินเบียร์

ถ้าถามว่า 4 อาทิตย์ที่ผ่านมาได้ครบทุกอย่างตามที่ต้องการหรือยัง สามารถบอกได้เลยว่าได้ครบแล้ว Backend, Frontend, Unit Test, การทำงานเป็นทีม ใน 4 อาทิตย์ข้างหน้าต่อจากนี้ก็หวังว่า เราจะเก่งขึ้นจากการได้ทำโปรเจคยากและสมาชิกในทีมและในบริษัทที่เก่งมากๆที่นึงเลย 🙂

ปล.1 อีก 4 อาทิตย์เดี๋ยวมาเขียนตอน 2

ปล2. เจอรุ่นพี่ ITE #2 เยอะมาก

Categories
Dev

Disable CSRF Token on specific Routes Laravel

CSRF is enable by default on all Routes in Laravel 5. Sometime you want don’t want to use a CSRF. You can disable it by a specific routes. Edit /app/Http/Middleware/VerifyCsrfToken.php like this

Categories
Dev

Disable CSRF Token on specific Routes Laravel

CSRF is enable by default on all Routes in Laravel 5. Sometime you want don’t want to use a CSRF. You can disable it by a specific routes. Edit /app/Http/Middleware/VerifyCsrfToken.php like this

Categories
Dev

สร้าง Rake routes ให้ Grape ใน Rails

ช่วงนี้ต้องใช้ Grape ใน Rails เพื่อเขียน API ตัวนึงทีนี้ถ้าคนใช้ Rails อยู่จะรู้ว่า

ถ้าเราสั่ง

rake routes

จะได้ List ของ Route ทั้งหมดใน application ของเรา

ผมก็เลยไปค้นๆดูว่าถ้าเราจะทำแบบนี้ใน Grape ต้องทำยังไงบ้างเลยได้ความว่า

ให้ไปสร้างไฟล์ /lib/tasks/grape.rake ตามนี้

Categories
Dev

สร้าง Rake routes ให้ Grape ใน Rails

ช่วงนี้ต้องใช้ Grape ใน Rails เพื่อเขียน API ตัวนึงทีนี้ถ้าคนใช้ Rails อยู่จะรู้ว่า

ถ้าเราสั่ง

rake routes

จะได้ List ของ Route ทั้งหมดใน application ของเรา

ผมก็เลยไปค้นๆดูว่าถ้าเราจะทำแบบนี้ใน Grape ต้องทำยังไงบ้างเลยได้ความว่า

ให้ไปสร้างไฟล์ /lib/tasks/grape.rake ตามนี้

Categories
Dev

ปัญหา No ‘Access-Control-Allow-Origin’ บน Laravel

พอดีต้องเขียน Angular ให้มันไป fetch json มาจาก Laravel นั่งแก้ปัญหาอยู่นานจนเปิด console แล้วมันแจ้งว่า No ‘Access-Control-Allow-Origin’ เลยไปค้นๆดูพบว่าต้องสั่งให้ Laravel มัน Allow Access Control jsonp ก่อนวิธีทำก็ไปแก้ไฟล์ app/filter.php ในส่วนของApp::before ตามนี้เลยครับ

Categories
Dev

ปัญหา No ‘Access-Control-Allow-Origin’ บน Laravel

พอดีต้องเขียน Angular ให้มันไป fetch json มาจาก Laravel นั่งแก้ปัญหาอยู่นานจนเปิด console แล้วมันแจ้งว่า No ‘Access-Control-Allow-Origin’ เลยไปค้นๆดูพบว่าต้องสั่งให้ Laravel มัน Allow Access Control jsonp ก่อนวิธีทำก็ไปแก้ไฟล์ app/filter.php ในส่วนของApp::before ตามนี้เลยครับ

Categories
Dev

Keybindings in zsh is not working (ctrl-a, ctrl-e)

I have problem with keybindings after install Prezto(zsh). When i use ctrl+a i got “^A” instead of beginning of the line

Solution: add “bindkey -e” to .zshrc file