บทความ

ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่

มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 6)

มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 6)

หลังจากที่ได้ทำความรู้จักกับอีกหนึ่ง Feature ใน MQTT — LWT หรือ Last Will Testment กันไปแล้วนะคะ จะเห็นว่า LWT สามารถเข้ามาช่วยเราจัดการกับการปัญหาการเชื่อมต่อขาดๆหายๆได้อย่างไร แล้วถ้าเอามาจับคู่กับ Retained Message ก็จะยิ่งช่วยเพิ่มประสิทธิภาพให้กับ MQTT ขึ้นมาอีกเยอะเลยค่ะ 

และในบทความที่แล้วเราก็ยังค้างกันอยู่ที่ Keep Alive ค่ะ ว่าคืออะไร เกี่ยวข้องกับ LWT Message ยังไง วันนี้มาทำความรู้จักกันค่ะ


MQTT Keep Alive เป็นอีก Feature นึง ของ MQTT ค่ะ ซึ่งมีบทบาทสำคัญเลยสำหรับ Mobile Network ค่ะ

อย่างที่ทราบนะคะว่า MQTT ใช้การเชื่อมแต่แบบ TCP/IP ซึ่งมีความน่าเชื่อถือสูง มีการการันตีว่าการส่งข้อมูลจะถึงมือผู้รับแน่นอน ไม่มีผิดเพี้ยน

แต่…..

ในระหว่างการเชื่อมต่อนี้(ระหว่าง Broker และ Client) อาจจะมีฝ่ายใดฝ่ายนึงเกิดหลุด sync กันไปค่ะ (out of synchronization) อย่างเช่น ถ้าเกิดฝ่ายใดฝ่ายนึงเกิด crash ขึ้นมา ไม่สามารถทำงานได้ตามปกติค่ะ โดยที่อีกฝ่ายไม่สามารถรับรู้ได้เลยว่า อีกฝั่งนึงนั้นได้ตายไปแล้ว ก็จะยังคงส่งข้อความไปให้เรื่อยๆ และรอรับ ACK Message ซึ่งสภาวะแบบนี้ใน TCP จะเรียกว่า half-open connection ค่ะ ซึ่งถือว่าเป็นปัญหาสำคัญเลยคะ

ดังนั้น MQTT จึงได้นำ Keep Alive เข้ามาช่วยแก้ปัญหา half-open connection ตรงนี้ค่ะ หรืออย่างน้อยก็สามารถบอกได้ว่าเกิดภาวะ half-open connection ขึ้น Keep Alive จะช่วยเชคและการันตีว่าการเชื่อมต่อระหว่าง Broker และ Client นั้นยังเปิดอยู่


Client จะเป็นคนกำหนด ค่า Keep Alive ซึ่งจะกำหนดไว้ในช่วงเริ่มแรกที่ทำการขอเชื่อมต่อกับ Broker ค่านี้มีหน่วยเป็นวินาทีค่ะ (สามารถตั้งค่าได้มากสุด 18 ชั่วโม 12 นาที 15 วินาที หรือ 65535 วินาที ค่ะ) ซึ่งการที่ Client เป็นคนกำหนด Keep Alive เองจะช่วยให้ Client สามารถปรับค่า Keep Alive ให้ตรงกับความแรงของสัญญาณเนทเวิคของตัวเองได้

หลังจากทำการเชื่อมต่อ ในระหว่างนี้หาก Client ไม่ทำการส่ง Control Message ใดๆ เช่น PUBLISH, PINGREQ, หรือ DISCONNECT ให้กับ Broker ​ไม่เกินระยะเวลาที่กำหนดใน Keep Alive ตัว Broker จะยังไม่ถือว่า Client ได้ตัดขาดการเชื่อมต่อไป ยังถือว่าการเชื่อมต่อกับ Client นี้ยังเปิดอยู่ แต่ Client จะต้องส่ง PINGREQ ไปให้ Broker นะค่ะ (ไม่ใช่หายไปเลยนะ) ซึ่ง Client จะส่ง PINGREQ เมื่อไหร่ก็ได้ค่ะ ซึ่ง Broker เองก็ต้องตอบกลับด้วย PINGRESP นะคะ เพื่อที่จะให้ Client มั่นใจว่า ​Broker เองก็อยังอยู่ดีค่ะ ยังมีการเชื่อมต่อกับ Client อยู่

แต่สำหรับ Broker หากว่าไม่มี Message หรือว่า PINGREQ จาก Client ส่งมาภายใน 1.5 * Keep Alive Period แล้วละก็ Broker จะทำการ Disconnect ไปเลยค่ะ และจะส่ง LWT Message ให้ค่ะ(ถ้า Client ได้กำหนด LWT ไว้นะคะ)


โดยปกติแล้วใน MQTT ถ้า Broker เจอว่ามี half-open connection ค้างอยู่ Broker จะจัดการด้วยสิ่งที่เรียกว่า Client Take-over ค่ะ นั่นคือ Broker จะทำการ Disconnect การเชื่อมต่อก่อนหน้านี้กับ Cleint ตัวนี้ หลังจากนั้นก็จะทำการเชื่อมต่อให้ Client ตัวนี้ใหม่ค่ะ เพื่อให้มั่นใจว่าปัญหา half-open connection นี้จะไม่เป็นอุปสรรคต่อ Client ที่ถูก Disconnect ไป แล้วต้องการอยากจะกลับมา Connect ใหม่ค่ะ


อ้างอิงจาก MQTT Essentials Part 10: Keep Alive and Client Take-Over

Laris | IoT

02/05/2019