1. Фьюзинг
Понимание фьюзинга требует понимания проблемы, которую решит фьюзинг — лавинной.
Лавина: в распределенной системе часто бывает, что некоторая базовая служба недоступна, что приводит к недоступности всей системы.Это явление называется эффектом лавины служб.
Цепочка вызовов системы показана на рисунке. Как только нижестоящая служба C становится по какой-то причине недоступной, возникает отставание по запросам, и поток запросов службы B также блокируется. Ресурсы потока постепенно истощаются, что делает сервис B также недоступным. Сразу же после этого становится недоступной и услуга А, и вся цепочка вызовов затягивается, этот каскадный сбой цепочки вызовов называется лавиной.
Тогда надо думать, как решить лавину?
2. запрос-прекращение
function RequestTerminationHandler:access(conf)
RequestTerminationHandler.super.access(self)
local status = conf.status_code
local content = conf.body
if content then
local ctx = ngx.ctx
if ctx.delay_response and not ctx.delayed_response then
ctx.delayed_response = {
status_code = status,
content = content,
content_type = conf.content_type,
}
ctx.delayed_response_callback = flush
return
end
end
return responses.send(status, conf.message)
end
Выше находится Конгrequest-terminationОсновной код , отaccessЛогику можно проанализировать: плагин проверен от ctxdelay_responseверно, еслиdelay_response(логический тип помеченного количества) иdelayed_responseЕсли (тип карты) не пуст, установитеdelayed_response_callbackэто функция сброса.
ctx.delay_response Этот параметр, его принцип заключается в том, чтобы обернуть обработчик, который должен быть выполнен, в сопрограмме.Если плагину требуется ngx.say для предварительного выполнения обработчика содержимого Nginx, тогда он выдаст текущую сопрограмму для задержки обработчика содержимого. . , и пропустить все плагины, которые необходимо запустить после этого. В основном это основано на двух моментах:
- Выйдите из цикла «фаза» как можно скорее, если запрос перехвачен плагином.
- Вы можете выполнить некоторые пользовательские операции перед выводом содержимого.
Я не понимаю (⊙﹏⊙)b здесь, давайте угадаем: перед тем, как будет выполнен доступ к fuse-плагину, он решит, продолжать ли работу по биту флага в ctx, или он будет перехвачен и положить обратно на ответ в соответствии с настроенным статусом и содержанием клиента.
Итак, вот бит флагаctx.delay_responseВ каких случаях оно будет помечено как истинное? илиctx.delay_responseЭто уже верно, когда он инициализирован, и его конструкция заключается в том, чтобы запрос выскочил из плагина, а затем завершил выполнение последующих плагинов.
function Kong.access()
kong_global.set_phase(kong, PHASES.access)
local ctx = ngx.ctx
runloop.access.before(ctx)
ctx.delay_response = true
for plugin, plugin_conf in plugins_iterator(loaded_plugins, true) do
if not ctx.delayed_response then
kong_global.set_named_ctx(kong, "plugin", plugin_conf)
kong_global.set_namespaced_log(kong, plugin.name)
local err = coroutine.wrap(plugin.handler.access)(plugin.handler, plugin_conf)
kong_global.reset_log(kong)
if err then
ctx.delay_response = false
return responses.send_HTTP_INTERNAL_SERVER_ERROR(err)
end
end
end
Ссылаться на: