How to serve requests: encapsulation vs. efficiency

Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

How to serve requests: encapsulation vs. efficiency

Post by Palych »

Имеется куча микросервисов. Они разбросаны по всей стране и вызываются из разных гуев и проч.
Многие из них для запроса требуют справочную информацию, хранящуюся на других сервисах.
Получаются целые деревья: чтобы вызвать сервис A нужно вызвать сервис B, а для него - сервис C...
Над всем этим строят сервисы-агрегаторы, которые вызывают весь этот зоопарк "со смыслом", стараясь сделать вызовы проще:
типа клиент вызывает сервис A, а мы делаем всю грязную работу...
При этом клиент редко вызывает один агрегированный сервис: от плетет свои сети из вызовов, агрегируя агрегированные сервисы в мега конгломераты...
В итоге забота о клиенте часто выходит боком: агрегированные вызовы работают медленно.
Кроме всего прочего время тратится на многократный lookup справочной информации: клиент вызывает один агрегированный сервис, внутри ищется информация, затем вызывается другой сервис, для него ищется та же, или пересекающаяся информация.
Иными словами: на один вызов большого, агрегированного сервиса некоторые "листовые" сервисы этого дерева могут быть вызваны несколько раз.

Вопрос: есть ли какое-то фундаментальное и всеобъемлющее решение этой проблемы?
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Извиняюсь если говорю глупости...
А как сейчас в базах данных, ORM решается проблема (как мне кажется - похожая) справочных таблиц,
когда строится развесистое дерево из таблиц, чтобы на вынимать одну таблицу несколько раз?
User avatar
Vladimir Kr.
Уже с Приветом
Posts: 572
Joined: 24 Mar 2004 07:31
Location: Krasnoyrsk -> -> Chicago

Re: How to serve requests: encapsulation vs. efficiency

Post by Vladimir Kr. »

welcome to microservice antipatern!
microservice + сервисы-агрегаторы ---> performance? really?
зато имеем independent development, etc!

нет проблем join SQL сколько нyжно раз, особенно небольших справочных таблиц.

по поводу решения - cache call, поможет некоторое время, но в итоге все будет сложнее чем monolitic app.
фундаментальное решение - a не надо multiservices replace with microservices.

сеичас придyт и скажyт, что performance optimization ето не главное в microservices.
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Vladimir Kr. wrote: 18 Aug 2017 18:12 welcome to microservice antipatern!
microservice + сервисы-агрегаторы ---> performance? really?
зато имеем independent development, etc!

нет проблем join SQL сколько нyжно раз, особенно небольших справочных таблиц.

по поводу решения - cache call, поможет некоторое время, но в итоге все будет сложнее чем monolitic app.
фундаментальное решение - a не надо multiservices replace with microservices.

сеичас придyт и скажyт, что performance optimization ето не главное в microservices.
Спасибо за мысли!
Читал, думал.

Про SQL join понятно, тут я затупил: Базы вынимают данные из одного места (гусары молчать!), добавить колонку-другую на скорость особо не повлияет.

Фундаментальное решение к сожалению не подойдет: microservices были там изначально, изменить это можно только уничтожив систему вместе с конторой.

Cache как таковой тоже не подойдет: данные (как минимум в некоторых use cases) нужны "живые".
"Кэширование" возможно (и даже необходимо) в рамках запроса(транзакции), самого "верхнего" запроса...

У меня есть мысль: "вывернуть" запросы наизнанку... Как-нибудь изложу подробнее...
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Стало быть: имеем микросервисы, хранящие кусочки мозаики, и аггрегирующие сервисы, которые инкапсулируют некое Знание о том как собирать Картину Бытия из микросервисов.

Идея такая: А ну как вместо больших сервисов выкладывать некие "скрипты", описание Картины бытия на некотором сакральном языке?

В качестве языка - тот же Javascript...
User avatar
Vladimir Kr.
Уже с Приветом
Posts: 572
Joined: 24 Mar 2004 07:31
Location: Krasnoyrsk -> -> Chicago

Re: How to serve requests: encapsulation vs. efficiency

Post by Vladimir Kr. »

BPEL ?
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Vladimir Kr. wrote: 22 Aug 2017 18:19 BPEL ?
Спасибо!
Я про него смотрел как-то давно, надо будет копнуть глубже:
Хотелось бы видеть сям что-то типа монады, которая бы обращалась к REST сервису (желательно асинхронно), сохраняла результаты в некоем контексте, и если в другой раз нужны были данные из того же URL с тем же контекстом - мгновенно их возвращала...
User avatar
Vladimir Kr.
Уже с Приветом
Posts: 572
Joined: 24 Mar 2004 07:31
Location: Krasnoyrsk -> -> Chicago

Re: How to serve requests: encapsulation vs. efficiency

Post by Vladimir Kr. »

вы же сказали надо актуалные данные, и cache не поидет.
кто будет следит за cache i.e. synchronize, evict, etc?
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Vladimir Kr. wrote: 23 Aug 2017 19:37 вы же сказали надо актуалные данные, и cache не поидет.
кто будет следит за cache i.e. synchronize, evict, etc?
Контекст будет передаваться между участниками запроса.
Время жизни контекста - запрос на самом высоком уровне агрегации.
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

В общих чертах получается как-то так:
- клиент вызывает некий "meta service"
- с сервера приходит некий код в виде чего-то типа Promises, которые вызывают реальные сервисы.
- клиент может выполнить полученный код с некоторой "прослойкой" (библиотекой), которая подставляет параметры, адреса, пароли явки...
- А если клиент сам является "мета сервисом" - он соорудит более заковыристый Promise...

"Пусть безумная идея - не рубайте сгоряча..."
User avatar
katit
Уже с Приветом
Posts: 23960
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: How to serve requests: encapsulation vs. efficiency

Post by katit »

Выглядит как dependency injection with reusable objects. Как один раз копию получили так и будет она использоваться в контексте вызова
Лучше водки — хуже нет! ©
User avatar
Вячеслав Викторович
Уже с Приветом
Posts: 5738
Joined: 13 Feb 2016 18:50
Location: Кемерово

Re: How to serve requests: encapsulation vs. efficiency

Post by Вячеслав Викторович »

Palych wrote: 17 Aug 2017 01:53 Имеется куча микросервисов. Они разбросаны по всей стране и вызываются из разных гуев и проч.
Многие из них для запроса требуют справочную информацию, хранящуюся на других сервисах.
Получаются целые деревья: чтобы вызвать сервис A нужно вызвать сервис B, а для него - сервис C...
Над всем этим строят сервисы-агрегаторы, которые вызывают весь этот зоопарк "со смыслом", стараясь сделать вызовы проще:
типа клиент вызывает сервис A, а мы делаем всю грязную работу...
При этом клиент редко вызывает один агрегированный сервис: от плетет свои сети из вызовов, агрегируя агрегированные сервисы в мега конгломераты...
В итоге забота о клиенте часто выходит боком: агрегированные вызовы работают медленно.
Кроме всего прочего время тратится на многократный lookup справочной информации: клиент вызывает один агрегированный сервис, внутри ищется информация, затем вызывается другой сервис, для него ищется та же, или пересекающаяся информация.
Иными словами: на один вызов большого, агрегированного сервиса некоторые "листовые" сервисы этого дерева могут быть вызваны несколько раз.

Вопрос: есть ли какое-то фундаментальное и всеобъемлющее решение этой проблемы?
кэширование решает практически все проблемы. возможно и с прелоадом, там где это имеет смысл.
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: How to serve requests: encapsulation vs. efficiency

Post by Palych »

Вячеслав Викторович wrote: 06 Sep 2017 21:25 кэширование решает практически все проблемы. возможно и с прелоадом, там где это имеет смысл.
Кэширование может решить проблемы при двух условиях:
1. Одни и те же данные запрашиваются много раз.
2. Данные меняются "редко", т.е. п.1 выполняется между изменениями

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

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

Return to “Вопросы и новости IT”