Я добился определенного прогресса, используя балансировщик Ring Hash
На прокси-сервере-посреднике (ищите "hash"):
static_resources:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 80
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
codec_type: http2
stat_prefix: ingress_http #just for statistics
route_config:
name: local_route
virtual_hosts:
- name: samplefront_virtualhost
domains:
- "*"
routes:
- match:
prefix: "/mycompany.sample.v1"
grpc: {}
route:
cluster: sampleserver
hash_policy:
header:
header_name: "x-session-hash"
- match:
prefix: "/bbva.sample.admin"
grpc: {}
route:
cluster: sampleadmin
http_filters:
- name: envoy.router
config: {}
clusters:
- name: sampleserver
connect_timeout: 0.25s
type: strict_dns
lb_policy: ring_hash
http2_protocol_options: {}
hosts:
- socket_address:
address: sampleserver
port_value: 80 #Connect to the Sidecard Envoy
- name: sampleadmin
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
http2_protocol_options: {}
hosts:
- socket_address:
address: sampleadmin
port_value: 80 #Connect to the Sidecard Envoy
admin:
access_log_path: "/dev/null"
address:
socket_address:
address: 0.0.0.0
port_value: 8001
В моих потребителях я создаю случайный хэш непосредственно передBeginTransaction()
и я удостоверяюсь, что он отправляется в заголовке x-session-hash
каждый раз, пока Commit(txnId)
Это работает, но имеет некоторые ограничения:
Когда я масштабирую службу,При добавлении большего количества узлов некоторые операции завершаются с ошибкой upstream connect error or disconnect/reset before headers
.Сбои абсолютно нормальны, когда один узел потерян, но они вряд ли приемлемы, когда добавляется узел !!!Хорошая новость заключается в том, что в обоих случаях нагрузка перебалансируется.
Клиент должен сгенерировать хэш до того, как будет сделан первый вызов (BeginTransaction
), так же как и клиент, который непреднамеренно диктует, какой узел будет обслуживать запросы.для этой транзакции.
Я буду продолжать расследование.