HAProxy & Consul-模板 : retry request when scaling down

标签 haproxy consul consul-template

我正在研究基于 Docker、registrator、consul 和 HAProxy 的微服务架构。

我也在使用 Consul-template 来动态生成 HAProxy 配置文件。一切正常:当我添加同一个微服务的多个实例时,HAProxy 配置会立即更新,并使用循环策略正确分派(dispatch)请求。

当我删除一些实例(按比例缩小)时,会出现我的问题。如果在请求运行时关闭容器,则会出现错误。

我是 HAProxy 的新手,所以有没有办法配置 HAProxy 来告诉它在容器消失时重试对另一个端点的失败请求?

精度:我正在为我的前端和后端使用 layer7 路由模式(模式 http)。这是我的领事模板文件的一个小样本:

backend hello-backend
    balance roundrobin
    mode http
    {{range service "HelloWorld" }}server {{.Node}} {{.Address}}:{{.Port}} check
    {{end}}

    # Path stripping
    reqrep ^([^\ ]*)\ /hello/(.*) \1\ /\2

frontend http
    bind *:8080
    mode http

    acl url_hello path_beg /hello
    use_backend hello-backend if url_hello

感谢您的帮助。

最佳答案

HAProxy 无法重新发送已经发送到后端的请求。

这是创建者威利的论坛帖子。

redispatch only happens when the request is still in haproxy. Once it has been sent, it is cannot be performed. It must not be performed either for non idempotent requests, because there is no way to know whether some processing has begun on the server before it died and returned an RST.

http://haproxy.formilux.narkive.com/nGKXq6WU/problems-with-haproxy-down-servers-and-503-errors



这篇文章已经很老了,但根据最近的讨论,它仍然适用。如果请求大于 tune.bufsize (默认为 16KB iirc 左右)然后 HAProxy 甚至在发生错误时还没有将整个请求保留在内存中。

幸运的是(为了工艺)和不幸的是(为了现实世界的效用),Willy 一直坚持 HAProxy 的正确行为,他确实是正确的,一旦非幂等请求被发送到就重试是不合适的。后端服务器,因为在某些情况下这肯定会导致重复处理。

对于 GET根据定义,请求应该是幂等的(GET 请求必须是可重复的,没有后果,否则它不应该被设计为使用 GET -- 它应该是 POST 或其他动词)有一个可行的论点重新发送到不同的后端是合法的做法,但目前也不支持。

相比之下,清漆 does支持重做,我在 GET 上成功使用(在 HAProxy 之后)请求我对同一对象命名空间进行在线和近线存储。旧的,“不受欢迎”的文件被迁移到近线(更慢,更便宜)存储,但所有请求都被发送到在线存储,如果在线返回 404,则重试目的地为近线。但是,我'除了 GET 之外,我从未尝试过这种请求。 .

理想情况下,您的解决方案是让您的后端被宣布为不健康,可能是在关闭之前故意使他们的 HTTP 健康检查失败并耗费大量时间。一种相当简单的方法是运行状况检查要求存在一个静态文件,该文件会在关闭前从后端删除。或者,您可以通过 stats/admin UI 或套接字请求 HAProxy 将后端视为处于维护模式,从而防止启动更多请求,同时允许正在运行的请求耗尽。

关于HAProxy & Consul-模板 : retry request when scaling down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39160713/

相关文章:

node.js - 'express' 的 Openshift haproxy 错误没有可用的服务器

ssh - haproxy 在 ssh 连接 [TCP 前端/后端] 上发送 400 错误请求

docker - 如何配置Prometheus consul_sd_configs使用https做服务

linux - bitnami consul 无法使用 docker 桌面卷挂载访问文件或目录

Consul 1.2.1 在命令参数中使用管道定义健康检查

ubuntu - HAProxy 无法识别 SSL

docker - HAProxy Docker Container无法使用localhost在我的Cockroach DB Docker容器之间进行负载平衡

macos - 在 OSX 上访问在 docker 中运行的 consul UI

kubernetes-helm - 如何在 Helm Chart 中生成 Consul 模板

Consul-Template:循环 k/v 对并在另一个键中使用结果