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? Ostats socket
é o caminho a percorrer? Ou há uma saída de console mais detalhada do que usando -d
?