ในขอบเขตของระบบที่มีความพร้อมใช้งานสูง การตรวจสอบให้แน่ใจว่างานสำคัญบางอย่างได้รับการดำเนินการด้วยการซิงโครไนซ์ที่เหมาะสมและไม่มีสภาวะการแข่งขันถือเป็นสิ่งสำคัญสูงสุด นี่คือจุดที่ Shed Lock เข้ามามีบทบาท ในฐานะซัพพลายเออร์ Shed Lock ฉันมาที่นี่เพื่อแนะนำคุณตลอดขั้นตอนการกำหนดค่า Shed Lock สำหรับสภาพแวดล้อมที่มีความพร้อมใช้งานสูง
ทำความเข้าใจกับ Shed Lock
Shed Lock เป็นไลบรารีที่ให้การล็อกแบบกระจายสำหรับงานตามกำหนดเวลาในแอปพลิเคชัน Java ในระบบที่มีความพร้อมใช้งานสูง แอปพลิเคชันหลายอินสแตนซ์อาจพยายามดำเนินงานตามกำหนดเวลาเดียวกันพร้อมกัน ซึ่งอาจนำไปสู่ปัญหาความสมบูรณ์ของข้อมูล การประมวลผลซ้ำ และปัญหาอื่นๆ Shed Lock แก้ปัญหานี้โดยใช้ที่เก็บข้อมูลที่ใช้ร่วมกัน (เช่น ฐานข้อมูล) เพื่อจัดการการล็อค สามารถรับการล็อคได้ครั้งละหนึ่งอินสแตนซ์เท่านั้น ทำให้มั่นใจได้ว่างานจะถูกดำเนินการเพียงครั้งเดียว
ข้อกำหนดเบื้องต้น
ก่อนที่เราจะเริ่มกำหนดค่า Shed Lock ตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้:
- แอปพลิเคชัน Java ที่ทำงานบนโครงสร้างพื้นฐานที่มีความพร้อมใช้งานสูง นี่อาจเป็นชุดของเซิร์ฟเวอร์ในคลัสเตอร์ที่ใช้งานในสภาพแวดล้อมคลาวด์ เช่น AWS หรือ Google Cloud
- ฐานข้อมูลที่สามารถใช้เป็นที่เก็บข้อมูลที่ใช้ร่วมกันสำหรับล็อค ตัวเลือกยอดนิยม ได้แก่ MySQL, PostgreSQL และ H2
- Maven หรือ Gradle กำหนดค่าให้จัดการการขึ้นต่อกัน
ขั้นตอนที่ 1: เพิ่มการพึ่งพา
ขั้นตอนแรกคือการเพิ่มการขึ้นต่อกันของ Shed Lock ให้กับโปรเจ็กต์ของคุณ หากคุณใช้ Maven ให้เพิ่มสิ่งต่อไปนี้ในของคุณpom.xml-
<การพึ่งพา> <groupId>net.javaccrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.42.0</version> </dependency> <การพึ่งพา> <groupId>net.javaccrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.42.0</version> </การพึ่งพา>
สำหรับ Gradle ให้เพิ่มบรรทัดเหล่านี้ในของคุณbuild.gradle-
การใช้งาน 'net.javaccrumbs.shedlock:shedlock-spring:4.42.0' การใช้งาน 'net.javaccrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'
ขั้นตอนที่ 2: กำหนดค่าผู้ให้บริการล็อค
ผู้ให้บริการล็อคมีหน้าที่รับผิดชอบในการโต้ตอบกับที่เก็บข้อมูลที่ใช้ร่วมกัน (ฐานข้อมูลในกรณีของเรา) เพื่อจัดการล็อค นี่คือตัวอย่างวิธีกำหนดค่าผู้ให้บริการล็อคโดยใช้ Spring'sJdbcเทมเพลต-
นำเข้า net.javaccrumbs.shedlock.core.LockProvider; นำเข้า net.javaccrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; นำเข้า org.springframework.context.annotation.Bean; นำเข้า org.springframework.context.annotation.Configuration; นำเข้า org.springframework.jdbc.core.JdbcTemplate; นำเข้า javax.sql.DataSource; @Configuration คลาสสาธารณะ ShedLockConfig { @Bean public LockProvider lockProvider (DataSource dataSource) { ส่งคืน JdbcTemplateLockProvider ใหม่ ( JdbcTemplateLockProvider.Configuration.builder () .withJdbcTemplate (ใหม่ JdbcTemplate (dataSource)) .usingDbTime () .build () ); -
ในตัวอย่างนี้ เราสร้าง aJdbcTemplateLockProviderถั่วที่ใช้สิ่งที่ให้มาแหล่งข้อมูลเพื่อโต้ตอบกับฐานข้อมูล ที่โดยใช้DbTime()วิธีการระบุว่าเราต้องการใช้เวลาระบบของฐานข้อมูลเพื่อการจัดการล็อค
ขั้นตอนที่ 3: กำหนดค่า Shed Lock ใน Spring
ต่อไปเราต้องเปิดใช้งาน Shed Lock ในแอปพลิเคชัน Spring ของเรา เราสามารถทำได้โดยการเพิ่ม@EnableSchedulerLockคำอธิบายประกอบสำหรับคลาสการกำหนดค่าหลักของเรา:
นำเข้า net.javaccrumbs.shedlock.spring.annotation.EnableSchedulerLock; นำเข้า org.springframework.context.annotation.Configuration; นำเข้า org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") AppConfig คลาสสาธารณะ { // รหัสการกำหนดค่าที่นี่ }
ที่@เปิดใช้งานการจัดกำหนดการคำอธิบายประกอบเปิดใช้งานความสามารถในการกำหนดเวลาของ Spring และ@EnableSchedulerLockเปิดใช้งาน Shed Lock ที่ค่าเริ่มต้นLockAtMostForคุณลักษณะระบุเวลาสูงสุดที่สามารถล็อคได้ ในกรณีนี้ ระบบจะปลดล็อคโดยอัตโนมัติหลังจากผ่านไป 30 วินาที
ขั้นตอนที่ 4: ใช้การล็อคกับงานที่กำหนดเวลาไว้
ตอนนี้เราสามารถใช้การล็อกกับงานที่กำหนดเวลาไว้ได้ นี่คือตัวอย่าง:
นำเข้า net.javaccrumbs.shedlock.spring.annotation.SchedulerLock; นำเข้า org.springframework.scheduling.annotation.Scheduled; นำเข้า org.springframework.stereotype.Service; @Service คลาสสาธารณะ ScheduledTaskService { @Scheduled(fixedRate = 60000) @SchedulerLock(name = "myScheduledTask", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M") โมฆะสาธารณะ myScheduledTask() { // ตรรกะของงานที่นี่ System.out.println ("กำลังดำเนินการงานที่กำหนดเวลาไว้..."); -
ที่@SchedulerLockคำอธิบายประกอบจะใช้เพื่อใช้การล็อคกับMyScheduledTaskวิธี. ที่ชื่อคุณลักษณะเป็นตัวระบุเฉพาะสำหรับการล็อค ที่ล็อคAtMostForคุณลักษณะระบุเวลาสูงสุดที่สามารถล็อคได้และล็อคอย่างน้อยที่สุดสำหรับระบุเวลาขั้นต่ำที่จะล็อค
ขั้นตอนที่ 5: การตั้งค่าฐานข้อมูล
เราจำเป็นต้องสร้างตารางในฐานข้อมูลเพื่อเก็บข้อมูลการล็อค สำหรับฐานข้อมูล MySQL คำสั่ง SQL ในการสร้างตารางจะเป็นดังนี้:
สร้างตาราง shedlock (ชื่อ VARCHAR (64) ไม่เป็นโมฆะ, lock_until TIMESTAMP (3) ไม่เป็นโมฆะ, lock_at TIMESTAMP (3) ไม่เป็นโมฆะ, lock_by VARCHAR (255) ไม่เป็นโมฆะ, คีย์หลัก (ชื่อ) );
สำหรับฐานข้อมูลอื่นๆ เช่น PostgreSQL คำสั่ง SQL จะคล้ายกัน แต่อาจจำเป็นต้องปรับเปลี่ยนประเภทข้อมูลตามข้อกำหนดของฐานข้อมูล
ข้อควรพิจารณาเพิ่มเติมสำหรับความพร้อมใช้งานสูง
ในระบบที่มีความพร้อมใช้งานสูง เราต้องพิจารณาปัจจัยเพิ่มเติมบางประการ:
- การจำลองฐานข้อมูล: หากคุณใช้ฐานข้อมูลที่ถูกจำลองแบบ ตรวจสอบให้แน่ใจว่าตารางล็อคถูกจำลองแบบอย่างถูกต้อง ความล่าช้าในการจำลองแบบอาจทำให้หลายอินสแตนซ์ได้รับการล็อคพร้อมกัน
- เวลาแฝงของเครือข่าย: เวลาแฝงของเครือข่ายสูงระหว่างอินสแตนซ์ของแอปพลิเคชันและฐานข้อมูลอาจส่งผลต่อการรับและปลดล็อกการล็อค พิจารณาใช้ฐานข้อมูลที่อยู่ใกล้กับเซิร์ฟเวอร์แอปพลิเคชันของคุณ
- การกู้คืนความล้มเหลว: ใช้กลไกการกู้คืนความล้มเหลวที่เหมาะสม หากอินสแตนซ์ล้มเหลวในขณะที่ล็อคไว้ ควรปลดล็อคโดยอัตโนมัติหลังจาก
ล็อคAtMostForเวลาผ่านไปแล้ว
ลิงค์ผลิตภัณฑ์ที่เกี่ยวข้อง
หากคุณกำลังมองหาระบบล็อคคุณภาพสูงสำหรับการใช้งานอื่นๆ คุณอาจสนใจผลิตภัณฑ์ของเรากดล็อค-ล็อคประตูไม้, และล็อคประตูกลม-
ติดต่อเราเพื่อจัดซื้อจัดจ้าง
เราเข้าใจถึงความสำคัญของโซลูชันการล็อคที่เชื่อถือได้ในระบบที่มีความพร้อมใช้งานสูง ในฐานะซัพพลายเออร์ Shed Lock เรามุ่งมั่นที่จะมอบผลิตภัณฑ์และการสนับสนุนที่ดีที่สุดแก่คุณ หากคุณสนใจที่จะจัดหา Shed Lock สำหรับโปรเจ็กต์ที่มีความพร้อมใช้งานสูงของคุณ หรือมีคำถามใดๆ เกี่ยวกับการกำหนดค่า เราขอแนะนำให้คุณติดต่อเรา เริ่มการสนทนากับเราเพื่อหารือเกี่ยวกับความต้องการเฉพาะของคุณ และสำรวจว่า Shed Lock ของเราจะเพิ่มประสิทธิภาพและความน่าเชื่อถือของระบบของคุณได้อย่างไร


อ้างอิง
- เอกสารอย่างเป็นทางการของ Shed Lock "https://www.javacrumbs.net/shedlock/"
- เอกสาร Spring Framework "https://docs.spring.io/spring-framework/docs/current/reference/html/"
