โปรโตคอล Heartbeat เขียนด้วย Java ทำงานบน UDP
โปรโตคอลฮาร์ทบีทมีโครงสร้างจากการแจ้งเตือนดาตาแกรม UDP อย่างต่อเนื่องโดยมีความล่าช้า 1,000 มิลลิวินาที ฟิลด์เพย์โหลดประกอบด้วย ID ตัวระบุจากไคลเอนต์ที่สามารถประกอบด้วยสตริง เช่น ที่อยู่ MAC ของการ์ดเครือข่ายที่ใช้งานปัจจุบันโดยแหล่ง ping หรือตัวระบุ เช่น ชื่อผู้ใช้ เซิร์ฟเวอร์จะรับฟังการเรียงลำดับ Ping ต่างๆ ตามตัวระบุ และจัดการสถานะต่างๆ ที่พวกเขาจะกำหนดด้วยตนเอง เมื่อใดก็ตามที่เซิร์ฟเวอร์สังเกตเห็นว่าหลังจากความล่าช้า 3,000 มิลลิวินาทียังไม่ได้รับ Ping ใด ๆ จากไคลเอนต์จะแจ้งผ่านเหตุการณ์ที่ผู้ใช้โปรโตคอลนี้ทราบถึงการสูญเสียการเชื่อมต่อที่อาจเกิดขึ้น โดยแนะนำให้จำกัดหรือหยุดการแลกเปลี่ยนข้อมูลผ่านการเชื่อมต่ออื่น ๆ โปรโตคอลที่ต้องพึ่งพาเช่น TCP หากภายใน 5,000 มิลลิวินาที คุณจะได้รับตัวระบุนี้ ไคลเอ็นต์จะเชื่อมต่ออีกครั้ง ซึ่งหมายความว่าสามารถกู้คืนช่องทางการสื่อสารข้อมูลได้ มิฉะนั้นจะถือว่าลูกค้าออฟไลน์โดยสมบูรณ์ ทั้งหมดนี้จะได้รับแจ้งตามที่กล่าวไว้ข้างต้นผ่านฝ่ายจัดการกิจกรรมดังที่แสดงด้านล่าง:
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
โค้ดตัวอย่างด้านบนแสดงการบันทึกเหตุการณ์ต่างๆ ในสถานะของไคลเอ็นต์ จากนั้นจะเป็นหน้าที่ของผู้ฟังในการตัดสินใจว่าจะทำอย่างไรเมื่อบันทึกเหตุการณ์บางประเภทดังนี้:
public class ServerStart implements HeartbeatListener {
private static final ServerStart thisInstance = new ServerStart ();
public static void main ( String [] args ) {
HeartbeatProtocolManager heartbeatProtocolManager = new HeartbeatProtocolManager ( thisInstance );
heartbeatProtocolManager . addHost ( "Test" , 43210 ); //identifier, port
heartbeatProtocolManager . addHost ( "Test1" , 43211 );
}
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
}
เหตุการณ์ที่สร้างขึ้นนอกเหนือจากการบรรจุเพย์โหลดยังประกอบด้วยความล่าช้าที่ส่งผ่านโดยสัมพันธ์กับเหตุการณ์ก่อนหน้าด้วยตัวระบุเพย์โหลดของตัวเองและการประทับเวลาของการรับ ping ปัจจุบัน
การใช้โปรโตคอลนี้จะช่วยให้การจัดการสถานะการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์ดีขึ้น และควบคุมข้อผิดพลาดที่อาจเกิดขึ้นได้ดียิ่งขึ้น