Nano Hash - криптовалюты, майнинг, программирование

Атомарность запроса в ограниченном контексте микросервисов

Наш проект состоит из нескольких микросервисов. Эти микросервисы образуют границу, точка входа к которой строго не определена, то есть каждый из микросервисов может быть запрошен и может запрашивать другие сервисы.

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

Теперь произошло то, что одно и то же было обработано два раза из-за первого тайм-аута.

Нам нужно убедиться, что тот же запрос не будет обработан, и приложение ответит прежним ответом и кодом состояния.

Последующий запрос идентифицируется тем же UUID.

Теперь я понимаю, что клиент должен делать запросы более точно, или у нас должна быть единая точка входа запроса в контексте, ограниченном микросервисами, но в корпоративных проектах команда не владеет всей системой, поэтому мы немного ограничены решениями. мы предлагаем для проблемы. Имея это в виду, пытаясь не изобретать велосипед, мне приходит на ум:

Микросервисы должны использовать какое-то совместное использование сеанса (spring-session?) с возможностью поиска запроса по его id до того, как он будет обработан, и в описанном случае, когда первый обрабатывается, а второй поступает, ждать завершения 1-й и ответить второму данными первого, время ожидания которого истекло для клиента.

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

Если будет использоваться spring-session (например, с hazelcast), мне не хватает какого-то конкретного обработчика состояния сеанса, который будет запущен при завершении запроса. Есть ли что-то подобное для прослушивания?

Код еще не написан. Это архитектурный мысленный эксперимент, который я хочу обсудить.

Если не уверены в понимании, прочитайте второй раз, пожалуйста, тогда я буду рад расширить.

РЕДАКТИРОВАТЬ: первая идея:

введите здесь описание изображения процесс будет выглядеть следующим образом (с нумерацией на изображении):

  • (1) первый запрос запущен
  • (3) обработка началась; (2) время запроса истекло;
  • (4) клиент повторяет тот же запрос; программа знает, что она уже получала такой же запрос, потому что она знает req. я бы.
  • программа проверяет кеш и состояние этого идентификатора запроса «ожидание», поэтому она ЖДЕТ (асинхронно).
  • вычисленный результат первого запроса сохраняется в кеше - оранжевый квадрат
  • (5) программа отвечает на первый запрос данными, которые предназначались для первого запроса

Идея состоит в том, что проверка результата и ответ на повторный запрос будут выполняться в цепочке фильтров, поэтому он фактически не попадет в контроллер, когда второй запрос асинхронно ожидает выполнения операции, инициированной первым запросом (я вижу, что у hazelcast есть некоторые события, когда строки добавляются/обновляются/удаляются из кеша - не знаю, работает ли он еще) и после завершения просто отвечают (каким-то образом пишут в HttpServletResponse). результат будет сохранен в кэше в фильтре postHandling.

Спасибо за понимание.


Ответы:


1

Я бы посчитал это скорее парадигмой кэширования. Вставьте свой запрос/ответ во внешний поставщик кеша (REDIS или аналогичный), проиндексированный по uuid. Наличие TTL позволит автоматически очищать ваши ответы от запросов, которые никогда не возвращаются, а высокоскоростная реализация (o1) должна обеспечить хорошее масштабирование. Это также даст вам асинхронную модель из коробки (не заявленная цель, но всегда хороший вариант).

26.10.2020
  • да, в основном это своего рода кеширование, но мне нужно иметь возможность правильно реагировать на эти повторяющиеся запросы, если возможно, распознать, что операция выполняется, и дождаться ее завершения, а затем ответить 27.10.2020
  • Итак, поместите запрос в кеш по uuid (или какому-нибудь осмысленному хэшу), когда ответ вернется, прикрепите к нему ответ, а затем ответьте клиенту. Клиент каждый раз проверяет, присутствует ли запрос, соответствующий его хэшу, если он находит его, он использует прикрепленный ответ, если нет прикрепленного ответа, ждет разумный тайм-аут и продолжает проверку. В конце концов поток с первоначальным запросом клиента заполнит ответ, или произойдет тайм-аут, и новый запрос клиента придет для выполнения. 27.10.2020
  • ну, я не уверен, что мы на одной странице, поэтому я расширил вопрос с некоторым предложением по эксплуатации, о котором я думаю. в любом случае, я не могу сказать запрашивающей стороне что-то сделать/изменить процесс запроса каким-либо образом.. так что наш контекст микросервисов должен отвечать хорошо и наносить как можно меньший ущерб :) 27.10.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..