2016-08-26 7 views
3

Я работаю над архитектурой микросервиса, основанной на Docker, регистраторе, консуле и HAProxy.HAProxy & Consul-template: запрос повторной попытки при масштабировании

Я также использую шаблон Consul для динамического создания файла конфигурации HAProxy. Все работает нормально: когда я добавляю несколько экземпляров одного и того же микросервиса, конфигурация HAProxy обновляется немедленно, и запросы отправляются правильно, используя стратегию round robin.

Проблема возникает, когда я удаляю некоторые экземпляры (уменьшают масштаб). Если контейнер закрыт во время выполнения запроса, у меня есть ошибка.

Я новичок в 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 

Благодарим за помощь.

ответ

2

HAProxy не может отправить запрос, который уже отправлен на сервер.

Вот сообщение на форуме от создателя Вилли.

redispatch только бывает, когда запрос все еще находится в гапрокси. Как только он был отправлен, он не может быть выполнен. Он не должен выполняться ни для не идемпотентных запросов, потому что не существует способа узнать, началась ли некоторая обработка на сервере до его смерти и вернула RST.

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

Пост довольно старая, но она по-прежнему применяется на основе последних дискуссий. Если запрос больше, чем tune.bufsize (по умолчанию около 16 КБ iirc), то HAProxy даже не сохранил весь запрос в памяти в точке ошибки.

Как к счастью (для ремесла), так и, к сожалению, (для целей реальной утилиты), Вилли всегда настаивал на правильном поведении HAProxy, и он действительно прав, что неуместно повторять не-идемпотентные запросы, когда они были отправлены на внутренний сервер, потому что, конечно, случаи, когда это приведет к дублированию обработки.

Для GET запросов, которые, по определению, должны быть неидемпотентными (а GET запрос должен быть повторяемым без последствий, в противном случае она не должно была разработаны для использования GET - это должно было быть POST или другим глаголом) есть жизнеспособный аргумент что повторная отправка на другой back-end будет законным курсом действий, но в настоящее время это также не поддерживается.

лак, напротив, does поддержку сделай-за, который я использовал (за HAProxy) с успехом на GET запросов, где у меня есть он-лайн и ближней линии для хранения того же объекта пространства имен. Старые «непопулярные» файлы переносятся в почти линейное (медленнее, дешевле) хранилище, но все запросы отправляются в онлайн-хранилище, причем точка повторной отправки для близких строк, если он-лайн возвращает 404. Но, вы никогда не пробовали это с запросами, отличными от GET.

В идеале, ваше решение было бы для ваших задних концов объявлено нездоровым, возможно, путем преднамеренного отказа от проверки работоспособности HTTP на время истечения до закрытия. Один довольно простой подход заключается в том, чтобы проверка работоспособности требовала наличия статического файла, который удаляется из внутреннего блока перед выключением. Или вы можете потребовать, чтобы HAProxy рассматривал бэкэнд в режиме обслуживания через UI или сокет статистики/admin, предотвращая запуск большего количества запросов, позволяя запускать запросы на утечку.

+0

Благодарим вас за быстрый ответ ^^ –

 Смежные вопросы

  • Нет связанных вопросов^_^