>데이터 베이스 >Redis >Redis 분산 잠금을 기반으로 작업 스케줄링을 구현하는 방법

Redis 분산 잠금을 기반으로 작업 스케줄링을 구현하는 방법

WBOY
WBOY앞으로
2023-05-28 13:37:30690검색

분산된 대규모 데이터 수집 과정에서는 정보 소스 관리가 특히 중요합니다. 동일한 작업이 동시에 하나의 수집기에서만 처리될 수 있도록 하려면 작업 예약의 고유성이 보장되어야 합니다. 일반적으로 분산 데이터 수집을 수행할 때는 일반적으로 수집 작업을 배포하고 작업의 고유성을 보장하는 일을 담당하는 일정 관리 모듈이 있습니다.

분산되어 여러 서버(다중 시스템)가 포함되므로 각 서버에는 여러 수집기(다중 프로세스)가 포함되고 각 수집기는 여러 스레드가 포함될 수 있으므로 작업 예약 모듈 잠금 메커니즘이 특히 중요합니다. 애플리케이션의 구현 아키텍처에 따라 잠금 구현 방법은 일반적으로 다음 유형으로 나눌 수 있습니다.

  • 핸들러가 단일 프로세스 및 다중 스레드인 경우 Python에서는 스레딩 모듈의 Lock 개체를 사용할 수 있습니다. 공유를 제한하기 위해 변수에 대한 동기식 액세스를 통해 스레드 안전성을 달성합니다.

  • 단일 머신과 다중 프로세스의 경우 Python에서는 다중 처리의 Lock 개체를 사용하여 처리할 수 있습니다.

  • 다중 머신 및 다중 프로세스 배포의 경우 분산 동기화 잠금을 구현하려면 타사 구성 요소(스토리지 잠금 개체)를 사용해야 합니다.

스케줄링 모듈은 다중 시스템, 다중 프로세스 및 다중 스레드 처리 메커니즘이므로 세 번째 방법과 일치합니다.

분산 잠금 구현 방법

현재 주류 분산 잠금 구현 방법은 다음과 같습니다.

  • mysql 등 데이터베이스 기반

  • redis 등 캐시 기반

  • 구현 기반 on Zookeeper

각 구현 방법에는 고유한 장점이 있으므로 종합적으로 고려한 결과 Redis가 가장 적합한 선택입니다. 주된 이유는 다음과 같습니다.

  • redis는 메모리를 기반으로 작동하며 액세스 속도가 데이터베이스보다 빠릅니다. 높은 동시성에서는 잠금 후 성능이 크게 떨어지지 않습니다.

  • redis는 생존 시간을 설정할 수 있습니다. (TTL)

  • redis는 사용이 간편하고 전체 구현 오버헤드가 낮습니다

그러나 Redis를 사용하여 구현된 분산 잠금은 다음 조건도 충족해야 합니다.

  1. 만 가능합니다. 스레드는 잠금을 점유하고 다른 스레드는 잠금이 해제될 때까지 기다려야 합니다

  2. 잠금 작업은 원자성을 충족해야 합니다

  3. 예를 들어, 잠금을 획득한 스레드는 교착 상태가 발생하지 않습니다. 잠금을 해제하기 전에 잠금이 갑자기 비정상적으로 종료되어 다른 스레드가 잠금이 해제될 때까지 계속 루프에서 대기하게 됩니다

  4. 잠금 추가 및 해제는 동일한 스레드에서 설정해야 합니다

우리는 데이터의 일관성을 보장하기 위해 Redis를 사용하여 분산 동기화 잠금을 구현합니다. 다음 요구 사항 기능:

  • 상호 배타성을 충족하며 동시에 하나의 스레드만 잠금을 획득할 수 있습니다

  • Redis는 교착 상태가 발생하지 않도록 보장하지만 잠금 만료도 발생시킵니다. 여러 스레드가 동시에 잠금을 점유하는 문제를 방지하려면 잠금 만료 시간을 합리적으로 설정해야 합니다.

  • 잠금의 고유성을 사용하세요. 실수로 잠금이 삭제되는 일이 없도록


실제로 하고 있습니다. 그 과정에서 스케줄링 모듈을 전체 수집 시스템에서 분리하고 Java 클라이언트 Jredis(JRedis는 고급 클라이언트)를 기반으로 했습니다. Redis 분산 해시 키-값 데이터베이스에 연결하는 데 사용되는 성능 Java 클라이언트입니다. Spring Boot를 사용하여 동기 및 비동기 기능을 구현하므로 다른 수집기가 HTTP를 통해 처리할 수집 작업을 요청할 수 있습니다.

  • 수집자는 HTTP를 통해 디스패치 센터에 작업 요청을 보냅니다.

  • 디스패치 센터는 잠금이 있는지 확인하고, 잠금이 있으면 바로 빈 세트를 반환합니다. 잠금이 존재하지 않으면 요청을 잠근 다음 소스 규칙에 따라 해당 수집 작업을 획득합니다.

  • Return 작업을 가져온 다음(보류 중인 작업이 없으면 비어 있음 반환) 잠금을 삭제합니다. scheding 스케줄링 모듈의 코드 구현은 대략적으로 다음과 같습니다. ;Object> result = new ArrayList();

      try {
  •   String dicNameLock = "Dispatcher_Task_Lock";//작업 예약 잠김 , lockKeyValue ,

  •                DateUtil.getYMDHMS());ㅋㅋㅋ                                 // 작업 논리 처리

     

                                                                          ....


                                                            ; Else {// Lock이 이미 존재함

    System.out.println ("작업을 처리하는 중, 일시적으로 빈 컬렉션으로 돌아갑니다 ...")

    죄송합니다. 다시 작성해야 하고 수행할 수 없는 원래 단어를 제공하지 않았습니다. Rewrite

    } catch (

    Exception e) {e.printStackTrace();

    }

    return result;

    }

    실제 작업 과정에서 잠금을 추가할 때 잠금에

    만료 시간

    을 추가해야 합니다. 그렇지 않으면 알 수 없는 예외가 발생하면 잠금이 해제되지 않고 수집기가 수집 작업을 얻을 수 없게 됩니다.

    위 내용은 Redis 분산 잠금을 기반으로 작업 스케줄링을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제