идентификаторы, назначенные базой данных для обмена сообщениями микросервисов

Компания, в которой я работаю, изучает возможность перехода от нашего текущего монолитного API к микросервисам. Наш текущий API сильно зависит от Spring, и мы используем SQL-сервер для большей устойчивости. Наше исследование микросервисов склоняется к сохранению Spring-Cloud, Spring-cloud-stream, kafka и polyglot (изолированная база данных для каждого микросервиса).

У меня вопрос о том, как обмен сообщениями через кафку обычно осуществляется в микросервисной архитектуре. Мы планируем создать уровень координации между набором микросервисов и нашими клиентскими приложениями, который будет координировать действия различных микросервисов и изолировать клиентов от изменений в API микросервисов. Большая часть материала, который мы читали об использовании spring-cloud-stream и kafka, указывает на то, что мы должны использовать потоки на уровне координации (источник) для операций изменения ресурсов (вставки, обновления, удаления), при этом микросервис является одним из потребителей Сообщения.

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

Как люди справляются с этой проблемой? Являются ли идентификаторы, присвоенные базой данных, анти-шаблоном в микросервисах? Должны ли мы предоставлять отдельные конечные точки микросервисов, которые возвращают идентификаторы, назначенные базой данных, чтобы уровень координации мог выполнять синхронный вызов для получения идентификатора перед вызовом асинхронной вставки? Мы могли бы использовать UUID, но наши администраторы баз данных ненавидят их в качестве первичных ключей, и их нельзя использовать в качестве номера заказа или других сгенерированных идентификаторов для пользователя.


person gadams00    schedule 14.04.2016    source источник


Ответы (2)


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

Но этот подход требует отдельной проверки другими потребителями в базе данных для обработки только зафиксированных транзакций (если вас беспокоит обработка только вставок).

person Ilayaperumal Gopinathan    schedule 15.04.2016

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

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

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

person tiengtinh    schedule 17.04.2016