Плагин Kong fuse (незаконченный)

Архитектура

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

Ссылаться на:

  1. Комикс: Что такое сервисный автоматический выключатель?
  2. Анализ исходного кода механизма загрузки плагинов Kong