Это вопрос проектирования микросервиса, который представляет собой упрощение реальной проблемы, которую я хотел бы решить.
Служба A имеет объекты, которые могут быть активными или неактивными.
[
{
id: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
name: "foo",
active: true
},
{
id: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
name: "bar",
active: false
},
{
id: "ef332044-9e66-4a0b-91ed-c16a2537e848",
name: "baz",
active: true
}
]
Сервис B имеет задания, связанные с объектами Сервиса A, и должен запускаться, только если объекты активны (согласно бизнес-правилу).
Вариант 1: СервисВ не хранит информацию о том, должны ли задания выполняться.
[
{
id: "39cf3321-34d1-4557-b1c4-ca628c191b92",
entityId: ""a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
start: "Thu Nov 29 2018 08:40:27 GMT-0800 (Pacific Standard Time)",
ended: null,
recurrence: "hourly"
},
{
id: "77296d22-564f-4289-8327-f23bceb1d400",
entityId: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
start: "Tu Nov 27 2018 15:56:01 GMT-0800 (Pacific Standard Time)",
ended: null,
recurrence: "hourly"
},
{
id: "2916a920-13a3-46f6-9ffd-d7629163924a",
entityId: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
start: "Wed April 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)",
ended: Thu April 01 2019 00:00:00 GMT-0800 (Pacific Standard Time),
recurrence: "daily"
},
]
Когда запланировано выполнение задания, оно проверяет
if Service A has j.entityId = true
run j
с использованием API-интерфейса службы А.
Вариант 2: Служба B хранит информацию о том, должна ли работа выполняться
[
{
id: "39cf3321-34d1-4557-b1c4-ca628c191b92",
entityId: ""a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
active: true,
start: "Thu Nov 29 2018 08:40:27 GMT-0800 (Pacific Standard Time)",
ended: null,
recurrence: "hourly"
},
{
id: "77296d22-564f-4289-8327-f23bceb1d400",
entityId: "a46e6cc7-97ca-4570-b3f3-2be00ca9dab5",
active: true,
start: "Tu Nov 27 2018 15:56:01 GMT-0800 (Pacific Standard Time)",
ended: null,
recurrence: "hourly"
},
{
id: "2916a920-13a3-46f6-9ffd-d7629163924a",
entityId: "eb1ced31-eccc-4ad6-a695-5c6c76cab7a5",
active: false,
start: "Wed April 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)",
ended: Thu April 01 2019 00:00:00 GMT-0800 (Pacific Standard Time),
recurrence: "daily"
},
]
Ее хранилище обновляется с помощью уведомления от Службы A:
Entity e changes => publish e => Service B updates accordingly
Вот аргументы, которые я вижу в пользу каждого варианта.
Аргументы варианта 1:
- Меньшая стоимость хранения, поскольку данные не дублируются
- Когда запланировано выполнение задания, оно всегда имеет самую свежую информацию о том, является ли онодолжен быть активным (больше «согласованности»?)
- Не нужно иметь дело со сложностью синхронизации данных между службами.В этом примере есть только Служба B, которая полагается на данные из A, но представьте себе сложность, если бы существовали службы X0, ..., X1000, которые все должны были знать, активен ли объект.
Аргументы варианта 2:
- Сервисы действительно независимы: если A не запущен, B все еще может запускать
- Меньше разговорных сервисов (меньше стоимость передачи по сети)
- Хотя, возможно, и более сложная, сложность дублирования / распространения данных вынуждает службы делиться ничем или небольшим