O bloqueio distribuído baseado em Redis evita altas solicitações repetidas simultâneas

Requisitos:

Vamos primeiro fornecer uma lista de exemplos de verificação do sistema: (sistema de canal A, sistema B comercial, sistema C de fornecedor externo)
(1) O sistema comercial B chama o sistema de canal A para verificar se o telefone móvel, o ID e o nome são consistentes.
(2) O sistema de canais A chama o sistema C do fornecedor externo.
(3) O sistema de canais A retorna o resultado ao sistema de negócios B.

Desses 3 processos, (2) processo, ligar para fornecedores externos requer cobrança.
Quando a simultaneidade do sistema de negócios B. é muito alta, há 100 verificações idênticas de três elementos.Como os três elementos são iguais, o canal A precisa chamar o fabricante apenas uma vez para saber o resultado. Para impedir que outras solicitações chamem o sistema externo ao mesmo tempo em que uma solicitação não foi respondida, esse tempo requer um processamento de bloqueio

Recursos de bloqueios distribuídos

Atomicidade: apenas um segmento de uma máquina
pode obter o bloqueio ao mesmo tempo; reentrada: o mesmo objeto (como um segmento, classe) pode chamar repetidamente e recursivamente o bloqueio sem conflito;
bloqueável: quando o bloqueio não é adquirido Anteriormente, era possível bloquear e aguardar até que o bloqueio fosse adquirido;
alta disponibilidade: mesmo se ocorrer uma falha no programa ou danos à máquina, o bloqueio ainda poderá ser adquirido e liberado;
alto desempenho : a operação de aquisição e liberação do bloqueio consome pouco.

Para conseguir: bloquear, reduzir bloqueio, o tempo limite de bloqueio
pode ser alcançado por: banco de dados mc redis zookeeper de arquivo do sistema

Agora sou um sistema de canal.Quando 100 solicitações de negócios idênticas são ignoradas, minha primeira solicitação é bloquear primeiro, solicitar um sistema de fornecedor externo, aguardar a resposta, inserir outra chave e excluir o bloqueio.
Outras solicitações vão para obter o bloqueio primeiro; se já houver um bloqueio, ele encontrará e aguardará; se o bloqueio não estiver mais lá, vá diretamente para o resultado da consulta.
Se a primeira solicitação falhar e o resultado não for inserido no local, continue adquirindo o bloqueio e, em seguida, consulte o sistema externo.

Adquira a trava:
$ redis-> set ('trava: número do celular e ID & nome', 1, ['nx', 'ex' => 10]);
libere a trava:
basta excluir o
tempo limite da trava da tecla :
trava chave tem tempo limite

A nova versão do comando redis set pode implementar bloqueios distribuídos e também pode definir o conjunto e o tempo limite, se ele não existir.

<?php
$redis=new Redis();
$redis->connect("127.0.0.1",6379);
//高并发时防止重复请求

//渠道系统传递过来的key
$lockKey='lock:18806767777&37781991111629092&taoshihan';
$resultKey='res:18806767777&37781991111629092&taoshihan';

//如果已经查询过值,可以直接返回
$info=$redis->get($resultKey);
if($info){
exit($info);
}

//如果没有值的,获取锁
$lock=$redis->set($lockKey, 1, ['nx', 'ex'=>10]);
if($lock){
//请求外部系统获取结果,比如响应结果比较慢
sleep(8);
$info='{"name":"taoshihan"}';
$ret=$redis->set($resultKey,$info);
if($ret){
//删除锁
$redis->del($lockKey);
exit($info);
}
}
echo "请稍后重试!";

Acho que você gosta

Origin www.cnblogs.com/myJuly/p/12684028.html
Recomendado
Clasificación