Эликсир + Феникс на Heroku: ошибка тайм-аута через 15 секунд

Контекст: я запускаю приложение elixir + phoenix https://github.com/endeepak/stub_on_web на Heroku. Я выполнил шаги, упомянутые в http://www.phoenixframework.org/docs/heroku, для развертывание приложения.

Проблема: когда запрос POST занимает более 15 секунд, веб-сервер возвращает 500 Внутренняя ошибка сервера, а в журналах ошибка отображается как no case clause matching: {:error, :timeout}. Стек ошибок вставлен ниже

2015-11-10T16:56:06.680425+00:00 app[web.1]: 16:56:06.680 request_id=19c1ba3f-cfaf-476f-a145-12d234b61c55 [info] POST /stub_urls
2015-11-10T16:56:21.684018+00:00 heroku[router]: at=info method=POST path="/stub_urls" host=stubonweb.herokuapp.com request_id=19c1ba3f-cfaf-476f-a145-12d234b61c55 fwd="43.247.159.40" dyno=web.1 connect=1ms service=15004ms status=500 bytes=243
2015-11-10T16:56:21.683882+00:00 app[web.1]: 16:56:21.683 [error] #PID<0.429.0> running StubOnWeb.Endpoint terminated
2015-11-10T16:56:21.683887+00:00 app[web.1]: Server: stubonweb.herokuapp.com:80 (http)
2015-11-10T16:56:21.683888+00:00 app[web.1]: Request: POST /stub_urls
2015-11-10T16:56:21.683889+00:00 app[web.1]: ** (exit) an exception was raised:
2015-11-10T16:56:21.683890+00:00 app[web.1]:     ** (CaseClauseError) no case clause matching: {:error, :timeout}
2015-11-10T16:56:21.683891+00:00 app[web.1]:         (plug) lib/plug/parsers/urlencoded.ex:10: Plug.Parsers.URLENCODED.parse/5
2015-11-10T16:56:21.683892+00:00 app[web.1]:         (plug) lib/plug/parsers.ex:186: Plug.Parsers.reduce/6
2015-11-10T16:56:21.683893+00:00 app[web.1]:         (stub_on_web) lib/stub_on_web/endpoint.ex:1: StubOnWeb.Endpoint.phoenix_pipeline/1
2015-11-10T16:56:21.683894+00:00 app[web.1]:         (stub_on_web) lib/phoenix/endpoint/render_errors.ex:34: StubOnWeb.Endpoint.call/2
2015-11-10T16:56:21.683894+00:00 app[web.1]:         (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
2015-11-10T16:56:21.683895+00:00 app[web.1]:         (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

Мои наблюдения

  • Это не "ошибка H12" маршрутизатора Heroku, которая возникает, если запрос занимает больше 30 секунд. Ссылка: https://devcenter.heroku.com/articles/request-timeout. Я не смог получить особой помощи от службы поддержки heroku, поскольку это похоже на проблему с веб-сервером, а они не знают erlang / elixir.

  • Я пробовал работать на локальном компьютере с производственной конфигурацией, смоделировал задержку в 60 с. Запрос возвращает ответ 200 OK через 60 секунд без каких-либо ошибок тайм-аута, как указано выше.

Есть ли какая-то конфигурация, которую мне здесь не хватает? Есть другие мысли?


person Deepak N    schedule 10.11.2015    source источник
comment
Эта проблема с github может быть связана с: github.com/ninenines/cowboy/issues/833   -  person Patrick Oscity    schedule 10.11.2015
comment
Спасибо @PatrickOscity. Эта проблема привела меня к другому обсуждению проблем с фениксом и временному решению проблемы. Если кто-то еще сталкивается с подобной проблемой, обратитесь к github.com/phoenixframework/phoenix/ issues / для объяснения и обходного пути   -  person Deepak N    schedule 11.11.2015


Ответы (1)


Проблема возникла, так как я добавил плагин для чтения тела запроса и сохранения его как частных назначений в conn для будущего доступа. Код, использованный ранее, был

defp copy_req_body(conn, _) do
    {:ok, body, _} = Plug.Conn.read_body(conn, length: 1_000_000_000)
    Plug.Conn.put_private(conn, :raw_request_body, body)
end

plug :copy_req_body

plug Plug.Parsers,
    parsers: [:urlencoded, :multipart, :json],
    pass: ["*/*"],
    json_decoder: Poison

Кажется, проблема с plug, которая вызывает: тайм-аут, когда Plug.Parsers снова пытаются прочитать тело.

Временный обходной путь на данный момент заключается в использовании кода, предложенного в https://github.com/phoenixframework/phoenix/issues/459#issuecomment-155671415

Ссылка на фиксацию: https://github.com/endeepak/stub_on_web58/commita2452345/2008/commit8245245246

person Deepak N    schedule 11.11.2015