LINUX.ORG.RU

Микросервисы и rpc

 


0

1

Всем привет! Все время создавал монолитные приложения. Сейчас пытаюсь понять как реализовать микросервисное решение для тестовой задачи.

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

Пытаюсь сделать так,

Разбиваю этот модуль на такие сервисы, service_transform, service_load.

service_transform - Получает в качестве payload путь к файлу и имя. Данный сервис работает с указанным файлом преобразует его в нужный формат.

service_load - Получает данные ОТ сервиса service_transform и загружает их в БД.

Техническая реализация всей этой истории понятна. Но вот не понятно к реализовывать обмен данными между этими двумя сервисами? То есть как реализовать вот это «Получает данные ОТ сервиса service_transform» Всем спасибо!


Варианты разные: Web API (банально POST запросами отправляешь данные на обработку), Message Queue (например RabbitMQ, если у тебя твой 4 Гб блок данных можно на куски разбить и не нужно все вместе вставить), tcp сокеты.

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 1)

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

system-root ★★★★★
()
Ответ на: комментарий от system-root

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

ovosh
() автор топика
Ответ на: комментарий от ovosh

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

system-root ★★★★★
()
Ответ на: комментарий от ovosh

независимости

как? у тебя всего один сервис.
нет файла, service_transform ничего не делает — ничего не заливается в базу.
упал service_transform — ничего не заливается в базу.
упал service_load — ничего не заливается в базу.
обмазаться кешированием и поднимать всё в подах k8s на CoreOS с проверкой работоспособности. ага, осталось ещё всё на AWS перенести.
ради скрипта, который парсит файл. после такого на твою должность будут искать человека за 150к просто чтобы парсить сраный файл в базу.

system-root ★★★★★
()
Ответ на: комментарий от system-root

как? у тебя всего один сервис.

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

service_transform - преобразует указанный файл в нужный формат тем самым просто изменяя файл.

service_load - получает название файла который следует залить в БД.

Тогда можно назвать эти два сервиса - сервисами в рамках ETL компонента?

ovosh
() автор топика
Ответ на: комментарий от system-root

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

ovosh
() автор топика
Ответ на: комментарий от Norgat

Действительно, спасибо. Забыл про сокеты.

ovosh
() автор топика
Ответ на: комментарий от ovosh

сервисами в рамках ETL компонента

если тебе не в резюме хочется про это потом написать, я предлагаю такую штуку называть современным языком — data flow
как раз недавно упомянул apache nifi, вот представь, даже ничего не нужно изобретать или писать на питоне, такого рода программные комплексы уже очень широко распространены.
просто непрерывный поток данных из большого числа источников обрабатывается до нужной кондиции с возможностью ветвления и разных получателей.

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от system-root

Я слышал про Nifi, но тут дело не в том что бы реализовать и тем более не для резюме, тут скорее я для себя пытаюсь понять что делают микросервисы, как взаимодействуют, а выше пример из треда я привел как пример. Из твоего предпоследнего поста я понял лишь одно, отказаустойчивость (в теории CAP это «А») и меня интересует как добиться согласованности данных при возможности разделения этих двух независимых сервисов. Они то независимые! После Замечании что ты написал, теперь эти два сервиса решают каждый свою задачу. Ну как то так, тут я просто пытаюсь вкурить тонны прочитанных статей от умных людей, так что спасибо за любую помощь.

ovosh
() автор топика
Ответ на: комментарий от ovosh

ок, у тебя есть некие файлы, которые ты изменяешь и потом изменённые данные нужно записать в БД.
не зависимо от того сколько у тебя файлов, очевидно, что будет не прикольно, если service_transform помрёт и начнёт парсить файл по новой.
значит что? кеширование, очередь, что угодно.
первое что приходит из простого — Elasticsearch, но это для примера.
service_transform или его треды, парсят файл и кладут в очередь\кеш Elasticsearch, при падении каким-то образом начинают с того места, где померли.
service_load читает из Elasticsearch и пишет в базу.
всё, эластик имеет несколько нод для высокой доступности.
вжух и у нас что-то отказоустойчивое просто добавлением очереди, не важно каким образом эту очередь реализовать.
осталось реализовать, чтобы сами python скрипты поднимались, какой нибудь гипервизор, например скрипт в кроне, не важно.

system-root ★★★★★
()

например очищенные данные записываешь рядом (или в /tmp) с именем «${path}/.${filename}.tidy» (или генерируешь новый файл во временном каталоге) и передаешь сервису

load
хоть через командную строку (в самом сервисе load реализуешь режимы запуска в качестве демона (сервиса) и режим передачи параметров конфигурации или посылки сообщений):

$ python -m load_service --daemon
$ python -m load_service --post "{\"data\": \"/tmp/<UNIQUE-FILE-NAME>.tmp\"}"

- вторую команду вызываешь из сервиса

transform
элементарно через system

anonymous
()
Ответ на: комментарий от makoven

Да спасибо, но как то все замудренно у него.

ovosh
() автор топика

Кстати, давно хочу спросить, а что за штуковину назвали «микросервисами», которой не было еще лет 15 назад? Что-то я не припомню такого модного словечка в те времена. Может кто популярно объяснить, что это привносит нового в сайтостроение?

dave ★★★★★
()
Ответ на: комментарий от dave

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

anonymous
()
Ответ на: комментарий от anonymous

ну, с чем-то похожим сталкивался, только там был кластер на основе akka, и мы не называли микросервисами

dave ★★★★★
()

А зачем вместо одной тяжёлой операции ты хочешь сделать две?

ya-betmen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.