
Dmitry
20.02.2017
12:12:05
не помню, может даже по исчерпанию памяти

Quet
20.02.2017
12:13:23
это на каком количестве эндпоинтов такое?

Dmitry
20.02.2017
12:14:33
тут вообще должны быть непосредственные наблюдатели этого явления, но что-то в районе сотни - другой, кажется

Misha
20.02.2017
12:56:19
а вот кстати интересно как оно там внутри устроено и насколько эффективный там роутинг для большого количества эндпоинтов

Google

Misha
20.02.2017
12:57:06
не думаю, что они там суффиксное дерево на типах написали или типа того
хотя вдруг и написали, конечно

Dmitry
20.02.2017
12:59:48
префиксное
написали

Misha
20.02.2017
13:00:03
круто

Dmitry
20.02.2017
13:00:13
не знаю в какой версии оно появилось, но несколько месяцев или с полгода как было объявление. по моему уже в "продакшоне"

Misha
20.02.2017
13:01:29
https://github.com/haskell-servant/servant-benchmarks/blob/master/benchmarks/Routes.hs
как раз сто ендпоинтов
не падает наверное

Quet
20.02.2017
13:02:29

Dmitry
20.02.2017
13:02:37
но вообще видится здравой идея пилить все на микросервисы, число эндпойнтов в которых не вылазит за сотню

Misha
20.02.2017
13:02:38
хотя вырожденный случай

Quet
20.02.2017
13:03:17

Google

Misha
20.02.2017
13:34:11
а как решать задачу с апдейтами "по узлам" в таких микросервисах? если у меня есть 10 микросервисов, какие-то из общаются сервантом по http друг с другом, то понятно, мне удобнее type Api = ... держать общим для каждой пары клиент/сервер. Но как тогда апдейтить клиента/сервера и не ломать API? В обычной ситуации спасает как раз нестрогость и то, что это json, а как быть с сервантом?
"то, что это json" = "любой текстовый формат, позволяющий пропускать поля"

Dmitry
20.02.2017
13:35:51
фиг знает, поставить перед ними nginx, сет нод поднять на других портах ,передернуть nginx, старые ноды загасить
назвать модным словом "оркестрация"

Misha
20.02.2017
13:36:49
immutable infrastructure, да

Dmitry
20.02.2017
13:38:35
можно еще более наркомански
все эти ноды форкаются одним жирным процессом
который гасим и поднимаем новую версию
впрочем, не исключено что systemd предлагает что уже готовое для этой задачи

Misha
20.02.2017
13:40:20
можно, но тогда весь кластер ляжет на некоторое время
а надо-то чтоб без даунтайма
иначе нафига микросервисы городить

Dmitry
20.02.2017
13:41:50
что бы ghc не валился и не тормозил слишком сильно на компиляции серванта же

Misha
20.02.2017
13:42:26
хм
ну разве что

Dmitry
20.02.2017
13:43:45
ну т.е проблема согласованного апдейта и поддержания консистентности наверняка касается не только серванта
и для её решения есть же какие-то стратегии в зависимости от требований
если есть обратная совместимость например и две ноды с разными версиями апи могут работать параллельно
то почему бы не поднять сразу и старые и новые, если у нас есть LB
и старые постепенно отстреливать?

Google

Misha
20.02.2017
13:48:46
угу, как-то так
и возможно две версии type Api = ... на какой-то время дердать
держать

Dmitry
20.02.2017
13:49:59
а у новых нод, например, ставить серверный редирект на старое api, и не в серванте, а в мидлвари
я например пришел к тому, что нормализую пути сначала в мидлвари, что бы в сервант лищний мусор не тащить
еще LB может быть умным, и запросы направлять бэкендам в зависимости от версии API

Misha
20.02.2017
13:55:10
мидлварь это в данном случае nginx или типа того?

Dmitry
20.02.2017
13:55:19
wai
нормализую запросы перед тем как их в сервант скормить

Misha
20.02.2017
13:55:33
о как

Dmitry
20.02.2017
13:55:35
что бы в нем не плодить лишних веток
да это звучит страшнее чем есть, там пара-тройка строк всего. подцепить реврайт и переписывать урлы

Misha
20.02.2017
14:03:27
звучит страшно, но видимо это как раз способ убрать железную compile-time привязку
да, таким образом можно на версию смотреть и перенаправлять куда надо

Dmitry
20.02.2017
14:04:49
не, это же в том же процессе, где и api
это не решает задачу слишком большого числа эндпойнтов
хотя может и решать, т.к. там вроде сделать так. что бы разные версии были разными типами, а роутить по версии на уровне WAI
может это и решит вопрос. но надо исследовать

Misha
20.02.2017
14:05:45
да, но это решает задачу апдейта по частям
ну как "вроде бы решает", если пытаться себе представить как оно должно работать

Google

Misha
20.02.2017
14:06:32
так-то надо смотреть конечно

Quet
20.02.2017
14:08:45
если все серьёзно то делается поддержка одновременно и старой и новой версии и постепенно сервисы переезжают
но обычно можно просто загасить все и поднять новую версию сразу

Dmitry
20.02.2017
14:09:39
ну зависит. но мне сейчас кажется, что при помощи wai можно растащить разные версии API по разным типам и решить проблему падения ghc, но не решить проблему медленной компиляции
так что лучше все таки сразу резать на куски поменьше, может в этом и еще какой-то смысл есть. ну например сингл респонсибилити, но год обжект антипаттерн и прочая

Quet
20.02.2017
14:11:18
смысл что эти куски можно по разным машинам растащить
если понадобится

Alexander
20.02.2017
14:11:52
у нас вот например нужно на кластере ноды обновлять, причем по условиям по частям
в итоге на разных нодах могут быть слегка разные версии haskell софта и сишного
и консенсус протокол и IO не должно ломаться
учитывая что обновление сишной части может потребовать обновить под петабайт данных ?
а самая задница в том, что там cloud-haskell и он использует Fingerprint для роутинга сообщений

Misha
20.02.2017
14:14:14
кстати да, а как вы это делаете вообще? особенно если с бинарной сериализацией

Alexander
20.02.2017
14:14:31
у нас есть тип StablePrint
который дает стабильный Fingerprint данным
и есть таблица StablePrint->Fingerprint
+SafeCopy
но это в одну сторону
там есть ещё от "мозга" процесс, который на какой-то их нод, на которх consensus protocol работает
к сервисам, и в эту сторону сейчас решаем

Google

Alexander
20.02.2017
14:16:04
пока непонятно
там какой-то ад наворотить хотят
переусложнёный но с похожим принципом
да есть плюс, network-transport и binary пофиг на версии там все стабильно

Dmitry
20.02.2017
14:17:15
а что у вас за кнсенсус?

Alexander
20.02.2017
14:17:28
paxos

Dmitry
20.02.2017
14:17:29
который посложнее или который попроще? черт, забыл

Alexander
20.02.2017
14:17:34
посложнее

Dmitry
20.02.2017
14:17:39
они паксос, а второй облегченный как там его

Alexander
20.02.2017
14:17:44
raft

Dmitry
20.02.2017
14:17:46
да

Alexander
20.02.2017
14:17:52
у нас paxos с парой усложнений
там есть pipelining и ещё какая-то оптимизации
в paxos made live описаны
у нас что-то таки сделали

Dmitry
20.02.2017
14:18:19
страшно даже представить, что вы там такое делаете
что вам это всё нужно

Alexander
20.02.2017
14:18:35
кластером управляем
на самом деле не вижу причин почему бы тут рафт не взлетел

Quet
20.02.2017
14:18:52
а кластер что делает? )

Anatolii
20.02.2017
14:19:15
Управляется!:)

Alexander
20.02.2017
14:19:18
данные сохраняет и отдает