LINUX.ORG.RU

На чем и как вы бы делали систему?

 


2

5

Ситуация следующая: есть написанный proof of concept системы, работает достаточно стабильно для того, чтобы за него можно было посадить специалистов предметников и собирать с них отзывы и предложения по работе системы. Соответственно у меня появилось время подумать над дальнейшей архитектурой и возможно что и переписать некоторые куски.

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

Как сделано сейчас: Написано все на яве. Данные от приборов собираются одним процессом и пихаются в apache kafka. Основной процесс данные оттуда собирает, сохраняет в субд (mongodb) и если надо - распихивает по клиентам через вебсокеты. Так же основной процесс держит кучу rest сервисов, через которые работает веб-клиент и возможно что в дальнейшем - приложения под андроид/иос/винду. Все вычисленное состояние по процессам хранится в zookeeper-e, что в теории дает отказоустойчивость и возможность параллельного запуска нескольких сервисов на разных машинах.

Что напрягает и хочется переделать:

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

2 - Кафка. Довольно капризное поделие с неплохой идеей, но вот реализация имхо хромает. Ловил ситуации конфликтов в zk на ровном и не очень месте, проблемы с переподключением consumer-a после разрыва связи и много чего еще. Плюс она требует наличия еще и отдельного zk, т.е. система получается довольно монструозной, минимум 4 отдельных процесса (получатель данных, кафка, zookeeper, основной сервер) + субд. А это сложности с развертыванием, поддержкой итд.

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

Собственно вопрос - как бы вы сами писали такую систему?

★★★★
Ответ на: комментарий от ya-betmen

Обычно такое решается масштабированием: спереди вебсервис (можно жсон) за ним балансер, за ним какой нить ЖМС, а потом со всех инстансов выгребаем данные: можно сложить их куда-нить, можно прямо из жмс, можно сразу пихать в БД (реплику). Вебсервис естественно опционален, но http в некотором роде проще в балансировке.

Оно примерно так сейчас и решается. Драйвера постят данные в веб-сервис в виде json-a, он их раскидывает по разным очередям внутри кафки, сервер оттуда выгребает и пихает в базу (либо напрямую в веб-сокет, если сохранять не надо). Вопрос в том, что а) кафака довольно капризная и б) довольно монструозная

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

если бы я узнал, что мой подчиненный,

Потом такие «руководители» тут в Jobs пишут «согласен работать за еду, хнык, хнык»

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

Ну в кафке основные фичи две - partitioning и свободное чтение всей очереди без семантики доставки. Вам это сильно надо? Очередь ActiveMQ умеет 40000 сообщений в секунду на одной машине в среднем на практике если сообщения не большие. Если у вас есть особо буйные сервисы, то для них может быть отдельная очередь с агрегацией.

vertexua ★★★★★
()

Тут есть ограничение по описанию процессов по моему. Многие состояния в медицине имеют кучу инвариантов и прописывать всю эту логику вручную «жаба цыцки даст».

База тут должна быть сразу графовая с резолвером довычисляющим что произошло и как оно ещё называется и прописанной логикой состояния отслеживаемого. Типа Virtuoso + Sezame + Jena

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

занимается отслеживанием состояния пациента в ходе некоторого процесса (реанимации
Написано все на яве

Вот, блин, а потом врачи - убийцы.

И на чем такое писать еще? На сях, чтобы врачи не убийцы долго втыкали в надпись: «sorry, у нас тут сервер сегфолт словил»?

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

Оно примерно так сейчас и решается. Драйвера постят данные в веб-сервис в виде json-a, он их раскидывает по разным очередям внутри кафки

Очереди у тебя могут быть не внутри кафки а снаружи, и при этом без кафки. Минусы: сложнее конфигурять/деплоить, плюсы: нет глюков кафки, можно сконфигурять так как нужно тебе, а имплементации взаимозаменяемы (большей частью).

довольно монструозная

Чудес не бывает, скорее всего это оптимальное решение для твоей задачи (лично я решал бы её именно так), но оно всегда будет монструозным.

ya-betmen ★★★★★
()
Ответ на: комментарий от Nagwal

Будто бы получение инфы про остановку сердца на час позже самой остановки чем-то лучше.

сегфолт

Мифы ынтырпрайзников?

entefeed ☆☆☆
()
Ответ на: комментарий от Nagwal

Кстати, в рамках эксперимента можешь Го попробовать. Не такая прожорливая тормозилка, и без сегфолтов. Тебе как раз сервер надо, го для этого самое оно.

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

Потом такие «руководители» тут в Jobs пишут «согласен работать за еду, хнык, хнык»

Руководители, которые ищут работу тут в Jobs другого и не заслуживают.

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

Ну в кафке основные фичи две - partitioning и свободное чтение всей очереди без семантики доставки. Вам это сильно надо?

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

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

Будто бы получение инфы про остановку сердца на час позже самой остановки чем-то лучше.

Мифы жабоненавистников? Еще раз - задержки в пару секунд для этой системы вполне допустимы. А на час gc никогда систему раком не поставит.

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

Мифы

Томми помнишь?

жабоненавистников

Тут ты угадал.

entefeed ☆☆☆
()
Ответ на: комментарий от Nagwal

Ну по опыту могу сказать что солянка из нескольких систем и библиотек - сильно снижает «контроль» над кодом.

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

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

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

Ох, вот чего точно не хочется - так это возиться с чужими трупами. А чем та же акка плоха?

акку я не ковырял, но она на скале, и если придется лезть в ее код то это уже «завесит» квалифицированных кадров вашей команды. С другой стороны если нужно просто неблокирующий обмен сообщениями то вот есть же простые реализации - чем проще тем меньше багов, а те что есть проще исправить => лучше контроль над кодом.

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

всей очереди без семантики доставки.

С семантикой at least once. Сценарии нарушения семантики описаны в документации. Точнее сценарий тут только один — одновременное падение всех реплик.

Очередь ActiveMQ умеет 40000 сообщений в секунду на одной машине в среднем на практике если сообщения не большие.

А если эти сообщения никто не читает, то куда они деваются?

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

Тут есть ограничение по описанию процессов по моему. Многие состояния в медицине имеют кучу инвариантов и прописывать всю эту логику вручную «жаба цыцки даст».

Мы же не сппр для медицины пишем, нет там особых инвариантов. Основное что система должна считать - это баланс жидкости с группами этих жидкостей (влили литр физраствора и 0.5 литра эритроцитарной массы, вылилось 0.7 литра в виде диуреза + потеряли 0.3 литра при разрезах. Баланс +0.5 литра. Если совсем упрощать для примера). Плюс суммарные дозы по препаратам. И в довесок учет расходников и учет наркотиков.

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

вообще если тупо строить гарфики по «логам» с датчиков то есть всякие жирные kibana - но это опять пальцем в небо

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

без всяких алгоритмов восстановления состояния после падения

В кафке нет алгоритмов восстановления после полного падения (все процессы прибили девяткой или питание кластера дернули). Мы в отделе уже больше года думаем что с этим делать и как с этим жить. Пока живем с тем, что чекпоинты скидываем раз в 300ms и кафку строжайше запрещено перезапускать (из init-скриптов выпилены restart и stop во избежании проблем).

Reset ★★★★★
()
Ответ на: комментарий от ya-betmen

Очереди у тебя могут быть не внутри кафки а снаружи, и при этом без кафки

То есть каждый клиент должен сам велосипедить себе очередь? А если клиент навернулся и лежал полдня, то где потом ему брать данные?

Reset ★★★★★
()
Ответ на: комментарий от ya-betmen

Обычно такое решается масштабированием

Если много датчиков и все летит в базу то это обычно решается вообще без MQ

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

А так, складывается впечатление, что ТС ждет того, что заказчикам предоставляется в виде документов под названием vision или high-level architecture при выполнении обследования объекта автоматизации

У ТС-а выходной, который совершенно нечем занять. Почему бы не потрепаться на техническом форме по интересующей теме? Естественно я не жду, что мне тут technical blueprint в готовом виде выкатят.

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

Конечно нет. Заменить на реляционную БД пока не поздно.

А на какие грабли с монгой приходилось наступать, помимо поддержки целостности данных?

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

Вообще тайминги на кафке получаются ооооочень хорошие. Вот смотрю сейчас на свою систему, на показатели одно из rt-потребителей: <= 1sec - 91%, <= 3sec - 8%, <= 7sec << 1%, <= 15sec << 1%, остальное = 0%. Это с учетом зеркалирования между различными кластерами кафки.

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

То есть каждый клиент должен сам велосипедить себе очередь? А если клиент навернулся и лежал полдня, то где потом ему брать данные?

Кто такой «клиент» в этом случае?

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

У ТС-а выходной, который совершенно нечем занять.

Не принимайте мое мнение слишком всерьез, т.к. оно очень специфическое.

Тем не менее, в области сбора данных уже есть устоявшиеся подходы. Например, от совсем простых, вроде MQTT, до более навороченных, вроде DDS. Аналогично, есть решения, отвечающие за хранение измерительной информации.

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

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

когда разработчики просто не предусмотрели точку расширения (привет spring!).

А со спрингом то что не так в плане точек расширяемости? Там вроде практически во все можно влезть без особых костылей.

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

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

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

Хм, любопытно. Ну вообще, если дернули питание у всего кластера - то это уж совсем звиздец. А она кстати в этом случае не теряет каких-то данных из того, что уже было записано?

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

Если много датчиков и все летит в базу то это обычно решается вообще без MQ

Если нет возможности процессить данные быстрее чем они поступают то без очереди обойтись не выйдет. Городить очередь на клиенте та ещё радость.

ya-betmen ★★★★★
()
Ответ на: комментарий от Nagwal

А со спрингом то что не так в плане точек расширяемости? Там вроде практически во все можно влезть без особых костылей.

Все что стандартно, а например подсунуть свою ConnectionFactory в AmqpAppender или заюзать JPA в AclService.

Deleted
()
Ответ на: комментарий от ya-betmen

Если нет возможности процессить данные быстрее чем они поступают то без очереди обойтись не выйдет. Городить очередь на клиенте та ещё радость.

Тут концептуальный вопрос в том что если ты их не успеваешь обрабатывать то и никогда не успеешь, да.

Очередь позволяет лишь сглаживать пики и пережить перезагрузку слушателей.

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

обычных pc, стоящих под столом

Ну надежность обычно как раз и не достигают железом и нормальный софт должен работать на любом говне (man Google). Просто Kafka - не обязательно лучший способ достижения надежности, машстабированости - может, но по надежности ActiveMQ тоже норм

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

А она кстати в этом случае не теряет каких-то данных из того, что уже было записано?

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

Проблема с рестартом в другом. В кафке есть такое понятие как highwatermark это номер последнего сохраненного сообщения. Так вот, эти вотермарки пишутся асинхронно по отношению к данным и ничего с этим поделать нельзя. При старте всё что записано после вотремарка считается не валидным и дропается.

Также в кафке оригинально сделан «выбор» лидера. Алгоритм называется «кто первый встал, того и тапки». То есть, если на реплике 1 сообщения от 0 до 100, а на второй от 0 до 1000 и при этом стартует первой реплика 1, то она автоматически становится лидером, реплика 2 при этом считает, что всё что записано после максимального сообщения лидера не валидно и дропает.

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

Да нету там никакой семантики, сам клиент же вроде читает что хочет в любое время и Kafka серверу похрен что он считает consumed, а что нет. Ну а потом через установленое количество времени очереди подчищают совсем старые давные.

Конечно там вроде был какой-то high level consumer через zk, но это ерунда

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

Да нету там никакой семантики

Ты документацию читал?

сам клиент же вроде читает что хочет в любое время

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

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

Ну надежность обычно как раз и не достигают железом и нормальный софт должен работать на любом говне (man Google). Просто Kafka - не обязательно лучший способ достижения надежности, машстабированости - может, но по надежности ActiveMQ тоже норм

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

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

Очередь позволяет лишь сглаживать пики и пережить перезагрузку слушателей.

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

ya-betmen ★★★★★
()
Ответ на: комментарий от Reset

Также в кафке оригинально сделан «выбор» лидера. Алгоритм называется «кто первый встал, того и тапки». То есть, если на реплике 1 сообщения от 0 до 100, а на второй от 0 до 1000 и при этом стартует первой реплика 1, то она автоматически становится лидером, реплика 2 при этом считает, что всё что записано после максимального сообщения лидера не валидно и дропает.

Угу, ясно. Вот это уже хреново если честно. Потому что если с задержками данных еще вполне можно жить, т.е. те самые 99% <= 7sec. это терпимо, то вот с потерями уже хуже.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от ya-betmen

но я исхожу из предположения что раз оно уже притащено то нужно

Кафка в проекте появилась ради

а) обеспечения надежности, чтобы данные не терялись при отцеплении consumer-ов

б) для сглаживания пиков в сообщениях.

тем более что автор никаких количественных данных не привёл, что б можно было решит вопрос нужности какфки в принципе.

Я там где-то выше по треду писал - нормальная пропускная способность системы около 200 msgs/sec примерно по килобайту в среднем. Но могут быть пики. И, в теории, могут быть сообщения гораздо тяжелее.

Насколько оправдано использование именно кафки, а не другого MQ в данном случае - фиг знает. Как и монга, она перекочевала из предыдущего проекта, для более быстрого запуска прототипа.

Nagwal ★★★★
() автор топика

Выкинуть монгу, кафку и зукипер. Для мастер датесет базы использовать cassandra - эта база как раз зарекомендовала себя как хранилище всяких показаний от датчиков, просмотров баннеров и тому подобного. Для справочников и стуктурированной инфы использовать постгрес. Если хочется отказоустойчивости, то между аппликухой и постгром можно поставить imdb вроде hazelcast.

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

Как я понимаю предложение сводится к тому, чтобы для сглаживания пиков и отказоустойчивости писать данные сначала в hazelcast, а уже оттуда в базу? И выкинуть нафиг очереди вообще. Правильно?

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

В документации написано, что at least once нарушается при падении всех реплик, не уточняют, что на столько жестко нарушается :)

Вообще стоит посмотреть на опцию unclean.leader.election.enable=false (дефолт стоит в true). В 0.8.1 эта опция работала довольно странно и приводила к неработоспособности кластера, но есть вероятность, что в 0.8.2 опция работает ожидаемо.

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

Прочитал бегло про hazelcast (раньше дела с ним не имел, только слышал). Выглядит крайне интересно. Приходилось с ним дело иметь? Какие подводные камни, которых на первый взгляд не видно?

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

Да такие же как и со всеми кластерами - в первом приближении они тупо не работают :) Надо долго и муторно тюнить. А так, при первой же нагрузке все развалится.

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

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

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

Это должно быть как доверительный интервал в терминах математической статистики. Там есть конкретные цифры, кажется >=0.9 (не вспомню сейчас, вроде как для лекарств)

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

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

Это связано именно со спецификой системы. Она по большому счету только дублирует существующие, являясь именно агрегатором. Мы же не заменяем аппарат ИВЛ или прикроватный монитор. Только снимаем с них данные и выводим в удобном виде за нужный период, наложенные друг на друга. Т.е. понятно что чем надежнее она будет - тем лучше. Но в принципе, если даже она отрубится из-за технического сбоя, это не приведет ни к чъей смерти, а только добавит лишней головной боли врачам, которые на период падения вынуждены будут вернутся к беготне между приборами и записям на бумажке.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от lisper-pipisper

Средняя температура по больнице?

ну например «дали жаропонижающее»==«дали аспирин» (чего было то и дали)

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

Мы же не сппр для медицины пишем, нет там особых инвариантов. Основное что система должна считать - это баланс жидкости с группами этих жидкостей (влили литр физраствора и 0.5 литра эритроцитарной массы, вылилось 0.7 литра в виде диуреза + потеряли 0.3 литра при разрезах. Баланс +0.5 литра. Если совсем упрощать для примера). Плюс суммарные дозы по препаратам. И в довесок учет расходников и учет наркотиков.

ну а сколько с дыханием и потоотделением потерял (раз длительные процессы заявлены)? короче не взвесишь не узнаешь :)

а лекарственная совместимость и взаимодействие препаратов вообще пестня (причем всё время новая :).

да и лекарства имеют период полувыведения и всякие биоусвоения. без полноценной модели http://en.wikipedia.org/wiki/Physiologically_based_pharmacokinetic_modelling

PS а «на глазок», так лей, меряя давление в подключичке, и будет квантум сатис :)

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

ну а сколько с дыханием и потоотделением потерял (раз длительные процессы заявлены)? короче не взвесишь не узнаешь :)

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

а лекарственная совместимость и взаимодействие препаратов вообще пестня (причем всё время новая :).

Которая пока остается на совести анестезиолога и врача реаниматолога. Возможно когда нибудь в будущем это и будет добавлено в систему, но явно не на первом этапе.

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