como usar um acl dependente de solicitação como uma condição em uma correspondência de bastão ou armazenamento de resposta do bastão

2

Em neo4j , há o ponto final da cypher transacional . Isso permite que o cliente crie uma transação de banco de dados em várias solicitações REST. A primeira solicitação abre uma nova transação e recupera a URL a ser usada para solicitações subseqüentes à mesma transação em um cabeçalho http Location que contém o ID da transação, por exemplo,

Location: http://192.168.0.10:7474/db/data/transaction/24

O número no final é o ID da transação interna. Um pedido subseqüente para fechar a transação é enviado para http://192.168.0.10:7474/db/data/transaction/24/commit .

Para conseguir isso, estou usando o seguinte snippet para a configuração de back-end do haproxy:

backend neo4j-all
    option httpchk GET /db/manage/server/ha/available
    stick-table type integer size 1k expire 10m
    stick match path,word(4,/) 
    stick store-response hdr(Location),word(6,/) 
    server s1 127.0.0.1:7474 maxconn 32 check
    server s2 127.0.0.1:7475 maxconn 32 check
    server s3 127.0.0.1:7476 maxconn 32 check

Uma tabela fixa é preenchida com o ID da transação (6ª palavra no cabeçalho da localização). A solicitação subseqüente path contém o ID da transação como 4ª palavra. Esta parte funciona bem.

No entanto, quero limitar o uso da tabela de palitos a caminhos que começam com /db/data/transaction , já que o Neo4j pode ter outros pontos de extremidade e também comportamentos diferentes.

Minha primeira abordagem ingênua foi adicionar um acl ao backend:

 acl tx_cypher_endpoint path_beg /db/data/transaction

e, em seguida, altere o stick match e o stick store-response de cima com um if tx_cypher_endpoint . Ao iniciar, isso causa a seguinte mensagem:

parsing [haproxy.cfg:32] : acl 'tx_cypher_endpoint' will never match because it only involves keywords that are incompatible with 'backend stick-store rule'

Pergunta # 1: alguém pode explicar a razão disso?

Como solução alternativa, movi o acl para a seção frontend e armazenei condicionalmente uma variável com txn scope que é usada no backend:

frontend http-in
    bind *:8090
    acl tx_cypher_endpoint path_beg /db/data/transaction
    http-request set-var(txn.tx_cypher_endpoint) bool(true) if tx_cypher_endpoint
    default_backend neo4j-all

backend neo4j-all
    option httpchk GET /db/manage/server/ha/available
    acl tx_cypher_endpoint var(txn.tx_cypher_endpoint),bool
    stick-table type integer size 1k expire 10m
    stick match path,word(4,/) if tx_cypher_endpoint
    stick store-response hdr(Location),word(6,/) if tx_cypher_endpoint
    server s1 192.168.0.10:7474 maxconn 32 check
    server s2 192.168.0.11:7474 maxconn 32 check
    server s3 192.168.0.12:7474 maxconn 32 check

Pergunta # 2: a configuração acima é a abordagem mais elegante ou existe uma configuração mais simples possível?

Pergunta 3: como posso ver o que está acontecendo internamente no haproxy, por exemplo? Quais valores são armazenados em uma variável ou em uma tabela de palitos? O stats socket é o caminho a percorrer? Ou há uma saída de console mais detalhada do que usando -d ?

    
por Stefan Armbruster 17.08.2015 / 14:20

0 respostas

Tags