Introducción al uso de la solución idempotente de Java.

Idempotencia significa que una o varias solicitudes de un recurso tienen el mismo impacto en el estado del recurso. En el desarrollo de Java, darse cuenta de la idempotencia de las interfaces es un medio importante para mejorar la calidad del servicio. A continuación, detallamos las soluciones de idempotencia de Java desde múltiples aspectos, como bloqueos de bases de datos, mecanismos de token, bloqueos pesimistas y bloqueos optimistas.

1. Bloqueo de base de datos

1. En las operaciones de la base de datos, el mecanismo de bloqueo de la propia base de datos (como el bloqueo de fila y el bloqueo de tabla de MySql) se puede utilizar para garantizar la idempotencia de la interfaz.

2. Al utilizar cerraduras, debe prestar atención a la granularidad y al tiempo de retención de las cerraduras para reducir los problemas de rendimiento causados ​​por las cerraduras.

public void insertOrder(Orden de pedido){ 
    sincronizado(esto){ 
        if(orderDao.selectById(order.getId())!=null){ 
            throw new RuntimeException("el pedido existe"); 
        }else{ 
            ordenDao.insert(orden); 
        } 
} 
    }

2. Mecanismo de fichas

1. La idempotencia de la interfaz también se puede lograr utilizando el mecanismo Token. El método de implementación específico es: cuando se solicita la interfaz por primera vez, se genera un Token, el Token se guarda en el lado del servidor y se devuelve al cliente. Cuando el cliente solicita la interfaz por segunda vez y posteriormente, necesita traer este Token. El servidor usa el Token para determinar si se repite la solicitud.

2. Al utilizar el mecanismo del Token, debe prestar atención a la gestión del ciclo de vida del Token y a cómo abordar el problema de la pérdida del Token.

cadena pública getToken(){ 
    token de cadena = UUID.randomUUID().toString(); 
    tokenMap.put(token, verdadero); 
    ficha de devolución; 
} 

public void checkToken(String token){ 
    Boolean exist = tokenMap.get(token); 
    if(exist==null||!exist){ 
        throw new RuntimeException("la solicitud de reproducción o el token no existe"); 
    }else{ 
        tokenMap.remove(token); 
    } 
}

3. Bloqueo pesimista y bloqueo optimista

1. En un entorno concurrente, también podemos utilizar bloqueo pesimista y bloqueo optimista para garantizar la idempotencia de la interfaz. El bloqueo pesimista supone el peor de los casos. Cada vez que obtiene datos, cree que otros subprocesos los modificarán. Por lo tanto, bloqueará cada vez que obtenga datos para asegurarse de que otros subprocesos no modifiquen los datos durante el período de bloqueo. .

2. El bloqueo optimista es lo opuesto. Asume la mejor situación. Cada vez que obtiene datos, piensa que otros subprocesos no modificarán los datos, por lo que no los bloqueará. Sin embargo, al enviar la actualización, juzgará si hay ningún dato durante este período. Otros hilos modificaron estos datos.

//悲观锁
public void getPessimisticLock(){ 
    sincronizado(esto){ 
        legadoService.perform(); 
    } 
} 

//乐观锁
public void getOptimisticLock(){ 
    int oldValue = LegacyService.getValue(); 
    hacer algo(); 
    int newValue = legadoService.getValue(); 
    if(oldValue! = newValue){ 
        throw new RuntimeException ("el valor ha sido modificado por otros"); 
    }else{ 
        legadoService.commit(); 
    } 
}

Supongo que te gusta

Origin blog.csdn.net/linyichao123/article/details/133536477
Recomendado
Clasificación