Arquitetura de Software
       Concorrência


André Faria Gomes   @andrefaria
Concorrência é
um dos aspectos
mais difíceis do
desenvolvimento
de software
 @martinfowler
Threads em servidores
               Transações
                        Arquivos
Leitura Inconsistente
Vamos contar uma estória...
1. China abre o ticket #1456 no Pronto e começa a
atualizar a descrição do ticket.

2. Segundos depois Rodrigo entra no
ticket, e altera.
3.China salva
4. Rodrigo salva
Moral da Estória?
     As alterações de
     China foram perdidas
     para todo o sempre...
Liveness
A quantidade de
atividade concorrente
que pode acontecer
Quando mais
liveness menos
safety
(correctness)
Contextos de Execução
Request
Corresponde a uma única chamada do
mundo externo para onde opcionalmente
uma resposta é enviada.

O servidor processa a resposta e o cliente aguarda.
Alguns protocolos permitem interromper a request.
Clients podem gerar outras request interfiram em anteriores.
Request
Corresponde a uma única chamada do
mundo externo para onde opcionalmente
uma resposta é enviada.

O servidor processa a resposta e o cliente aguarda.
Alguns protocolos permitem interromper a request.
Clients podem gerar outras request interfiram em anteriores.
Session
   É um interação de longa duração entre o
   cliente e o servidor, uma série de requests.

Normalmente associada a login e loguout
Comum na Web, em Bancos de Dados, etc...
Session
   É um interação de longa duração entre o
   cliente e o servidor, uma série de requests.

Normalmente associada a login e loguout
Comum na Web, em Bancos de Dados, etc...
Processo
 Geralmente um contexto de
 execução mais pesado que oferece
 isolamento para os dados que
 estão sendo trabalhados.

Oferece isolamento de memória e dados, por isso, há pouca
preocupação com concorrência nesse nível.
Processo
 Geralmente um contexto de
 execução mais pesado que oferece
 isolamento para os dados que
 estão sendo trabalhados.

Oferece isolamento de memória e dados, por isso, há pouca
preocupação com concorrência nesse nível.
Thread
     Um agente leve, pode haver
     múltiplas threads por processo.

Com threads é possível suportar n requests em por processo.
Melhor utilização de recursos, são mais “baratas” que processos.
Geralmente compartilham memória e dados.
Alguns ambientes oferecem threads com isolamento.
Thread
     Um agente leve, pode haver
     múltiplas threads por processo.

Com threads é possível suportar n requests em por processo.
Melhor utilização de recursos, são mais “baratas” que processos.
Geralmente compartilham memória e dados.
Alguns ambientes oferecem threads com isolamento.
Transação
Transações unem diversas requests que
precisam ser tratadas como uma única


Usuários
Integração
Bancos de Dados
Lindando com a
Concorrência
Problemas
acontecem quando
mais de um agente
ativo tem acesso
aos mesmos
recursos.
Isolamento
  Dividir os dados para que cada parte,
  seja usada apenas por um agente ativo.
Exemplo de Isolamento
O sistema operacional
reservando uma área de
memória exclusiva para cada
processo
Isolamento
A abordagem é também
usada para arquivos. Se
Douglas abre o arquivo X
ele fica bloqueado e
ninguém mais pode editá-
lo (talvez nem abrí-lo).
Imutabilidade
Só há problemas de
concorrência quando os
dados podem ser
alterados.


Por isso é importante que
tudo que possa ser
imutável, seja imutável.
Controle de Concorrência
      Otimista vs Pessimista
Optimistic Lock
Detecção de Conflito


       Todos editam ao mesmo
       tempo, o primeiro salva sem
       problemas, os próximos não
       conseguem porque há conflito
Pessmistic Lock
Prevenção de Conflito
Somente 1 editar por vez
Qual a Melhor abordagem?
Depende! Nenhuma é livre de problemas!
Lock de Leitura
    Shared Lock

evita write lock,
permite mais read
locks
Lock de Escrita
    Exclusive Lock


ninguém mais
pode bloquear
Deadlocks
 Um problema da abordagem pessimista
Deadlocks
Imagine isso com
30 agentes
envolvidos...
Deadlock Detection
Um software que detecta deadlocks e então
escolhe uma vítima para eliminar o deadlock
Deadlock
 Detection

É difícil de detectar


Prejudica vítimas
Timeouts
Mata se demorar mais
do que x segundos
Prevençãõ
Detecção e Timeouts
são formas de lidar
com dead locks, mas
como previnir?
Tudo no início
Fazer todos os seus
locks no ínicio de forma
a não começar o
trabalho caso algo não
esteja disponível.
Transações
 É um trabalho sequencial com pontos bem
 definidos de início e fim, que acontece de
 forma tudo ou nada.
Comprar uma Cerveja
Sacar Dinheiro
Pagamento com Cartão
ACID
Atômicidade
      Tudo ou Nada
Consistência
               Regras de integridade
               dos dados são
               asseguradas, ou seja, as
               transações não podem
               quebrar as regras
Isolamento
O resultado de
uma certa
transação não deve
ser visível para
outras transações
em aberto até estar
completa.
O resultado
comitado deve
ser permanente

 Durabilidade
transações devem ser
  Pequenas
Quanto menores forem melhor!
Quanto ocorrem em multiplas requests

Long Transactions
Request Transactions
     Começa e termina “junto” com a request
Late Transactions
   Começa o mais tarde possível

                            Aumenta o risco de
                            leituras incosistentes
Lock Escalation
 Você pode acabar gerando mais locks do
 pode gerênciar...
Quando o banco de dados tem muitos
locks em linhas, acaba precisando
bloquear a tabela toda

Cuidado com
Layer Supertype
Níveis de Isolamento
Serializável
   O nível mais forte de isolamento
Mike está   Bob está
contando    incluindo 5
arquivos    arquivos
Garante um resultado sempre correto,
embora possa ser anterior ou posterior a
alteração
Não garante que toda vez que você
executar o mesmo cenário terá o mesmo
resultado
Repeatable Read
      permite fantasmas

 Você executa duas vezes a mesma
 consulta e recebe um número
 diferente de registros em cada
 uma delas.



     não gerencia
      range-locks
Read Committed
     permite leituras não repetíveis


A transação lê duas vezes o
mesmo dado, e em cada um
das vezes recebe um resultado
diferente.



 não gerencia range-locks
Read Uncommited
           permite leitura suja

                   Você consegue
                   ler dados de
                   transações que
                   ainda não
                   foram
                   comitadas
Equilíbrio entre
Liveness e Correctness
Dirty      Nonrepeatable   Phantom
Isolamento
                 Read           Read          Read

   Read
                Possível       Possível      Possível
uncommitted

   Read
               Impossível      Possível      Possível
 committed

Repeatable
               Impossível    Impossível      Possível
   read

Serializable   Impossível    Impossível     Impossível
Referências

      http://
      www.thedeveloperday.com/
      domain-model-logic-patterns/


      http://martinfowler.com/
      eaaCatalog/
http://en.wikipedia.org/wiki/
Isolation_(database_systems)
Obrigado
     @andrefaria

Arquitetura de Software - Concorrência