Способи поділитися DTO через мікросервіси?


33

Мій сценарій такий.

Я розробляю систему, розроблену для прийому даних від різних типів датчиків, а також перетворюю їх, а потім наполягаю, щоб згодом їх використовували різні фронтові та аналітичні служби.

Я намагаюся розробити кожну службу якомога більш незалежною, але у мене виникають певні проблеми. Команда визначилась із DTO, яким ми хотіли б скористатися. Служби, спрямовані назовні (одержувачі даних датчиків), отримають дані власним унікальним способом, потім перетворять їх у об'єкт JSON (DTO) та відправляють їх до брокера повідомлень. Тоді споживачі повідомлень точно знатимуть, як читати повідомлення сенсорних даних.

Проблема полягає в тому, що я використовую той самий DTO у кількох різних сервісах. Оновлення має бути здійснено у кількох місцях. Очевидно, ми розробили це таким чином, що декілька зайвих чи відсутніх полів у DTO тут, і проблем не буде багато, поки служби не оновлюються, але це все одно клопоче мене і змушує мене відчувати, що я зробити помилку. Це може легко перетворитися на головний біль.

Невже я не буду робити архітектуру системи? Якщо ні, то які способи навколо цього чи хоча б полегшити мої турботи?


Яким DTO ви надаєте спільний доступ і яким протоколом ви користуєтесь між службами? Наприклад, добре поділитися, наприклад, protoфайлом для gRPC або avroсхемою для Kafka та генерувати DTO в обох службах, але я б не поділив спільну бібліотеку між двома проектами.
Вінсент Савард

Зашифровані рядки JSON та AMQP. Я вважаю за краще не використовувати нічого, що стосується мови.
невістка

Відповіді:


38

Моя порада? Не діліться цими DTO серед програм у будь-якій бібліотеці. Або принаймні не робіть цього прямо зараз.

Я знаю, здається дуже протиінтуїтивно зрозумілим. Ви дублюєте код, правда? Але це не ділове правило, тому ви можете бути більш гнучкими.

Послуга, що надсилає DTO, повинна бути жорсткою у своєму договорі з повідомленнями, як API відпочинку. Сервіс не може змінити DTO таким чином, що може порушити інші служби, які вже використовують інформацію DTO.

Коли додається нове поле do DTO, ви оновлюєте лише інші служби, які споживають цей DTO, лише якщо їм потрібно нове поле. Інакше забудьте це. Використовуючи JSON як тип вмісту, ви маєте можливість створювати та надсилати нові атрибути без розривів коду служб, які не відображають ці нові поля у його фактичних версіях DTO.

Але якщо ця ситуація насправді турбує вас, ви можете дотримуватися Правила трьох :

При повторному використанні є два "Правила трьох": (a) Побудувати багаторазові компоненти, як компоненти для одноразового використання, втричі складніше; (b) компонент для багаторазового використання повинен бути випробуваний у трьох різних програмах, перш ніж він буде достатньо загальним прийняти в бібліотеку повторного використання.

Отже, спробуйте почекати ще трохи, перш ніж поділитися цим DTO між службами.


1
Дуже цінується. Це дійсно одне з небагатьох головних проблем, які я маю наперед. Недостатньо, щоб тримати мене вночі, але достатньо, щоб переживати за мене.
невістка

4
Скопійовані DTO (у різних та дуже незалежних службах) не порушують DRY. Це воно.
Laiv

3
Імовірно, тоді немає ніяких причин не копіювати вихідний код DTO безпосередньо з одного проекту в інший, як разова операція, хоча тоді будь-які частини, не потрібні в новому проекті, ймовірно, повинні бути видалені.
bdsl

1
Навіть цілий сервіс може бути видалений, не спричиняючи великих проблем у всій системі. В ідеалі.
Лаїв

4
Щоб уточнити суть відповіді, при розробці мікросервісів кожна служба повинна розвиватися так, ніби вони не знають про інші послуги, за винятком фактичних контрактів, які вона може вимагати.
Джонатан ван де Вен

12

Що стосується мікросервісів, то життєві цикли розвитку послуг також повинні бути незалежними. *

Різні SLDC та різні команди розробників

в реальній системі МС може бути декілька команд, що беруть участь у розвитку екосистеми, кожна з яких відповідає за одну чи кілька служб. У свою чергу, ці команди можуть розташовуватися в різних офісах, містах, країнах, планувати ... Можливо, вони навіть не знають один одного, що робить обмін знаннями або кодом дуже важким (якщо це можливо). Але це може бути дуже зручно, оскільки спільний код також передбачає своєрідне міркування щодо спільного використання, і слід пам’ятати щось важливе - те, що має сенс для конкретної команди, не повинно робити це для іншої команди. Наприклад, з огляду на Клієнта DTO , це може бути різним залежно від послуги, що відтворюється, оскільки клієнти трактуються (або сприймаються) по-різному від кожної послуги.

Різні потреби, різні технології

Ізольовані SLDC також дозволяють командам вибрати стек, який найкраще відповідає їх потребам. Введення DTO, реалізованих за певною технологією, обмежує можливість вибору команд.

DTO не є ні діловими правилами, ні договорами на послуги

Що таке насправді DTO? Звичайні об'єкти, які не мають іншої мети, крім переміщення даних з однієї сторони на іншу. Сумки геттерів та сетери. Це не те саме "знання", яке варто використовувати повторно, загалом тому, що його немає взагалі. Їх мінливість також робить їх поганими кандидатами на зв'язок.

На противагу тому, що заявив Дерік, сервіс повинен мати можливість змінювати свої DTO, не змушуючи при цьому змінювати інші служби. Служби повинні бути толерантними читачами, толерантними письменниками та невідповідними . В іншому випадку вони викликають з'єднання таким чином, що не має сенсу архітектуру служби. Ще раз, і всупереч відповіді Деріка, якщо для трьох служб потрібні саме ті самі DTO, ймовірно, щось пішло не так під час розкладання служб.

Різні справи, різні інтерпретації

Хоча між послугами можуть існувати (і будуть) наскрізні концепції, це не означає, що ми повинні нав'язувати канонічну модель, щоб змусити всі служби інтерпретувати їх однаково.

Вивчення проблеми

Скажімо, наша компанія має три відділи: обслуговування клієнтів , продаж та доставка . Скажіть, що кожен із цих випусків по одній або більше служб.

Служба підтримки клієнтів, завдяки своїй доменній мові , реалізує послуги навколо концепції клієнтів, де клієнтами є особи . Наприклад, клієнтів моделюють як ім'я , прізвище , вік , стать , електронну пошту , телефон тощо.

Тепер скажіть, що продаж та доставка моделюють свої послуги відповідно до відповідних мов домену. У цих мовах клієнт- концепт виявляється занадто, але з тонкою різницею. До них, клієнти не є (обов'язково) людина . Для продажу , клієнти є номер документа кредитної картки і платіжний адреса , для Доставки в повне ім'я та адресу доставки теж.

Якщо ми змусимо продаж і доставку прийняти канонічну модель даних служби обслуговування клієнтів , ми змушуємо їх працювати з непотрібними даними, які можуть призвести до виникнення зайвих складностей, якщо їм доведеться підтримувати повне представництво та тримати дані клієнта в синхронізації з обслуговуванням клієнтів. .

Пов'язані посилання


* Ось де сильні сторони цієї архітектури


Дякую! Насправді тематичні дослідження допомогли мені визначити, чи слід ділити DTO, чи ні. Тепер я впевнений, чому я не хотів ними ділитися.
Ігор

8

Я намагаюся розробити кожну службу максимально незалежною

Вам слід публікувати події . Події - це певний тип повідомлень, які являють собою суцільний факт про те, що сталося в певний момент часу.

Кожна служба повинна нести чітко визначену відповідальність і нести відповідальність за публікацію подій, пов'язаних з цією відповідальністю.

Крім того, ви хочете, щоб ваші події представляли події, пов'язані з бізнесом, а не технічні. Наприклад, віддайте перевагу OrderCancelledподії перед OrderUpdatedс status: "CANCELLED".

Таким чином, коли сервісу потрібно реагувати на скасоване замовлення, воно просто повинне прослухати саме той тип повідомлення, який містить лише дані, що стосуються цієї події. Наприклад, OrderCancelledмабуть, просто потрібна order_id. Незалежно від того, яка служба повинна реагувати на це, вона вже зберігала все, що потрібно знати про замовлення у власному сховищі даних.

Але якщо в службі були лише OrderUpdatedподії для прослуховування, то вона повинна була б інтерпретувати потік подій, і тепер це залежало від наказу про доставку, щоб правильно укласти, коли замовлення скасовано.

У вашому випадку, однак, як ваші публікують дані датчика, це може мати сенс мати служби, слухати події і публікувати новий потік «бізнес - події», наприклад TemperatureThresholdExceeded, TemperatureStabilised.

І будьте уважні до створення занадто багато мікросервісів. Мікросервіси можуть бути чудовим способом інкапсуляції складності, але якщо ви не виявите відповідних меж обслуговування, ваша складність полягає в інтеграції послуг. І це кошмар, який потрібно підтримувати.

Краще мати занадто мало, занадто великі сервіси, ніж мати занадто багато, занадто малі послуги.


Я однозначно згоден. Дані датчика надходять прямо в мікросервіс, який аналізує повідомлення та перетворює його у формат, погоджений для всієї організації, перш ніж публікувати його брокеру. У нас будуть деякі сервіси, які читають повідомлення та зберігають його у базі даних, а також інші, які виконують аналіз повідомлення та роблять свою справу. Кожна послуга, за своєю природою бізнесу, не має нічого спільного, що призводить до (сподіваємось) досить простих послуг.
невістка

2
@ Nickdb93 - У вашому випадку, коли ви публікуєте дані датчиків, може бути сенс мати послугу, прослухати події та опублікувати новий потік "ділових подій", наприклад, TemperatureThresholdExceeded, TemperatureStabilised. (додано у відповідь)
Піт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.