У нас есть конвейер обработки данных, по которому мы получаем данные из разных источников. Весь конвейер реализован с использованием архитектуры, управляемой событиями, и микросервисов. У одной из служб есть три отдельные задачи. Два из них являются общими для разных источников данных, но третья задача может немного измениться в зависимости от того, что является нашим источником данных. Например, для одного источника уникальная подпись может быть вычислена на основе filed1 и filed2, а для другого источника она может быть вычислена на основе field2 и field3. Как лучше всего реализовать этот сервис, чтобы он соответствовал принципам детализации микросервисов?
Мне пришло в голову три подхода:
1) Создайте единый сервис и используйте разные реализации для каждого источника (например, заводской шаблон проектирования). В зависимости от источника во время выполнения будет использоваться одна из реализаций.
Плюсы: Меньшее количество услуг. Меньше сложности
Минусы: поскольку служба будет совместно использоваться всеми источниками данных, при добавлении любого нового источника данных эту службу следует повторно развернуть, что создает неявную зависимость между этой службой и любой службой, отвечающей за сбор данных из источника.
2) Разделите эту службу на две службы, используйте одну для всех источников и повторно реализуйте извлеченную службу для каждого источника данных.
Плюсы: Нет зависимости между сборщиком и этими двумя сервисами. При добавлении нового источника необходимо реализовать новую службу, и не требуется повторно развертывать службы, связанные с другими источниками.
Минусы: больше услуг, и поскольку они будут слишком маленькими, мы можем столкнуться с проблемой наносервисов в будущем.
3) Не изменяйте степень детализации служб, а создавайте разные экземпляры службы во время выполнения. У каждого своя конфигурация, чтобы указать, какой набор полей будет использоваться для каждого источника. В этом случае код является общим, но экземпляры времени выполнения различаются в зависимости от того, к какому источнику он принадлежит.
Плюсы: меньшее количество услуг и отсутствие зависимости от операций.
Минусы: перенос сложности логики во время выполнения, что может усложнить развертывание и операции.