Вы можете создать его так, как вы описали. Но есть некоторые важные вещи.
Используйте уникальный ключ
Используйте уникальный ключ для каждой книги и если книга когда-либо изменяется, этот ключ также должен измениться. Этот дизайн заставляет ваш шаг (6) сохранить книгу в Redis и идемпотентную операцию (вы можете делать это много раз с одним и тем же результатом). Таким образом, вы избежите любого состояния гонки с "get-same-book".
Идемпотентные запросы ИЛИ асинхронные сообщения
Я бы хотел поставить в очередь повторные запросывременно, пока книга не найдена. Затем, как только книга уже поступила, на запросы в очереди отвечают с результатом
Я бы не рекомендовал запросов очереди , как вы ее описали. Если запрос является пропуском кеша, позвольте ему извлечь его из базы данных - но спроектируйте его идемпотент . В качестве альтернативы вы должны обработать все запросы как асинхронные и использовать очередь сообщений, например, nats , RabbitMQ или что-то еще, но сложность возрастает с этим решением.
Сериализация запросов
Моя проблема в том, что хотя в ту секунду вычислений, где результат еще не получен, может поступать слишком много повторных запросов, и из-за стоимости мне нужно избегать повторения ихвычисления. Мне нужно найти способ сохранить их, пока приходит результат первого запроса.
Похоже, вы хотите, чтобы ваши вычисления сериализовались вместо того, чтобы выполнять их одновременно, потому что выхочу избежать одного и того же вычисления дважды. Чтобы решить эту проблему, вы должны позволить запросам инициализировать вычисления, например, поместив входные данные в очередь , а затем выполнить вычисления в последовательном порядке (но все же, возможно, одновременно, если они имеютдругой ключ ) и, наконец, уведомить клиента, или если клиент подписывается на обновления (лучшее решение).
Redis поддерживает PubSub , но это зависит от того, какие требования у вас есть к клиентам. Я бы порекомендовал решение без блокировок, для масштабируемости.