first-programmer
@first-programmer
Backend software engineer

Как правильно передавать данные между сервисами?

Всем привет!)

Поделитесь своими мыслями и опытом, как правильно и почему (удобнее поддерживать) обмениваться данными в микросервисах. Тут вопрос не о способе передачи, у меня тут очереди, а вопрос в том, что передавать, набор объектов или массив строк?

Предположим есть сервис А, и он умеет хранить и обрабатывать транзакции (оплата например книжек). В этом сервисе есть модель Transaction и соответственно в базе таблица. И есть другой сервис B. В этом сервисе происходит только отображение транзакций из модуля A. То есть модуль B обращается курл в модуль А, тот ему должен отдать список транзакций.

Вопрос в том, как именно отдать список транзакций -

1) Массив строк (json)
2) Массив объектов

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

Из минусов -
- Нужно таскать непонятные объекты.
- Если в объекте, что-то меняется на стороне сервиса А, то в сервисе B может сломаться код.

Второй вариант, мы отдаем массив строк.
Нам нужно как-то это дело карасиво преобразовать в модели.
Мы типа такие смотрим, какие данные приходят, создаем на основе них класс с нужными полями и методами валидации, записываем все туда (делаем базовый метод load, validate), делаем сервис который работает с этими моделями (entity) и дергаем его из нашего контроллера.

Звучит не плохо. Но больше кода и действий.

Плюсы
- Мы создаем свою структуру в сервисе B, которая описывает то с чем этот сервис будет работать (свои модельки для заполнения и валидации пришедших данных). Это позволяет немного абстрагироваться от сервиса А.

Минусы
- Много кода, так как по сути у нас есть в сервисе А модель описывающая Transaction и теперь нам надо создать в сервисе B такую же модель для того чтобы сервис B понимал с чем он вообще работает (ну и чтобы вообще все это дело запихать в датапровайдер с пагинацией, фильтрами и всем прочим нужным).

А как вообще правильно делать пагинацию в таком случае? В сервисе B через параметры GET принимать номер страницы и передавать все это дело в сервис А, где делать нужную выборку и возвращать в B? Или тянуть из A все данные и тут их пихатьв. провайдер с пагинацией? Наверно лучше передавать в сервис А данные для пагинации и брать от туда только нужное сразу.
  • Вопрос задан
  • 599 просмотров
Пригласить эксперта
Ответы на вопрос 4
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Создайте контракт. Этот контракт описывает ваши обьекты вот пример
{
  "tranzactions": [
    {
      "name": "tr2177",
      "created": 6666666666
    },
    {
      "name": "tr2178",
      "created": 6666666667
    },
    {
      "name": "tr2179",
      "created": 6666666668
    },
    {
      "name": "tr2180",
      "created": 6666666669
    },
    {
      "name": "tr2181",
      "created": 6666666670
    }
    
  ],
  "total": "500",
  "pageSize": "5"
}

Сервис A и B знают только про контракт. Что там внутри творится их не волнует. Задача любого сервиса правильно создать модель на основе контракта и отдать ее или обработать.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
бред какой-то, в любом случае если меняется структура данных придется изменять и адаптер/обработчик.
обращаться к своему же сайту через curl - тупо и не эффективно, проще перенаправлять запросы к локальным сервисам/контроллерам через роутинг.
проще и удобнее передавать объекты, см. реализацию soap в php, можешь ничего не выдумывать и использовать устоявшуюся бизнес практику.
по поводу сервисов, см. шаблон проектирования strategy - меняется не модель данных, а способ их отображения.
Ответ написан
@Nc_Soft
У вас 1 сервис должен быть который работает с сущностями транзакций (получение, отображение итп).
Вы занимаетесь ерундой, наверное книжку умную прочитали или доклад про микросервисы авито на ютуб посмотрели..
Ответ написан
hrabry
@hrabry
может быть в сторону gRPC & protocol buffers посмотреть https://youtu.be/6JF2U39J4RY?t=5728 тут есть интересный доклад по этой теме
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы