Дифференцируйте логику микросервиса по конфигурации или новой службе

У нас есть конвейер обработки данных, по которому мы получаем данные из разных источников. Весь конвейер реализован с использованием архитектуры, управляемой событиями, и микросервисов. У одной из служб есть три отдельные задачи. Два из них являются общими для разных источников данных, но третья задача может немного измениться в зависимости от того, что является нашим источником данных. Например, для одного источника уникальная подпись может быть вычислена на основе filed1 и filed2, а для другого источника она может быть вычислена на основе field2 и field3. Как лучше всего реализовать этот сервис, чтобы он соответствовал принципам детализации микросервисов?

Мне пришло в голову три подхода:

1) Создайте единый сервис и используйте разные реализации для каждого источника (например, заводской шаблон проектирования). В зависимости от источника во время выполнения будет использоваться одна из реализаций.

Плюсы: Меньшее количество услуг. Меньше сложности

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

2) Разделите эту службу на две службы, используйте одну для всех источников и повторно реализуйте извлеченную службу для каждого источника данных.

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

Минусы: больше услуг, и поскольку они будут слишком маленькими, мы можем столкнуться с проблемой наносервисов в будущем.

3) Не изменяйте степень детализации служб, а создавайте разные экземпляры службы во время выполнения. У каждого своя конфигурация, чтобы указать, какой набор полей будет использоваться для каждого источника. В этом случае код является общим, но экземпляры времени выполнения различаются в зависимости от того, к какому источнику он принадлежит.

Плюсы: меньшее количество услуг и отсутствие зависимости от операций.

Минусы: перенос сложности логики во время выполнения, что может усложнить развертывание и операции.


person Ali    schedule 13.03.2019    source источник
comment
Приняли ли вы во внимание масштабируемость, критичность каждой службы, частоту смены новой службы и т. Д.? Обычно эти NFR помогают определить, нужно ли вам создать службу или повторно использовать существующую (флаги конфигурации / функций)   -  person Amin Abu-Taleb    schedule 13.03.2019
comment
@ АминАбу-Талеб Да. Технически частота изменений является основным отличием здесь, поскольку, добавляя новый источник, нам нужно изменить эту услугу, на которую влияет решение 1.   -  person Ali    schedule 13.03.2019
comment
есть ли возможность построить динамический обработчик правил? Я столкнулся с подобной проблемой при построении системы купонов. Кстати, я считаю, что второй вариант неразумный в корпоративной архитектуре.   -  person wl.GIG    schedule 29.03.2019
comment
@ wl.GIG Что вы подразумеваете под динамическим обработчиком правил?   -  person Ali    schedule 29.03.2019
comment
@Alin как общий обработчик для всех источников данных с входными параметрами, такими как [columns: {as, bb, ...}, crypto: xxxxx]   -  person wl.GIG    schedule 29.03.2019
comment
@ wl.GIG Разве это не решение 3?   -  person Ali    schedule 29.03.2019
comment
@Alin это своего рода орудие для s3   -  person wl.GIG    schedule 29.03.2019
comment
@ wl.GIG Мой вопрос не в том, как это реализовать. Это какое решение на высоком уровне и почему.   -  person Ali    schedule 29.03.2019
comment
Сколько разных конфигураций вы ожидаете? Возможно ли, что вы в какой-то момент не справитесь с решением 3?   -  person Nestor Sokil    schedule 30.03.2019
comment
@NestorSokil Я не могу предсказать. Сейчас 7-8 разных версий, но в будущем может быть 50.   -  person Ali    schedule 31.03.2019
comment
@Alin, и эти задания по обработке используют события из разных тем или из одной темы + из разных групп? Какого брокера вы используете?   -  person Nestor Sokil    schedule 31.03.2019
comment
@NestorSokil Как его спроектировать - решать нам. Это может быть одна тема или несколько тем. Мы используем Кафку.   -  person Ali    schedule 31.03.2019


Ответы (3)


Я согласен с Адрианом, это зависит от вашей ситуации.

Я думаю, что наиболее важным является сложность системы - она ​​играет решающую роль в тестировании, поддержке и развитии системы. (ЦЕЛОВАТЬ)

Так что я думаю, что лучший вариант - 2.

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

person A Ralkov    schedule 12.04.2019

Это зависит. К вашему сведению, я знаю о Кафке, но не имею в этом опыта.

Для варианта 3: насколько развита ваша способность управлять различными экземплярами решения с разной конфигурацией? Сколько было бы экземпляров? Как бы вы могли наблюдать за здоровьем, поведением и производительностью всех экземпляров?

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

Для варианта 1: будет более сложным с точки зрения разработки и по-прежнему будет иметь некоторую сложность для операций. Причина этого будет зависеть от того, как решение настроено на распознавание того, какую реализацию использовать во время выполнения. Подход IOC будет работать, но это все еще конфигурация, которой нужно управлять.

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

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

Обновление - вариант 2

Это означает наличие нескольких сервисов для обработки одних запросов (но не других), поэтому теперь вам нужно управлять как потоком между сервисами (во время выполнения), так и взаимозависимостями между ними (во время разработки, во время развертывания); труднее проверить.

Частично микросервисы связаны с независимыми сервисами - второй вариант на самом деле не является встроенным в этот этос - и это нормально, просто поймите, что это не совсем микросервис, в зависимости от того, насколько вы разбираетесь в таких вещах.

person Adrian K    schedule 01.04.2019
comment
Что вы думаете о варианте 2? - person Ali; 10.04.2019

Я думаю, что меня больше всего беспокоит тип результатов, которые производят услуги. Если (для всех трех вариантов) результатом процесса будет один и тот же тип (или объект домена), я, безусловно, предпочту Вариант 1.

Это согласуется с принципом «слабой связи, связного поведения», о котором Сэм Ньюман писал в своей статье книга.

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

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

Что касается разных источников, я бы сказал, что это нормально, если они будут использоваться одной службой. Есть довольно много возможностей спроектировать его удобным для обслуживания способом внутри реализации сервиса. Какая задача должна быть выбрана источником - это деталь реализации, которая должна быть скрыта от потребителей.

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

Эта служба действительно будет зависеть от производителя, потому что она ему нужна как источник. Это невозможно обойти. То же самое в некоторой степени верно и для всех других вариантов. Но зависимость такова: потребитель зависит от производителя, а не наоборот!

person sschrass    schedule 12.07.2019