Os cenários de aplicação reais primavera assuntos multithread

Olá a todos, eu sou um pato:

Hoje é a quota efectiva cenários de aplicativos multithreaded primavera Assuntos:

Anterior falou sobre o princípio, principalmente para início e execução da transação (link de dados, níveis de isolamento, ThreadLocal vinculados-thread).
https://blog.csdn.net/Angry_Mills/article/details/82502288

 

A seguir, a partir de um ponto de vista prático da análise.

A cena seguinte código de demonstração Endereço:

https://gitee.com/fireduck_admin/demo-mutithread.git

1. cenários de simulação   

   1.1 Método não adicionado anotação transacional, mestre transacção segmento novo Tópico forma de realização da apresentação do
    segmento principal e a transação segmento de criança submetidos separadamente (segmento de criança arquivado segmento principal apresentado)
    1.2 mais transacional anotação autor transacção rosca mestre novo Tópico forma de realização do processo em que
    o segmento principal e um sub assuntos de rosca submetido com

    Considere o seguinte anotada única maneira da situação
    1.3 a thread principal, linha criança anormal normal, 
    sem transacional anotação em termos de método de execução sub-thread de adicionar nova forma Thread, o segmento de criança é executado em um não-transacional
    1.4 Async usando springboot de notas, o principal tópicos, além de notas de transação, sub-thread sem Assuntos observa
    o segmento principal e dos Assuntos segmento infantil apresentados com
    1,5 usos springboot de notas assíncronas, os principais fios mais transação notas, sub-thread sem notas de transação, exceção sub-thread
    do thread principal e as transações de rosca criança são não confirmadas
    1.6 assíncrona usando springboot de notas, além dos principais notas Assuntos de rosca, além de transação comentário sub-thread @Transactional (propagação = Propagation.REQUIRES_NEW)
    o segmento principal eo segmento infantil da transação foram submetidos (rosca criança enviar enviar imperador)
    1.7 usando Async comentário springboot, o mestre adicionar transação fio comentário, além de transação comentário sub-thread @Transactional (propagação = Propagation.REQUIRES_NEW), anormal segmento infantil
    o segmento principal e as transações de rosca criança são não confirmadas
    1.8 Async usando springboot de notas, além da principais notas Assuntos de rosca, sub-thread mais transação anotação @ transaccionai (propagação = P ropagation.REQUIRES_NEW), o segmento principal anormal
    segmento principal UncommittedE os Assuntos segmento de criança submetida

    Resumir.
    Notas sobre a utilização de configuração assíncrona Propagation.REQUIRES_NEW, o segmento principal e o segmento infantil é realmente duas transações diferentes foram submetidos.
    Mas para segmento de criança anormal, mas dois são revertidas. segmento infantil, devido à reversão anormal, isso não é problema. Enquanto uma exceção lançada para o segmento principal , o segmento principal também seguiu uma reversão.
    Podemos pensar em transações multi-threaded são aninhados, a exceção irá causar uma reversão qualquer sub-fio de toda a transação .
    Mas o histórico da criança, se não anormal executar a operação será submetida directamente, independentemente do segmento principal é anormal .

2. A cena real

     Antes encontrou uma cena, os iniciados usuário um pagamento e estamos interface síncrona, desta vez também solicitar um terceiro interface de pagamento (interfaces, como Alipay), desta vez não é um problema.
     Porque o pagamento de um retorno de chamada assíncrona tão rápido , resultando em um banco de dados com o número de ordem para encontrar menos dados ( dados não submetidos ao armazenamento ).
     Com um serviço para fazer este não é certamente a pensar nas operações de armazenagem em um método assíncrono foi feito principalmente para garantir que a interface antes de chamar um banco de dados de terceiros tem um armazenamento (transação sub-thread commit).
     Desta vez, podemos adotar práticas acima de 1,7, o segmento de criança do que a principal prioridade do thread apresentar, mas mesmo que não pode garantir um certo sub-segmento de execução é mais rápido do que o retorno de chamada .
 

3. Melhoria

    terceira interface geral do partido de retorno de chamada tem um tempo limite de tempo, ele não quer que você faça qualquer processamento lógico. Contanto que a mensagem recebida é retornada para o sucesso.
    Eles receberão a lógica de processamento de mensagens e serviço separadamente, depois de receber a chamada de retorno retorna com sucesso, enquanto a lógica de negócios assíncrona.
    Se este tempo não tenha colocado no armazenamento, a chamada de retorno único de identificação (número de ordem e um parâmetro de retorno de chamada) para o cache.
    Após o armazenamento segmento infantil também fazem uma operação semelhante, o número de consulta a fim de cache se não é (não é explicada pela primeira vez ao callback), em seguida, para obter os parâmetros de retorno de chamada manualmente invocar uma notificação assíncrona.
    Claro, isso é provavelmente um caso extremo, o método de retorno que acaba de terminar uma consulta, coloque o fio cache / criança apenas de armazenamento, o acesso a cache ao mesmo tempo. Porque ainda existe no número de ordem cache.
    Esta probabilidade muito baixa de problema, você pode executar um programa de compensação intervalo de tempo (1h uma vez).
 

Publicado 115 artigos originais · ganhou elogios 58 · Exibições 230.000 +

Acho que você gosta

Origin blog.csdn.net/Angry_Mills/article/details/82620286
Recomendado
Clasificación