openlang

Если start_link вернулся, значит ли это, что кеш прогрет?

У start_link обнадёживающее имя, но что клиент на самом деле узнал, когда вызов вернулся?

Здесь init возвращает {:ok, state, {:continue, :warm_cache}}. Вызов запуска ждёт только возврата из init. Прогрев идёт потом, в handle_continue. Значит, подтверждение говорит, что процесс существует, а не что кэш прогрет. Запросы клиентов внутри этого GenServer не выполняются параллельно с продолжением. Они просто встают за ним в очередь.

Теперь примерим к этому слово ready. Клиент видит признак успешного запуска и сразу просит значение из кэша. Если признак означает только возврат из init, ready обещает слишком много.

Честных вариантов два. Задержать готовность до конца прогрева. Или показать Warming и ограничить число запросов, которым разрешено ждать, и тогда придётся решить, что тайм-аут убирает из ожидающей работы.

С перезапуском под супервизором та же история. Перезапуск процесса и восстановление пригодного кэша остаются двумя разными обещаниями. Пусть ready называет то, за чем пришёл клиент. Для остального вполне годится started.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Может, сервису вообще не нужно ничего держать. Если клиенты уже понимают Warming, сообщите это через готовность и дайте каждому повторять запрос в пределах своего лимита. Одной очередью меньше объяснять, а эта очередь нужна была бы только чтобы пережить запуск. Если какой-то клиент действительно не может повторять, ладно, добавим ожидание. Задайте ему ёмкость и запишите, что полная очередь отвечает следующему вызывающему.

  2. Ссылка на ответ

    В варианте с ожиданием надо упорядочить два события, таймаут вызывающего и удаление его ожидающего запроса. Вызывающий отваливается по таймауту. Прогрев заканчивается. Сервер проходит по ожидающим записям и отвечает на эту раньше, чем доходит до сообщения об отзыве. Что происходит дальше, должно быть определено.

    Если ответ идёт через псевдоним процесса, после деактивации псевдонима всё, что отправлено через него, отбрасывается ещё до очереди вызывающего. Ответ, отправленный перед самой деактивацией, другое дело. Он уже в очереди, и вызывающему всё равно нужно понять, что это ответ на запрос, от которого он отказался. К тому же псевдоним ничего не сообщает серверу. Ожидающая запись остаётся, пока её кто-то не уберёт, поэтому у множества ожидания должна быть своя граница и свой способ выхода.

  3. Ссылка на ответ

    Канал ready покрывает оба случая vadimk. Горутина прогрева закрывает его, когда заканчивает. Проверка готовности делает неблокирующее чтение через select с веткой default, а кто действительно хочет ждать, просто читает из канала. Закрытый канал отпускает всех читателей сразу. Множество ожидающих тогда это просто заблокированные горутины, и это нормально, пока за ним не скопятся обработчики запросов. Тогда снова встаёт вопрос о ёмкости.

Другие стороны того же вопроса

  1. Причинность в объединённых журналах почтовых ящиков

    Если в общем логе почтового ящика стоит A1, B1, B2, A2, он говорит меньше, чем кажется. Обычные сообщения Erlang, без приорит…

    Ответы 3erlanggoodin
  2. При восьми местах в очереди 88 горутин всё ещё могут ждать

    Буферизованный канал ограничивает число задач внутри себя. На горутины, которые застряли на отправке, это ограничение не расп…