찾다

 >  Q&A  >  본문

java - 分布式环境下,定时任务或异步处理如何保持幂等性?

天蓬老师天蓬老师2802일 전801

모든 응답(9)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-18 09:28:19

    발기부전이란 일반적으로 해당 방법이 사업상태를 바꾸지 않는다는 의미이므로 반복 호출의 효과가 단일 호출의 효과와 동일함을 보장할 수 있습니다.

    귀하의 설명을 보면 예약된 작업 비동기 처리로 인해 비즈니스 상태(예: 데이터 삽입)가 변경될 가능성이 높습니다. power 잠깐만요. 이런 경우에는 기본적으로 해결책이 없습니다.

    질문의 실제 아이디어는 다음과 같습니다. 분산 환경에서 예약된 작업 및 비동기 처리에 대해 반복 요청을 보낼 때 실제 비즈니스 로직이 실행되도록 하는 방법 한번?

    그렇다면 중앙 집중식 저장소(예: redis)를 사용하여 호출자 요청 기록을 저장할 수 있습니다. 요청을 받은 후 서버는 원자 쿼리 및 저장 작업(예: redis의

    setnx 명령)을 사용합니다. , 하나의 요청만 성공적으로 저장되도록 하면 실제 비즈니스를 한 번만 실행하는 효과를 얻을 수 있습니다. 으아악

    회신하다
    0
  • PHPz

    PHPz2017-04-18 09:28:19

    저는 이 분야에 대한 경험이 없지만, 회사의 접근 방식은 IP를 사용하여 판단하고 지정된 IP만이 이 예정된 작업을 실행할 수 있다는 것입니다.

    다음은 실제 경험이 없는 개인적인 환상입니다.
    예약된 작업을 처리하기 위해 특별히 공개 애플리케이션을 구축한 다음 특정 애플리케이션이 호출할 메시지 인터페이스를 제공합니다.

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 09:28:19

    트랜잭션을 사용하여 구현, 분산 트랜잭션 또는 메시지 대기열

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    1. +1 연산을 = 연산으로 변경하는 등 연산 자체를 멱등성으로 만듭니다

    2. 각 작업에 ID를 부여하고 각 실행을 기록하기 전에 이 ID를 사용하는 작업이 이전에 실행되었는지 확인하세요.

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:28:19

    RabbitMQ 등과 같은 확인 메커니즘이 있는 메시지 대기열을 고려해 볼 수 있습니다. 이는 작업이 한 명의 작업자에게만 할당되도록 할 뿐만 아니라 작업 성공의 무결성도 보장합니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 09:28:19

    이를 zk 스케줄링을 통해 달성합니다. 분산 환경에서는 최대 하나의 시스템에서만 작업을 실행할 수 있습니다.

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    인정된 답변을 포함하여 지금까지의 모든 답변이 잘못되었습니다. 그 이유는 예약된 작업이나 비동기 처리는 멱등성과 관련이 없기 때문입니다.

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    redis + 토큰이면 충분합니다

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    큐를 사용하면 한 번만 실행됩니다. 실행에 실패하면 큐로 다시 돌아가서 다음을 기다립니다.

    회신하다
    0
  • 취소회신하다