Понятно что под стажером описан опыт целой команды (никто бы не доверил стажеру проектировать архитектуру), но чтобы набить себе цену и победить в эволюционной борьбе, чтобы никто не посмел потом сказать какие же вы идиоты — придумали концепцию стажера. Ну да ладно, отвлеклись. Суть вот в чем:
Вот решение "стажера" по идемпотентности:
POST /v1/orders
{
"from": "Москва, ул. Садовническая набережная 82с2",
"to": "Аэропорт Внуково",
"idempotency_key": "786706b8-ed80-443a-80f6-ea1fa8cc1b51"
}
Т.е. этот "стажер" (как позже признались в комментах — это опыт выведен из нескольких проектов) — сделал запрос POST идемпотентным. Но как мы знаем — POST не идемпотентен, т.к. еще не знает ключа ресурса — ключ только генерится.
Не логичнее ли вместо idempotency_key использовать ID и сделать этот ID типа UUID v4? Ведь по сути именно это хотел изобразить стажер:
PUT /v1/orders/786706b8-ed80-443a-80f6-ea1fa8cc1b51
{
"id": "786706b8-ed80-443a-80f6-ea1fa8cc1b51",
"from": "Москва, ул. Садовническая набережная 82с2",
"to": "Аэропорт Внуково"
}
Какие минусы в этом?
Минус очевидный — это диктует тип ключей — только UUID. А если хочется чтобы ключи генерила СУБД и там спец. система для распределенной генерации ключей? Т.е. такой PUT как бы обязывает применять новую схему создания ключей.
И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным (а это можно и нужно всегда — интернет по определению не надежен) — то нужно делать.
Здравствуйте, Shmj, Вы писали:
S>Т.е. этот "стажер" (как позже признались в комментах — это опыт выведен из нескольких проектов) — сделал запрос POST идемпотентным. Но как мы знаем — POST не идемпотентен, т.к. еще не знает ключа ресурса — ключ только генерится.
POST не обязан быть идемпотентным, но никто не мешает сделать его идемпотентным.
S>Не логичнее ли вместо idempotency_key использовать ID и сделать этот ID типа UUID v4? Ведь по сути именно это хотел изобразить стажер:
Я бы так и сделал.
S>Минус очевидный — это диктует тип ключей — только UUID. А если хочется чтобы ключи генерила СУБД и там спец. система для распределенной генерации ключей? Т.е. такой PUT как бы обязывает применять новую схему создания ключей.
Ну вот я недавно думал над этим и решил, что ключи должны быть только UUID. Минусов у UUID почти нет, а плюсов много.
S>И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным (а это можно и нужно всегда — интернет по определению не надежен) — то нужно делать.
Ну в идеале — согласен. На практике не всегда получается это выполнять. Ограничения архитектуры или старого кода могут играть роль. К примеру в браузере нельзя послать PUT на другой домен без разрешений CORS, а POST с определёнными ограничениям — можно. Ну это просто пример.
Кажется у вас небольшая каша в голове по этому вопросу. Вы ж совсем недавно задавали подобный вопрос про идемпотентность и защиту от дублирования http://rsdn.org/forum/dotnet/8348759.1
ID и idempotency_key — это совершенно разные вещи, и служат для разных целей. idempotency_key позволяет исключить повторное создание нового айтема с новым ID, а ID айтема служит для идентификации айтема при работе с ним.
PS лучше было бы такие темы писать в другой раздел. Тут ничего нет имеющего непосредственно отношение к точке нету.
Патриот здравого смысла
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, DiPaolo, Вы писали:
DP>ID и idempotency_key — это совершенно разные вещи, и служат для разных целей. idempotency_key позволяет исключить повторное создание нового айтема с новым ID, а ID айтема служит для идентификации айтема при работе с ним.
Однако же если в качестве ID применить UUID и генерить на клиенте — то проблема решается сама собой. Вот чел. так и делает: https://rsdn.org/forum/dotnet/8364034.1
Здравствуйте, Shmj, Вы писали:
S>Вот решение "стажера" по идемпотентности:
Не ту проблему решали: если нужно, чтобы в базе не было одинаковых заказов, достаточно на стороне сервера обеспечить, чтобы в базе не было одинаковых заказов.
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, scf, Вы писали:
S>>Вот решение "стажера" по идемпотентности:
scf>Не ту проблему решали: если нужно, чтобы в базе не было одинаковых заказов, достаточно на стороне сервера обеспечить, чтобы в базе не было одинаковых заказов.
Прочитайте статью. Как раз в том и фишка — одинаковые заказы могут быть. Как так? А вот так — приехала компания из 7 чел., в 1 машину влазит 4 чел. Сделали сначала 1 заказ а потом сразу другой — так корректно. Главное отличать когда это по воле клиента а когда по сетевой ошибке.
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>Прочитайте статью. Как раз в том и фишка — одинаковые заказы могут быть. Как так? А вот так — приехала компания из 7 чел., в 1 машину влазит 4 чел. Сделали сначала 1 заказ а потом сразу другой — так корректно. Главное отличать когда это по воле клиента а когда по сетевой ошибке.
Я прочитал в самом начале статьи следующее:
Когда надо было сделать API для отдачи активных заказов, Вася задумался: а может ли понадобиться заказывать одновременно несколько машин такси? Менеджеры ответили, что нет, такая возможность не нужна.
Здравствуйте, Shmj, Вы писали:
S>И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным (а это можно и нужно всегда — интернет по определению не надежен) — то нужно делать.
Допустим, у нас есть запрос PUT/PATCH для изменения пароля пользователя.
В системе настроено правило: при неправильно введённом текущем пароле 3 раза — учётка блокируется.
У клиента очень плохой интернет, он решает поменять пароль.
В итоге запрос даже не задваивается, а улетает 4 копии.
Первая отрабатывает и меняет пароль. Остальные приходят с уже неправильным старым паролем.
Итого система видит, что какой-то негодяй пытается подобрать пароль и блокирует учётку.
Этот запрос не POST, но является ли он идемпотентным?
Re[4]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
K>Я прочитал в самом начале статьи следующее: K>
K>Когда надо было сделать API для отдачи активных заказов, Вася задумался: а может ли понадобиться заказывать одновременно несколько машин такси? Менеджеры ответили, что нет, такая возможность не нужна.
K>
Так читайте дальше:
Вася удивлен: как же так, я же спрашивал, и вы говорили мне, что это не понадобится?!
Мы не боги — никто из нас не обладает полнотой картины реальности, хотя часто думаем что обладаем и что-то там можем прогнозировать. Просто принять как факт — никто не знает что понадобится а что нет — делать максимально гибко.
Re[5]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
S>>Так читайте дальше: K>Действительно. Пропустил, когда эту занимательную выдуманную историю по диагонали пробегал.
Оно можно сказать — аналитики плохие, не предугадали, не виноватая я и т.д. Но суть то не в том кто виноват — важно сделать максимально гибко. И хорошие принципы это позволяют.
Re[7]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>Оно можно сказать — аналитики плохие, не предугадали, не виноватая я и т.д. Но суть то не в том кто виноват — важно сделать максимально гибко. И хорошие принципы это позволяют.
Сделали гибко, в итоге теперь у обычных клиентов не проходят лишние случайные заказы. Они счастливы.
Зато мамкин кулхацкер посмотрел на отправляемые запросы, сгенерировал своих дубликатов с уникальными UUID и заказал на адрес тысячу машин за наличку.
Яндекс будет рад такой ситуации или не нужно клиенту таки слепо доверять и на сервере как-то нужно следить за входными данными?
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
K>Допустим, у нас есть запрос PUT/PATCH для изменения пароля пользователя. K>В системе настроено правило: при неправильно введённом текущем пароле 3 раза — учётка блокируется. K>У клиента очень плохой интернет, он решает поменять пароль. K>В итоге запрос даже не задваивается, а улетает 4 копии. K>Первая отрабатывает и меняет пароль. Остальные приходят с уже неправильным старым паролем. K>Итого система видит, что какой-то негодяй пытается подобрать пароль и блокирует учётку. K>Этот запрос не POST, но является ли он идемпотентным?
В данном случае, его вполне можно сделать идемпотентным добавлением ключа идемпотентности и данный сценарий от этого только улучшится:
1. первый запрос сменит пароль, сохранит результат (ок или ошибка) в специальную таблицу с этим полученным ключом (это может быть постоянная таблица типа истории изменений пароля или временная с периодической очисткой — только для обеспечения идемпотености запросов)
2. каждый следующий запрос посмотрит наличие ключа в этой таблице и сразу вернет "ок" (ну или ошибка, если все же первый запрос был уже неудачный), даже не пытаясь собственно менять пароль.
3. Поскольку попытки смены пароля для этих последующих запросов реально не проводилось, то и учетку не блокируем.
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, fmiracle, Вы писали:
F>В данном случае, его вполне можно сделать идемпотентным добавлением ключа идемпотентности и данный сценарий от этого только улучшится:
И в итоге чуть ли не каждый запрос на редактирование нужно делать идемпотентным, чтобы у пользователя не возникало фантомных ошибок и запрос действительно одно и то же возвращал.
Почему-то во многих статьях пишут именно про POST, подразумевая то, что вот этот запрос создаст новую запись и с ним очень легко захламить сервер мусором.
Плевать, что повторный PUT или DELETE скорее всего вернёт уже не статус 200, а какую-нибудь ошибку.
Я вот как-то разницу между запросами не особо вижу в плане "идемпотентности".
GET разве что особняком стоит, т.к. он на чтение работает, а у остальных примерно одинаковые проблемы.
Re[8]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
K>Сделали гибко, в итоге теперь у обычных клиентов не проходят лишние случайные заказы. Они счастливы. K>Зато мамкин кулхацкер посмотрел на отправляемые запросы, сгенерировал своих дубликатов с уникальными UUID и заказал на адрес тысячу машин за наличку. K>Яндекс будет рад такой ситуации или не нужно клиенту таки слепо доверять и на сервере как-то нужно следить за входными данными?
Это уже другой вопрос — вопрос безопасности. Даже если ты установишь лимит — 1 клиент 1 заказ — это не спасет от подобной ситуации, т.к. мамкин кулхацкер с легкостью создаст несколько учеток даже с разных IP-адресов и точно так вызовет 1000 машин, можно даже на разные адреса.
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
K>Допустим, у нас есть запрос PUT/PATCH для изменения пароля пользователя. K>В системе настроено правило: при неправильно введённом текущем пароле 3 раза — учётка блокируется. K>У клиента очень плохой интернет, он решает поменять пароль. K>В итоге запрос даже не задваивается, а улетает 4 копии. K>Первая отрабатывает и меняет пароль. Остальные приходят с уже неправильным старым паролем. K>Итого система видит, что какой-то негодяй пытается подобрать пароль и блокирует учётку. K>Этот запрос не POST, но является ли он идемпотентным?
Выше вам хорошо ответили. Без ключа идемпотентности — да, запись была бы заблокирована. С ключом идемпотентности, а он один и тот же для всех 4 запросов — первый раз отработали, на все остальные сказали что все ОК.
Здравствуйте, Shmj, Вы писали:
S>Но как мы знаем — POST не идемпотентен
Не совсем так. У него нет требования быть идемпотентным. Но обратного требования тоже нет.
Но с точки зрения понятности API, конечно, неидемпотентный метод лучше сделать PUT.
Еще один не самый лучший момент — явное вытаскивание этого idempotency_key в бизнес-слой. Разумнее было бы передавать в каком нибудь хидере типа X-Request-ID, так как это не бизнес-сущность, а специфика транспорта.
S>Не логичнее ли вместо idempotency_key использовать ID и сделать этот ID типа UUID v4?
Логичнее.
S>И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным
А если нельзя?
S> (а это можно и нужно всегда — интернет по определению не надежен)
Иногда важнее получить fail сразу же и ретраи не делать.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали: K>Почему-то во многих статьях пишут именно про POST, подразумевая то, что вот этот запрос создаст новую запись и с ним очень легко захламить сервер мусором. K>Плевать, что повторный PUT или DELETE скорее всего вернёт уже не статус 200, а какую-нибудь ошибку.
DELETE должен вернуть 200, даже если запись была удалена ранеее. Именно по этому считаем идемпотентным.
Аналогично PUT — он полностью заменяет запись и будет всегда возвращать одно и тоже, не зависимо от очередности вызовов.
Только PATCH еще может быть не идемпотентным. K>Я вот как-то разницу между запросами не особо вижу в плане "идемпотентности".
Вот табличка, уже приводил:
Скрытый текст
K>GET разве что особняком стоит, т.к. он на чтение работает, а у остальных примерно одинаковые проблемы.
Не только, см. табличку.
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
DP>>PS лучше было бы такие темы писать в другой раздел. Тут ничего нет имеющего непосредственно отношение к точке нету. S>По сути все сидят на этом форуме — 90% людей.
Это неприемлемая мотивация. Не надо постить в неподходящий форум потому что тут больше людей.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Не совсем так. У него нет требования быть идемпотентным. Но обратного требования тоже нет. НС>Но с точки зрения понятности API, конечно, неидемпотентный метод лучше сделать PUT. НС>Еще один не самый лучший момент — явное вытаскивание этого idempotency_key в бизнес-слой. Разумнее было бы передавать в каком нибудь хидере типа X-Request-ID, так как это не бизнес-сущность, а специфика транспорта.
А что это принципиально меняет? Все равно нам нужно по этому x-request-id понять, что делать с повторным запросом. И это уже не транспорт, а бизнес-логика.
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>Еще один не самый лучший момент — явное вытаскивание этого idempotency_key в бизнес-слой. Разумнее было бы передавать в каком нибудь хидере типа X-Request-ID, так как это не бизнес-сущность, а специфика транспорта.
P>А что это принципиально меняет?
Логичность и понятность API.
P> Все равно нам нужно по этому x-request-id понять, что делать с повторным запросом. И это уже не транспорт, а бизнес-логика.
Неа. Бизнес-логика, это если ключ присутствует на бизнес-уровне. А вот если ключ специальный и ей ортогонален, то не нужно тащить его в бизнес-слой.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным НС>А если нельзя?
На пример в каком случае?
Re[5]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>Аналогично PUT — он полностью заменяет запись и будет всегда возвращать одно и тоже, не зависимо от очередности вызовов.
Это не так, см. спецификацию. Может вернуть 201, 200/204.
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>Выше вам хорошо ответили. Без ключа идемпотентности — да, запись была бы заблокирована. С ключом идемпотентности, а он один и тот же для всех 4 запросов — первый раз отработали, на все остальные сказали что все ОК.
т.е. хоть и не POST, но нужно что-то отдельно мудрить для идемпотентности?
В итоге только POST не идемпотентный или таки название метода ничего не значит?
Re[9]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>Это уже другой вопрос — вопрос безопасности. Даже если ты установишь лимит — 1 клиент 1 заказ — это не спасет от подобной ситуации, т.к. мамкин кулхацкер с легкостью создаст несколько учеток даже с разных IP-адресов и точно так вызовет 1000 машин, можно даже на разные адреса.
и поэтому нужно сначала безоговорочно доверять тому, что прислал клиент, чтобы потом отдельно безопасностью заниматься и накручивать дополнительные проверки?
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>DELETE должен вернуть 200, даже если запись была удалена ранеее. Именно по этому считаем идемпотентным.
Кому он должен?
Вообще-то мне может требоваться, чтобы DELETE именно сообщал была ли запись удалена мною или её изначально не было.
S>Аналогично PUT — он полностью заменяет запись и будет всегда возвращать одно и тоже, не зависимо от очередности вызовов.
А если на сервере кто-то подписан на изменения записей и запускает какую-то операцию?
Ну, может изменения в профиле организации в итоге должен живой модератор проверить и сравнить их со сканами документов.
Заставим человека одни и те же данные дважды проверять и плевать, лишь бы на клиент одинаково код 200 улетел?
S>Вот табличка, уже приводил:
Ага. Табличка по которой все методы отличные, только чтобы у пользователя учётка не заблокировалась из-за плохого интернета, в замечательные индеподентный запрос нужно так же отдельно мудрить ключи.
Re[4]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали: K>т.е. хоть и не POST, но нужно что-то отдельно мудрить для идемпотентности? K>В итоге только POST не идемпотентный или таки название метода ничего не значит?
См. табличку:
Скрытый текст
PATCH — не идемпотентен. Т.е. ключ добавлять обязательно, если она нужна.
А PUT — не подходит для обновления пароля — он обновляет целиком всю запись и должен обеспечивать идемпотентность. Это возможно только для сущностей без состояния.
Re[4]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Логичность и понятность API.
Это всего лишь структура пейлоада. Если мы привязаны к хттп, то можно и хидер заюзать, теоретически. На самом деле если абстрагироваться от хттп, то у нас много вариантов
Соответсвенно на стороне бакенда всё это отражается 1 в 1, только второй вариант хуже с т.з. разработки, т.к. важный степ уходит неизвестно куда.
P>> Все равно нам нужно по этому x-request-id понять, что делать с повторным запросом. И это уже не транспорт, а бизнес-логика.
НС>Неа. Бизнес-логика, это если ключ присутствует на бизнес-уровне. А вот если ключ специальный и ей ортогонален, то не нужно тащить его в бизнес-слой.
А где и как ты собираешься проверять, повторный ли это реквест и в каком он состоянии?
Идемпотентность это свойство прежде всего бизнес-операции. Соответсвенно реализация этого свойства требует в т.ч. и поддержки транспортом. Но первично именно свойство бизнес-операции.
Re[6]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали: K>Кому он должен? K>Вообще-то мне может требоваться, чтобы DELETE именно сообщал была ли запись удалена мною или её изначально не было.
См. табличку:
Скрытый текст
Таковы правила. Вам либо принять либо город городить. S>>Аналогично PUT — он полностью заменяет запись и будет всегда возвращать одно и тоже, не зависимо от очередности вызовов. K>А если на сервере кто-то подписан на изменения записей и запускает какую-то операцию? K>Ну, может изменения в профиле организации в итоге должен живой модератор проверить и сравнить их со сканами документов. K>Заставим человека одни и те же данные дважды проверять и плевать, лишь бы на клиент одинаково код 200 улетел?
Тогда нельзя использовать PUT — только PATCH. K>Ага. Табличка по которой все методы отличные, только чтобы у пользователя учётка не заблокировалась из-за плохого интернета, в замечательные индеподентный запрос нужно так же отдельно мудрить ключи.
Разберитесь.
Re[5]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, vsb, Вы писали:
S>>DELETE должен вернуть 200, даже если запись была удалена ранеее. Именно по этому считаем идемпотентным.
vsb>А разве идемпотентность требует возвращать один и тот же код ответа? Мне это не очевидно. vsb>Почему бы первому DELETE не возвращать 200, а последующим 404? Вроде это ничему не противоречит. А то, что код возврата разный, ну и что.
Сорри, все-таки верно — второй DELETE вернет ошибку, однако же не поменяет состояние объекта.
Clearly, the response is different from the first request, but there is no change of state for any resource on the server-side because the original resource is already deleted.
Здравствуйте, Pauel, Вы писали:
НС>>Еще один не самый лучший момент — явное вытаскивание этого idempotency_key в бизнес-слой. Разумнее было бы передавать в каком нибудь хидере типа X-Request-ID, так как это не бизнес-сущность, а специфика транспорта. P>А что это принципиально меняет? Все равно нам нужно по этому x-request-id понять, что делать с повторным запросом. И это уже не транспорт, а бизнес-логика.
Можно сделать общее правило, что если передан такой ключ, то прежде чем отдавать данные на обработку в бизнес-логику проверить наличие уже отправленного ранее ответа на этот ключ и отослать его, если он был (для REST с учетом глагола можно сделать чуть разную логику для post/put/delete если есть желание).
Это можно сделать каким-то промежуточным слоем, который будет отрабатывать для всех запросов вообще и одинаково. Но значение ключа при этом тогда гораздо удобнее держать не частью бизнес-данных запроса, а чем-то техническим — хидер для rest, или поле в конверте, например, если у нас какой-то свой протокол.
При появлении нового запроса в АПИ достаточно будет прописать тот же хидер и вся магия для него заработает сразу, без каких-то правок. А если уж вдруг для каких-то запросов "стандартный" механизм не подходит, то убрать этот общий хидер и делать отдельно на урвоне бизнес-логики.
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Еще один не самый лучший момент — явное вытаскивание этого idempotency_key в бизнес-слой. Разумнее было бы передавать в каком нибудь хидере типа X-Request-ID, так как это не бизнес-сущность, а специфика транспорта.
Это в статье пример для простоты понимания. Там же в тексте указаны реальные примеры приложений с таким подходом и как раз написано, что для них используются заголовки.
Re[5]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>На самом деле если абстрагироваться от хттп
Абстрагироваться от хттп это прямо совсем не про REST, а здесь таки REST обсуждается.
НС>>Неа. Бизнес-логика, это если ключ присутствует на бизнес-уровне. А вот если ключ специальный и ей ортогонален, то не нужно тащить его в бизнес-слой. P>А где и как ты собираешься проверять, повторный ли это реквест и в каком он состоянии?
В мидлвере.
P>Идемпотентность это свойство прежде всего бизнес-операции.
Однако обеспечение этой идемпотентности при помощи отдельного ключа — штука весьма универсальная, и не нужно ее копипастить в бизнес-коде по всем идемпотентным методам.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, karbofos42, Вы писали:
K>Вообще-то мне может требоваться, чтобы DELETE именно сообщал была ли запись удалена мною или её изначально не было.
В общем случае это невозможно. У тебя может запрос на удаление успешно дойти, а вот отклик сервера потеряться. При таком раскладе, если DELETE будет возвращать при удалении уже удаленного 404, ты никогда не получишь на клиенте для этого ресурса 200.
Поэтому строить клиентскую логику на основании того, что вернул DELETE — отличный способ подложить себе грабли.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>А PUT — не подходит для обновления пароля — он обновляет целиком всю запись
Так сделай пароль отдельным ресурсом и обновляй его целиком.
В более хитрых ситуациях может понадобится хранить несколько паролей, да еще и со связанной с ними информацией типа даты создания. Это уже точно отдельный ресурс.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Shmj, Вы писали:
S>>А PUT — не подходит для обновления пароля — он обновляет целиком всю запись
НС>Так сделай пароль отдельным ресурсом и обновляй его целиком. НС>В более хитрых ситуациях может понадобится хранить несколько паролей, да еще и со связанной с ними информацией типа даты создания. Это уже точно отдельный ресурс.
Там же нужно передать и старый пароль.
1 запрос — пароль1, пароль2. Ок, поменяли.
2 такой же запрос — пароль1, пароль2 — уже не пройдет, т.к. новый пароль — это пароль2 (был установлен на предыдущем шаге).
По этому только PATCH.
Re[7]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>В общем случае это невозможно. У тебя может запрос на удаление успешно дойти, а вот отклик сервера потеряться. При таком раскладе, если DELETE будет возвращать при удалении уже удаленного 404, ты никогда не получишь на клиенте для этого ресурса 200. НС>Поэтому строить клиентскую логику на основании того, что вернул DELETE — отличный способ подложить себе грабли.
Так если я не получу ответ от сервера, то клиент повторно ему запрос на удаление отправит, когда связь восстановится (либо вообще это в рамках TCP разрулится и разработчика не волнует).
Дальше и появляется вопрос:
либо сервер увидит, что это повтор уже обработанного запроса и ответит то же самое, что отвечал уже и оно потерялось
либо серверу плевать, он обработает ещё раз удаление и уже не 200, а 404 отправит.
Кроме удаления по ИД, может быть и удаление по какому-нибудь условию.
И будет странно, если "потерянный" запрос сначала удалит 10 записей в БД, а потом я пользователю покажу, якобы не удалилось ничего.
Сначала пользователь удивится почему это ничего не удалилось, ведь он правильно всё выбрал.
Потом он удивится, когда увидит, что данных действительно больше нет.
И в третий раз удивится, когда начнёт искать в журнале/логе кто там его данные удалил и увидит, что это он.
А разработчики потом будут искать отличный баг про неправильное сообщение пользователю.
Здравствуйте, karbofos42, Вы писали:
K>Так если я не получу ответ от сервера, то клиент повторно ему запрос на удаление отправит, когда связь восстановится \
И сразу получит 404. А теперь поясни — зачем тебе на клиенте понадобилось знать, удалил ли ты реально или все уже удалено?
K>Кроме удаления по ИД, может быть и удаление по какому-нибудь условию
Удаление по id это тоже удаление по условию, никакой разницы.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[7]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Shmj, Вы писали:
S>1 запрос — пароль1, пароль2. Ок, поменяли. S>2 такой же запрос — пароль1, пароль2 — уже не пройдет, т.к. новый пароль — это пароль2 (был установлен на предыдущем шаге).
Будет ошибка, но состояние то сервиса не поменяется. Значит идемпотентность сохраняется и можно использовать PUT.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[9]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>И сразу получит 404. А теперь поясни — зачем тебе на клиенте понадобилось знать, удалил ли ты реально или все уже удалено?
Для информирования пользователя о том, чего он натворил, а чего без него успел кто-то понаделать.
Это не обязательное поведение и то и то допустимо, лишь бы человеки понимали особенности.
НС>Удаление по id это тоже удаление по условию, никакой разницы.
ну, при удалении людей старше 35 лет, метод вряд ли будет бросать 404, т.к. не указывалась конкретная запись.
Скорее всего, будет всегда кидать 200.
Re[6]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, vsb, Вы писали:
vsb>Почему бы первому DELETE не возвращать 200, а последующим 404? Вроде это ничему не противоречит. А то, что код возврата разный, ну и что. vsb>Да и как вообще реализовать DELETE, который будет возвращать 200 на удалённый ресурс? Это из базы нельзя ничего удалять?
Soft-delete сделать какой-нибудь.
Кодом людям нужно помогать!
Re[6]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>На самом деле если абстрагироваться от хттп НС>Абстрагироваться от хттп это прямо совсем не про REST, а здесь таки REST обсуждается.
Здесь мы обсуждаем http POST. REST как раз можно и без http применять.
НС>>>Неа. Бизнес-логика, это если ключ присутствует на бизнес-уровне. А вот если ключ специальный и ей ортогонален, то не нужно тащить его в бизнес-слой. P>>А где и как ты собираешься проверять, повторный ли это реквест и в каком он состоянии?
НС>В мидлвере.
Неинтересно. Все равно протаскивать, проверять итд. Ну вот подломал ктото мидлвару или не подключил — всё, приплыли. А так будет явный вызов.
P>>Идемпотентность это свойство прежде всего бизнес-операции.
НС>Однако обеспечение этой идемпотентности при помощи отдельного ключа — штука весьма универсальная, и не нужно ее копипастить в бизнес-коде по всем идемпотентным методам.
Копипастить и не нужно. Всё равно ведь придется в метаданных указать, что именно у нас идемпотентное.
То есть, не совсем ясно, какие бенефиты вытаскивать такое в мидлвару, если можно одной строчкой указать. И отлаживать проще, и отслеживать, и смена транспорта не повлечет тотальное переписывание
Re[7]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>Абстрагироваться от хттп это прямо совсем не про REST, а здесь таки REST обсуждается. P>Здесь мы обсуждаем http POST.
Нет, именно REST.
НС>>В мидлвере. P>Неинтересно. Все равно протаскивать, проверять итд. Ну вот подломал ктото мидлвару или не подключил — всё, приплыли.
Абалдеть логика. И часто у вас мидлвары подламывают или не подключают? А то, знаешь ли, та же аутентификация и авторизация тоже в виде мидлвар сделаны. Если такое можно подломать — не представляю как вы вообще разработку ведете.
P>>>Идемпотентность это свойство прежде всего бизнес-операции. НС>>Однако обеспечение этой идемпотентности при помощи отдельного ключа — штука весьма универсальная, и не нужно ее копипастить в бизнес-коде по всем идемпотентным методам. P>Копипастить и не нужно.
Нужно. Как минимум прописать это в модели, а потом из модели достать и куда то засунуть.
P> Всё равно ведь придется в метаданных указать, что именно у нас идемпотентное.
Для этого достаточно просто атрибут на метод навесить.
P>То есть, не совсем ясно, какие бенефиты вытаскивать такое в мидлвару
Универсальность и прозрачность. Ты же не таскаешь токен авторизации в модели, правда? Или таскаешь?
P>И отлаживать проще, и отслеживать,
Чем проще?
P> и смена транспорта не повлечет тотальное переписывание
Смена транспорта RESTful сервиса? Это какие то сказки. Если только на gRPC, но при этом отличия от HTTP будут минимальны.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[8]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Абстрагироваться от хттп это прямо совсем не про REST, а здесь таки REST обсуждается. P>>Здесь мы обсуждаем http POST.
НС>Нет, именно REST.
Смотри прямо заголовок — там POST, т.е. метод http. Если обсуждается именно Рест, то его надо обсуждать в отрыве от какого либо транспортного протокола.
P>>Неинтересно. Все равно протаскивать, проверять итд. Ну вот подломал ктото мидлвару или не подключил — всё, приплыли.
НС>Абалдеть логика. И часто у вас мидлвары подламывают или не подключают?
Похоже, щас ты скажешь, что у вас изобрели способ писать без багов.
> А то, знаешь ли, та же аутентификация и авторизация тоже в виде мидлвар сделаны. Если такое можно подломать — не представляю как вы вообще разработку ведете.
Поломаная аутентификация или авторизация дает знать о себе просто так, даже бывает и тесты запускать не надо.
А вот обеспечение идемпотентности можно и нужно покрывать дешовыми тестами. Все что в мидлварах — это дорогие тесты.
P>>Копипастить и не нужно. НС>Нужно. Как минимум прописать это в модели, а потом из модели достать и куда то засунуть.
Я показал, как это всё прописывать. Вместо атрибута будет параметр. Количество кода примерно одно и то же, только связывание в одном случае неявно, магией, через атрибуты, или явное, через вызов функции.
При этом для разных операций обеспечение идемпотентности может быть тупо разным.
P>> Всё равно ведь придется в метаданных указать, что именно у нас идемпотентное. НС>Для этого достаточно просто атрибут на метод навесить.
Спасибо Кэп, я именно это показал двумя постами назад.
P>>То есть, не совсем ясно, какие бенефиты вытаскивать такое в мидлвару НС>Универсальность и прозрачность. Ты же не таскаешь токен авторизации в модели, правда? Или таскаешь?
Энвелоп у вас еще не изобрели?
P>>И отлаживать проще, и отслеживать, НС>Чем проще?
Можно писать тесты ниже уровнем, дешевые, быстрые.
P>> и смена транспорта не повлечет тотальное переписывание
НС>Смена транспорта RESTful сервиса? Это какие то сказки. Если только на gRPC, но при этом отличия от HTTP будут минимальны.
Именно. Смена транспорта это вобщем норма на большом промежутке времени. Бывает и на grapql переходят, и на grpc, и на что угодно. Проще явно ввести этот энвелоп.
Все что можно вынести в мидлвару — синхронизацию поля в энвелопе со значением хидера для http, на случай если придется это как то учитывать в каком гатевее.
Re[8]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>То есть, не совсем ясно, какие бенефиты вытаскивать такое в мидлвару НС>Универсальность и прозрачность. Ты же не таскаешь токен авторизации в модели, правда? Или таскаешь?
Если мы уже дошли до вызова ф-ии из BL, значит с авторизацией вопрос решили, соотв. идемпотентность -- это требование к BL, отсюда явное присутствие этого параметра на этом уровне.
Кодом людям нужно помогать!
Re[9]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>Нет, именно REST. P>Смотри прямо заголовок — там POST, т.е. метод http.
Это серия постов от Шымжи, про REST. И по ссылке про REST. Поэтому все что я написал написано про REST, и попытки натянуть это на другие протоколы — скажем так, некорректны.
P>Если обсуждается именно Рест, то его надо обсуждать в отрыве от какого либо транспортного протокола.
REST в принципе не надо обсуждать в отрыве от протоколов, это противоречит его кулючевому принципу.
P>>>Неинтересно. Все равно протаскивать, проверять итд. Ну вот подломал ктото мидлвару или не подключил — всё, приплыли. НС>>Абалдеть логика. И часто у вас мидлвары подламывают или не подключают? P>Похоже, щас ты скажешь, что у вас изобрели способ писать без багов.
Не только у нас изобрели способ вынести инфраструктурную часть сервиса в библиотеку, и любой новый проект просто ее подключает. Без ее подключения ничто никуда не полетит, а с ней автоматом будут все нужные мидлверы.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[10]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>REST в принципе не надо обсуждать в отрыве от протоколов, это противоречит его кулючевому принципу.
Ровно наоборот. Рест — принцип, архитектурный стиль. http — протокол, который хорошо подходит для restful систем.
НС>>>Абалдеть логика. И часто у вас мидлвары подламывают или не подключают? P>>Похоже, щас ты скажешь, что у вас изобрели способ писать без багов.
НС>Не только у нас изобрели способ вынести инфраструктурную часть сервиса в библиотеку, и любой новый проект просто ее подключает. Без ее подключения ничто никуда не полетит, а с ней автоматом будут все нужные мидлверы.
Вы изобрели способ вытолкнуть бизнес-логику в инфраструктуру. Вот про это я и говорю.
Забавно, этим летом у меня был доклад про разработку фремворка и отношение к нему продуктовых разработчиков:
Product developer always request adding their business logic into your framework.
Собственно, ты в очередной раз подтвердил, что эта песня будет вечной.
И один из ключевых принципов этого стиля — по максимуму использовать существующие абстракции HTTP. Ты же тут пропагандируешь прямо противоположное.
P>Вы изобрели способ вытолкнуть бизнес-логику в инфраструктуру.
Это вопрос выбора точки зрения, является ли идемпотентность частью бизнес-логики или нет.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[9]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sharov, Вы писали:
S>Если мы уже дошли до вызова ф-ии из BL, значит с авторизацией вопрос решили, соотв. идемпотентность -- это требование к BL, отсюда явное присутствие этого параметра на этом уровне.
Не вижу логики, что это обязательно именно требование к BL. С т.з. именно бизнес-логики — в систему приходит заказ и он должен быть обработан. Заказ должен как-то корректно поступить в систему — и тут начинается логика обработки заказа.
И наоборот, логика проверки ключа идемпотентности может быть совершенно одинаковой как при заказе такси, так и при переключении канала трансляции на коммутаторе, хотя с т.з. бизнеса это совершенно разные бизнес-процессы из совершенно разных областей.
Идемпотентность операций при REST-запросах вполне можно трактовать как чисто техническое решение для технических проблем вида разрыва соединения, плохой связи и подобного, не имеющих прямого отношения к собственно логике бизнеса.
Хотя в каких-то случаях логика проверки дубликатов может быть важной частью бизнес-процесса, хотя скорее там будет описан не синтетический ключ идемпотентности, а какие-то правила сравнения по данным, которые позволяют считать разные сущности одинаковыми.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>1 запрос — пароль1, пароль2. Ок, поменяли. S>>2 такой же запрос — пароль1, пароль2 — уже не пройдет, т.к. новый пароль — это пароль2 (был установлен на предыдущем шаге). НС>Будет ошибка, но состояние то сервиса не поменяется. Значит идемпотентность сохраняется и можно использовать PUT.
С т.з. безопасности такой подход — дыра. Несовпадение пароля должно трактоваться как неуспешная попытка аутентификации и инкремировать счётчик, блокируя аккаунт при переполнении. Иначе API смены пароля будут использовать для подбора паролей.
Полагаю, правильным подходом будет попробовать пароль2, если пароль1 не сработал и просто отвечать ОК если пароль2 подошел.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>Ровно наоборот. Рест — принцип, архитектурный стиль.
НС>И один из ключевых принципов этого стиля — по максимуму использовать существующие абстракции HTTP. Ты же тут пропагандируешь прямо противоположное.
Так он был определен. Тем не менее, все теории развиваются, т.к. они и сами меняют реальность, и сами меняются вслед за изменениями реальности. РЕСТ ничем не лучше. Как только в широком доступе стало больше одного протокола, рест подход распространился и на них. нет никакой проблемы сделать ровно то же и на graphql, и на grpc, и вебсокетах, итд итд.
P>>Вы изобрели способ вытолкнуть бизнес-логику в инфраструктуру.
НС>Это вопрос выбора точки зрения, является ли идемпотентность частью бизнес-логики или нет.
Изначально идемпотентность нужна для бизнес-логики. Например, нужно предоставить гарантии, что списание денег с твоего счета будет ровно один раз вне зависимости от количества попыток оплатить конкретную покупку.
Сильно вряд ли ты обрадуешься, что денег будет списано несколько раз, поскольку платежный терминал трохи глючит.
И вот для реализации вот этих конкретных гарантий нам и нужна функциональность в приложении. Вынести её в библиотеку можно — пожалуйста. Штука в том, что она получается прибитой гвоздями к конкретному стеку. Если у вас ровно один стек и подразделение небольшое, то будет работать до тех пока сохраняются эти условия.
Re[10]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, fmiracle, Вы писали:
S>>Если мы уже дошли до вызова ф-ии из BL, значит с авторизацией вопрос решили, соотв. идемпотентность -- это требование к BL, отсюда явное присутствие этого параметра на этом уровне.
F>Не вижу логики, что это обязательно именно требование к BL.
Очень просто — средства на оплату конкретного заказа должны быть списаны ровно один раз вне зависимости от того, сколько попыток было оплатить.
Это БЛ. Все остальное есть просто реализация вот такого требования.
Причны скорее всего будут технического характера, но гарантии определяет бизнес операция — возможны ли дубликаты, или нет.
Re[11]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
S>>>Если мы уже дошли до вызова ф-ии из BL, значит с авторизацией вопрос решили, соотв. идемпотентность -- это требование к BL, отсюда явное присутствие этого параметра на этом уровне. F>>Не вижу логики, что это обязательно именно требование к BL.
P>Очень просто — средства на оплату конкретного заказа должны быть списаны ровно один раз вне зависимости от того, сколько попыток было оплатить. P>Это БЛ. Все остальное есть просто реализация вот такого требования.
Это бизнес-требование, которое может быть реализовано как идемпотентной операцией, так и без всякой идемпотентности (например так, что первое обращение списывает деньги и меняет состояние заказа и возвращает чек, второе дает ошибку, меняет внутренний счетчик попыток оплаты, отсылает СМС, и возвращает ошибку — совсем неидемпотентная операция, которая, однако, закроет вот этот требование единичной оплаты).
Требования могут быть реализованы как часть бизнес-логики, так и в целом техническим стеком вне этой логики. Например, бизнесу так же может требования консистентное сохранение данных заказа, но я могу не реализовывать транзакционность вручную в бизнес-логике, а использовать СУБД, в которой эта поддержка уже есть.
Re[13]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>И один из ключевых принципов этого стиля — по максимуму использовать существующие абстракции HTTP. Ты же тут пропагандируешь прямо противоположное. P>Так он был определен. Тем не менее, все теории развиваются
Это основополагающий принцип. Если от него отказаться, это уже будет совсем не REST.
P>>>Вы изобрели способ вытолкнуть бизнес-логику в инфраструктуру. НС>>Это вопрос выбора точки зрения, является ли идемпотентность частью бизнес-логики или нет. P>Изначально идемпотентность нужна для бизнес-логики.
Нет. Ты RFC то читал? Там ясно прописана цель — обеспечить отсутствие дублей при ретраях. Это — не бизнес логика, это инфраструктурная логика для борьбы с ненадежностью канала передачи.
Я тебе больше скажу, при использовании решений типа istio эта логика с клиентской стороны вообще физически уезжает из бизнес-кода в отдельный инфраструктурный контейнер. Что характерно, как раз благодаря тому, что абстракции уровня HTTP в REST не игнорируются, и содержимое на уровне HTTP обладает достаточной семантикой чтобы обеспечить довольно сложные вещи типа кеширования или ретраев находясь на уровне HTTP и ничего не зная про бизнес-логику. Если же ты абстрагируешься от протокола, такие решения станут невозможными.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[10]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, fmiracle, Вы писали:
S>>Если мы уже дошли до вызова ф-ии из BL, значит с авторизацией вопрос решили, соотв. идемпотентность -- это требование к BL, отсюда явное присутствие этого параметра на этом уровне. F>Не вижу логики, что это обязательно именно требование к BL. С т.з. именно бизнес-логики — в систему приходит заказ и он должен быть обработан. Заказ должен как-то корректно поступить в систему — и тут начинается логика обработки заказа. F>И наоборот, логика проверки ключа идемпотентности может быть совершенно одинаковой как при заказе такси, так и при переключении канала трансляции на коммутаторе, хотя с т.з. бизнеса это совершенно разные бизнес-процессы из совершенно разных областей. F>Идемпотентность операций при REST-запросах вполне можно трактовать как чисто техническое решение для технических проблем вида разрыва соединения, плохой связи и подобного, не имеющих прямого отношения к собственно логике бизнеса. F>Хотя в каких-то случаях логика проверки дубликатов может быть важной частью бизнес-процесса, хотя скорее там будет описан не синтетический ключ идемпотентности, а какие-то правила сравнения по данным, которые позволяют считать разные сущности одинаковыми.
С тем что выше я спорить не буду. Но почему иногда, в отдельных случаях, важность идемпотентности для BL
не манифестировать на уровне типов, т.е. доп. параметр? Прям важно, чтобы клиент это осознавал, что не отменяет
возможность все это решать на уровне middleware.
Кодом людям нужно помогать!
Re[11]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sharov, Вы писали:
S>С тем что выше я спорить не буду. Но почему иногда, в отдельных случаях, важность идемпотентности для BL S>не манифестировать на уровне типов, т.е. доп. параметр? Прям важно, чтобы клиент это осознавал, что не отменяет S>возможность все это решать на уровне middleware.
Когда надо — тогда стоит делать.
Собственно, я там выше по топику и говорил, что обощенная middleware не отменяет возможности в отдельных случаях делать особым образом, там где это действительно необходимо, и не тратить силы на повтор одного и того же там где можно обойтись стандартным шаблонным вариантом.
Здравствуйте, Shmj, Вы писали:
S>Минус очевидный — это диктует тип ключей — только UUID. А если хочется чтобы ключи генерила СУБД и там спец. система для распределенной генерации ключей? Т.е. такой PUT как бы обязывает применять новую схему создания ключей.
Мне интуитивно не нравится, что ключи вроде как обеспечивают integrity базы, а генерит их какой-то клиент, которому можно ли доверять, науке неизвестно, но я б на всякий случай не стал.
Однако можно сделать ключом крипто-хеш от содержимого записи, приведя ее сначала в вид, не зависящий от вариантов форматирования и порядка полей в объекте.
S>И если уж так подойти — то запросы POST вообще лишены смысла — ведь они не идемпотентны, а это плохо всегда, т.к. если можно сделать идемпотентным (а это можно и нужно всегда — интернет по определению не надежен) — то нужно делать.
Сам по себе запрос — это просто транспорт неких данных. Он не может быть идемпотен или нет. В спецификации протокола HTTP просто нет такого слова.
Re[2]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pzz, Вы писали:
Pzz>Сам по себе запрос — это просто транспорт неких данных. Он не может быть идемпотен или нет. В спецификации протокола HTTP просто нет такого слова.
9.1.2 Idempotent Methods
Re[3]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, samius, Вы писали:
Pzz>>Сам по себе запрос — это просто транспорт неких данных. Он не может быть идемпотен или нет. В спецификации протокола HTTP просто нет такого слова. S> 9.1.2 Idempotent Methods
Ну ОК. В спецификации есть.
Re[11]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали: P>Очень просто — средства на оплату конкретного заказа должны быть списаны ровно один раз вне зависимости от того, сколько попыток было оплатить. P>Это БЛ. Все остальное есть просто реализация вот такого требования.
Позволю себе не согласиться. Бизнес-аналитики вообще не должны мыслить вот этими категориями технических подробностей.
Есть бизнес-сценарий. Например — заказ такси.
Бизнес аналитик в первую голову анализирует функциональные потребности. Ну там — будем ли мы в рамках одного заказа давать ехать через N точек, или это строго A->Б?
Можно ли разделить оплату на нескольких пассажиров, или мы требуем строго 1 поездка = 1 плательшик?
А одному плательщику можно оплатить заказ частично картой, частично кэшем? А двумя картами?
Можно ли отменить заказ? А если водитель уже приехал? А если начал выполнение заказа?
Что делать, если клиент не выходит, но заказ не отменяет?
В какой момент списывать деньги — в начале поездки? В конце? Что, если поездка прервана посередине?
В первую голову, естественно, идут т.н. "позитивные" сценарии.
Потом начинаем критически смотреть на это — нет ли в нашей бизнес-логике дырок. Типа: таксист никуда не поехал, а тупо нажал "я прибыл", дождался "невыхода" клиента, получил компенсацию от сервиса, и побежал "брать" другой заказ. Или, например, наоборот — клиент вызывает такси, и за 30 секунд до прибытия машины отменяет заказ, и так 100 раз.
Или мы списали с клиента 100р за первый сегмент, начинаем списывать 500 за второй — а у нас отказ банка.
Изо всего этого строится большое-большое дерево решений; на их основе формируется набор требований.
Вот эти все подробности "ой, а что делать, если во время поездки рубануло питание датацентра?" — это вообще не вопрос бизнес-логики. Бизнес-аналитик (по крайней мере, в нормальной компании) не должен объяснять solution architect вещи типа "ребяты, надо все изменения держать в персистентной СУБД, и вся интеграция с внешними сервисами должна уметь восстанавливаться после сбоя".
И точно так же вопросы идемпотентности конкретных методов находятся в ведении архитекторов.
Это то же самое, как если бы аналитик должен был в каждом use-case добавлять строчку "а ещё программа должна работать корректно".
Или, к примеру, диктовал, какой протокол выбирать.
Если бы BA проектировал сервис типа DNS, то он бы наверняка большое внимание уделил таким вещам, как семейства записей и топология доменных зон.
Вещи типа TTL уже обсуждались между BA и архитекторами, которые бы объясняли, что для обеспечения нужного уровня надёжности база должна быть распределена, поэтому прямое управление кэшированием лучше игры в угадайку.
В процессе обсуждения в бизнес-логику проникли бы концепции вроде авторитативных и не-авторитативных ответов.
А вот вещи типа выбора UDP вместо TCP в качестве протокола, а также детали того, как клиент понимает, какой из пакетов ответа относится к какому запросу, вообще бы целиком решались на уровне архитекторов.
Это нифига не часть "бизнес-логики". Бизнес-логика там ровно та же, что и в HTTP — есть запрос, есть ответ. А вот какие конкретно будут методы в HTTP, или коды ошибок, или структура и нумерация UDP-пакетов — это слишком низкий для BL уровень.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Это нифига не часть "бизнес-логики". Бизнес-логика там ровно та же, что и в HTTP — есть запрос, есть ответ. А вот какие конкретно будут методы в HTTP, или коды ошибок, или структура и нумерация UDP-пакетов — это слишком низкий для BL уровень.
Хорошо, я согласен, идемпотентность не относится к бизнес-логике.
Вот у нас есть два варианта реализации операции, что выберешь?
Здравствуйте, Pauel, Вы писали: P>Хорошо, я согласен, идемпотентность не относится к бизнес-логике. P>Вот у нас есть два варианта реализации операции, что выберешь?
P>Явный контроль идемпотентности P>
Без контекста — непонятно.
Чтобы идемпотентностью пользоваться, нужен какой-то код обвязки вызовов на клиенте.
То есть, мы не просто делаем где-то в коде клиента httpClient.PostAsync(orderServiceUrl, orderUpdateContent). Нам надо
1. Записать в локальную базу инфу о том, что "worflow #xxxxxxx is going to update the order #yyyyyyy, idempotence key #kkkkk, update params $pppppppp".
2. Попытаться выполнить тот самый POST, или PUT, или PATCH
3. В зависимости от результата либо перейти по успешной ветке, либо по ветке неудачи, либо вернуться на шаг 2.
Как у нас устроен клиент? Возможно, все эти шаги — часть магии некоего фреймворка или workflow engine. Тогда мы в прикладном коде вообще идемпотентность не описываем; с его точки зрения, в сигнатуру вызова входит только прикладные части операции. А вопросы прозрачного сохранения состояния workflow в базу, восстановления после сбоев, ретраев и прочие подробности от прикладного программиста скрыты. Заодно лишая его возможности напороть в реализации.
Дальше — а как устроен сервер? Вот вы написали аннотацию метода, а дальше что?
Будете ли вы вручную выполнять сравнение пришедших в order параметров с актуальной версией, и сохранять значение ключа идемпотентности в базу?
Или, опять таки, будет работать некая магия фреймворка, которая за вас вычислит ETag, LastModified date, а заодно вытащит из запроса ключ идемпотентности и сравнит его с кодом за вас?
Первый вариант вашего кода подходит к первому случаю — весь закат солнца выполняется в ручном режиме.
Второй вариант подразумевает именно второй случай — некая магия дополнит ваш прикладной код, в котором написаны только правила обработки различных видов update для ордера.
Ну, и, опять же, операция — операцией, а есть ещё и расположение аргументов. Раз уж мы рисуем разметку, которая привязывает наш operation к глаголу HTTP, то и аргументы этой операции могут приехать из url (path или query), из тела, или из какого-то хидера. Прикладному сервера это всё равно, а вот с точки зрения клиентов и, в том числе, совместимости между разными версиями протокола это может быть важно.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Простите, а контроль со стороны кого?
Клиента? Сервера? Программиста?
Это все работает не так как вы думаете.
Вот вы делаете АПИ, а я пытаюсь его использовать. Мы оба читали спецификации.
Я вижу метод PUT и понимаю что могу спокойно добавить код повтора запроса если получил ошибку 5xx или вообще не получил ответа из-за проблем сети. В случае с POST это в общем случае не так.
Увидев в сигнатуре метода idempotencyKey я могу сделать предположение что метод будет идемпотентным, но это будет завесить от семантики payload. Если это JSON Patch, то у меня будут закрадываться сомнения, что метод действительно идемпотентный и я могу спокойно повторять вызов с одними и теми же параметрами.
Кроме того, с точки зрения тестирования явное указание idempotencyKey скорее всего приведет к том, что при тестировании в postman будут менять payload и не будут менять idempotencyKey с абсолютно непонятными последствиями.
Поэтому я бы рекомендовал отказаться от идемпотентности POST с JSON Patch и аналогичным payload.
Re[14]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>Простите, а контроль со стороны кого? G>Клиента? Сервера? Программиста?
Всех участников
G>Это все работает не так как вы думаете. G>Вот вы делаете АПИ, а я пытаюсь его использовать. Мы оба читали спецификации. G>Я вижу метод PUT и понимаю что могу спокойно добавить код повтора запроса если получил ошибку 5xx или вообще не получил ответа из-за проблем сети. В случае с POST это в общем случае не так.
POST не запрещено делать идемпотентным. Например, вызов функции в ODATA это POST, но это спокойно можно сделать идемпотентным.
G>Увидев в сигнатуре метода idempotencyKey я могу сделать предположение что метод будет идемпотентным, но это будет завесить от семантики payload. Если это JSON Patch, то у меня будут закрадываться сомнения, что метод действительно идемпотентный и я могу спокойно повторять вызов с одними и теми же параметрами
При чем здесь json patch и почему какая с ним проблема?
Re[15]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Простите, а контроль со стороны кого? G>>Клиента? Сервера? Программиста?
P>Всех участников
И как клиент может проконтролировать?
G>>Это все работает не так как вы думаете. G>>Вот вы делаете АПИ, а я пытаюсь его использовать. Мы оба читали спецификации. G>>Я вижу метод PUT и понимаю что могу спокойно добавить код повтора запроса если получил ошибку 5xx или вообще не получил ответа из-за проблем сети. В случае с POST это в общем случае не так.
P>POST не запрещено делать идемпотентным. Например, вызов функции в ODATA это POST, но это спокойно можно сделать идемпотентным.
Как клиент может узнать, что POST на определенный уорл внезапно стал идемпотентным
G>>Увидев в сигнатуре метода idempotencyKey я могу сделать предположение что метод будет идемпотентным, но это будет завесить от семантики payload. Если это JSON Patch, то у меня будут закрадываться сомнения, что метод действительно идемпотентный и я могу спокойно повторять вызов с одними и теми же параметрами
P>При чем здесь json patch и почему какая с ним проблема?
При том, что это более-менее стандартный способ описать дельту изменений. Но он поддерживает страшные операции вроде add\remove\copy
Re[16]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
P>>Всех участников G>И как клиент может проконтролировать?
Клиенту нужно выполнить свои обязанности
P>>POST не запрещено делать идемпотентным. Например, вызов функции в ODATA это POST, но это спокойно можно сделать идемпотентным. G>Как клиент может узнать, что POST на определенный уорл внезапно стал идемпотентным
Из описания API. Обычно клиент генерируется, а не пишется руками.
P>>При чем здесь json patch и почему какая с ним проблема? G>При том, что это более-менее стандартный способ описать дельту изменений. Но он поддерживает страшные операции вроде add\remove\copy
Что не так с этими операциями? Вот есть у тебя ключ x-y-z, метод POST и кучка add-remove-copy. Если сервер поддерживает идемпотентность для этой операции, то какие проблемы?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
P>>>Всех участников G>>И как клиент может проконтролировать?
Какие обязанности у клиента?
P>Клиенту нужно выполнить свои обязанности
P>>>POST не запрещено делать идемпотентным. Например, вызов функции в ODATA это POST, но это спокойно можно сделать идемпотентным. G>>Как клиент может узнать, что POST на определенный уорл внезапно стал идемпотентным P>Из описания API. Обычно клиент генерируется, а не пишется руками.
В каком описании присутствует информация об идемпотентности тех или иных вызовов?
P>>>При чем здесь json patch и почему какая с ним проблема? G>>При том, что это более-менее стандартный способ описать дельту изменений. Но он поддерживает страшные операции вроде add\remove\copy
P>Что не так с этими операциями? Вот есть у тебя ключ x-y-z, метод POST и кучка add-remove-copy. Если сервер поддерживает идемпотентность для этой операции, то какие проблемы?
Я не очень понимаю что значит "поддерживает" когда мы говорим об операциях вроде add-remove-copy. В зависимости от порядка выполнения набора add-remove-copy результат может быть разный. еЕли мы повторяем вызовы, то порядок выполнения не будет совпадать с изначальным порядком вызовов.
Re[18]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
P>>>>Всех участников G>>>И как клиент может проконтролировать? G>Какие обязанности у клиента?
Обычные — сделать запрос в соответствии с его семантикой. Если АПИ говорит о том, что операция идемпотентна, то на клиенской стороне надо сделать N соответствующих приседаний. Разумеется, это все делается самим клиентом по метаданным, а не вручную отсылая запрос POST.
P>>Из описания API. Обычно клиент генерируется, а не пишется руками. G>В каком описании присутствует информация об идемпотентности тех или иных вызовов?
Я привел описание, вернись и посмотри. Выглядит так, будто ты накидываешь не читая.
P>>Что не так с этими операциями? Вот есть у тебя ключ x-y-z, метод POST и кучка add-remove-copy. Если сервер поддерживает идемпотентность для этой операции, то какие проблемы? G>Я не очень понимаю что значит "поддерживает" когда мы говорим об операциях вроде add-remove-copy. В зависимости от порядка выполнения набора add-remove-copy результат может быть разный.
Что мешает зафиксировать этот порядок или вообще убрать эти add-remove-copy?
> еЕли мы повторяем вызовы, то порядок выполнения не будет совпадать с изначальным порядком вызовов.
Как то странно выполнять приседания пачкой каждый раз. Если хочешь, что бы батч, а add-remove-copy, это фактически батч, был идемпотентным, то надо приложить чуть больше усилий, чем просто выполнять каждый раз и ждать того же результата.
Например, порядок должен быть зафиксирован, эта пачка операций идет внутри транзакции, и выполняется ровно один раз, не больше, и не меньше. Отсюда не ясно, как ты собиаешься получить "разный" результат.
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>>>И как клиент может проконтролировать? G>>Какие обязанности у клиента? P>Обычные — сделать запрос в соответствии с его семантикой. Если АПИ говорит о том, что операция идемпотентна, то на клиенской стороне надо сделать N соответствующих приседаний. Разумеется, это все делается самим клиентом по метаданным, а не вручную отсылая запрос POST.
Какие метаданные сообщают клиенту что операция идемпотента?
G>>В каком описании присутствует информация об идемпотентности тех или иных вызовов? P>Я привел описание, вернись и посмотри. Выглядит так, будто ты накидываешь не читая.
Ты не понял вопроса: какое описание получает клиент? В лучшем случае это swagger. В нем никак не указывается идемпотентность методов.
Что ты привел — я не знаю. Если ты сам делаешь и клиент и сервер, то можешь использовать любые методы как угодно.
P>>>Что не так с этими операциями? Вот есть у тебя ключ x-y-z, метод POST и кучка add-remove-copy. Если сервер поддерживает идемпотентность для этой операции, то какие проблемы? G>>Я не очень понимаю что значит "поддерживает" когда мы говорим об операциях вроде add-remove-copy. В зависимости от порядка выполнения набора add-remove-copy результат может быть разный. P>Что мешает зафиксировать этот порядок или вообще убрать эти add-remove-copy? P>Как то странно выполнять приседания пачкой каждый раз. Если хочешь, что бы батч, а add-remove-copy, это фактически батч, был идемпотентным, то надо приложить чуть больше усилий, чем просто выполнять каждый раз и ждать того же результата. P>Например, порядок должен быть зафиксирован, эта пачка операций идет внутри транзакции, и выполняется ровно один раз, не больше, и не меньше. Отсюда не ясно, как ты собиаешься получить "разный" результат.
Это уже правильный путь. Если сделать несколько шагов, то получится PUT на урл с ключом и полным "объектом" в теле, без всяких дельт.
Re[4]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, fmiracle, Вы писали:
F>Это можно сделать каким-то промежуточным слоем, который будет отрабатывать для всех запросов вообще и одинаково. Но значение ключа при этом тогда гораздо удобнее держать не частью бизнес-данных запроса, а чем-то техническим — хидер для rest, или поле в конверте, например, если у нас какой-то свой протокол.
F>При появлении нового запроса в АПИ достаточно будет прописать тот же хидер и вся магия для него заработает сразу, без каких-то правок. А если уж вдруг для каких-то запросов "стандартный" механизм не подходит, то убрать этот общий хидер и делать отдельно на урвоне бизнес-логики.
Да, тут вопрос в некоторой мета-договорённости. Для PUT такая мета-договорённость присутствует в самом протоколе, почему он и крут. Для всего остального надо привинчивать ручками.
Для меня это выглядит некоторым аналогом авторизации. Вот у нас сейчас стандартом де-факто является авторизационный токен, который передаётся в хидере Authentication.
При этом лично у меня нет никакого желания делать его явным параметром метода бизнес-логики.
Бизнес-аналитик пишет в требованиях "этот метод требует наличия роли XXX у вызывающего". И логично это описывать в виде каких-то аннотаций на метод на стороне сервера, а не делать явный параметр authenticationToken, который потом реализатор должен как-то обработать прикладным кодом.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[20]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
P>>Обычные — сделать запрос в соответствии с его семантикой. Если АПИ говорит о том, что операция идемпотентна, то на клиенской стороне надо сделать N соответствующих приседаний. Разумеется, это все делается самим клиентом по метаданным, а не вручную отсылая запрос POST. G>Какие метаданные сообщают клиенту что операция идемпотента?
Например, атрибут @Idempotent() над определением операции. Или обязательный параметр idempotency key который помечет соответствующим атрибутом.
Все что нужно от клиента — одинаковые параметры должны давать тот же самый реквест вне зависимости от последовательности вызовов.
G>Ты не понял вопроса: какое описание получает клиент? В лучшем случае это swagger. В нем никак не указывается идемпотентность методов.
А я разве говорил про сваггер? Я же дал описание, ты его проигнорировал.
G>Что ты привел — я не знаю. Если ты сам делаешь и клиент и сервер, то можешь использовать любые методы как угодно.
В том то и дело. Только делать самому и то, и другое необязательно. Достаточно предоставить гарантии, что метаданные понимает и клиент, и сервер, и оба следуют им.
G>Это уже правильный путь. Если сделать несколько шагов, то получится PUT на урл с ключом и полным "объектом" в теле, без всяких дельт.
Совсем необязательно. Идемпотентность нужна вне зависимости от транспорта. Т.е. может оказаться так, что нет ни post, ни put, ни вообще http, а REST и идемпотентность операции остаются.
Сейчас в норме сервсисы унутре конторы коммуницируют не только через http. Зачем мастырит чтото особенное, если для той же декларации АПИ можно просто подкинуть другой транспорт?
И клиентский, и серверный код останутся без изменений.
Даже если ты перейдешь на graphql, это не избавит тебя от обеспечения идемпотентности.
Re[21]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Ты не понял вопроса: какое описание получает клиент? В лучшем случае это swagger. В нем никак не указывается идемпотентность методов. P>А я разве говорил про сваггер? Я же дал описание, ты его проигнорировал.
Это описание в каком формате?
Я вот пишу на С#, хочу сделать клиент для твоего rest api. Что ты мне отдашь? Куда мне засунуть твое описание, чтобы сгенерировался клиент?
G>>Что ты привел — я не знаю. Если ты сам делаешь и клиент и сервер, то можешь использовать любые методы как угодно. P>В том то и дело. Только делать самому и то, и другое необязательно. Достаточно предоставить гарантии, что метаданные понимает и клиент, и сервер, и оба следуют им.
Как сервер будет проверяться на следование гарантиям? Я не очень понимаю.
Re[22]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>>>Ты не понял вопроса: какое описание получает клиент? В лучшем случае это swagger. В нем никак не указывается идемпотентность методов. P>>А я разве говорил про сваггер? Я же дал описание, ты его проигнорировал. G>Это описание в каком формате?
Ключ идемпотентности в любом описании апи это явный обязательный параметр. Какая именно проблема у тебя тут возникла?
G>Я вот пишу на С#, хочу сделать клиент для твоего rest api. Что ты мне отдашь? Куда мне засунуть твое описание, чтобы сгенерировался клиент?
Что тебя смущает? Ты внятно сформулируй проблему. А то у тебя какие то намёки, страхи, но ничего конкретного нет.
P>>В том то и дело. Только делать самому и то, и другое необязательно. Достаточно предоставить гарантии, что метаданные понимает и клиент, и сервер, и оба следуют им. G>Как сервер будет проверяться на следование гарантиям? Я не очень понимаю.
Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится?
Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ?
Re[23]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Ключ идемпотентности в любом описании апи это явный обязательный параметр.
И как определить что параметр это именно ключ идемпотентности? По имени? Или есть какой-то способ в swagger или другой формальной спецификации (WSDL, proto) указать какой параметр является ключом?
P>Какая именно проблема у тебя тут возникла?
Проблема определения ключа идемпотентности
G>>Я вот пишу на С#, хочу сделать клиент для твоего rest api. Что ты мне отдашь? Куда мне засунуть твое описание, чтобы сгенерировался клиент? P>Что тебя смущает? Ты внятно сформулируй проблему. А то у тебя какие то намёки, страхи, но ничего конкретного нет.
Меня смущает, что ты не можешь назвать в какой формальной спецификации ты отдаешь описание методов. Ты старательно обходишь этот вопрос, что намекает, что у тебя нет ответа на него.
P>>>В том то и дело. Только делать самому и то, и другое необязательно. Достаточно предоставить гарантии, что метаданные понимает и клиент, и сервер, и оба следуют им. G>>Как сервер будет проверяться на следование гарантиям? Я не очень понимаю.
P> Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится?
В случае PUT есть соглашение более высокого уровня, чем твое описание (которое кстати нет пока еще). Это означает что и клиент и сервер, даже не договариваясь между собой, смогут воспользоваться преимуществами идемпотентности.
P>Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ?
Odata вполне соответствует REST, и идемпотентность там только для PUT и DELETE, для POST её нет. Также нет способа в рамках EDMX описать идемпотентные методы помимо PUT и DELETE.
Re[23]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Ключ идемпотентности в любом описании апи это явный обязательный параметр.
Нет. В PUT ключом идемпотентности выступает ровно URL ресурса. Так описано в спеке на HTTP.
P>Что тебя смущает? Ты внятно сформулируй проблему. А то у тебя какие то намёки, страхи, но ничего конкретного нет.
Проблема — в том, что семантика рукопашного ключа идемпотентности описана где-то в тексте, который нужно прочитать глазами, и реализовать паттерн идемпотентного доступа руками.
В одном АПИ ключ поедет в хидере, в другом АПИ — в теле, в третьем — вовсе придумают его в query string.
P> Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится?
Нет, но клиент может полагаться на идемпотентность PUT в силу RFC 2616.
P>Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ?
А вы уже посмотрели, как именно операции делаются идемпотентными в той же ODATA?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[24]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
P>>Ключ идемпотентности в любом описании апи это явный обязательный параметр. G>И как определить что параметр это именно ключ идемпотентности? По имени? Или есть какой-то способ в swagger или другой формальной спецификации (WSDL, proto) указать какой параметр является ключом?
А как ты определяешь, что параметр является именем пользователя, идентификатором, емейлом, суммой для списания со счета?
А correlation ты как определяешь?
P>>Какая именно проблема у тебя тут возникла? G>Проблема определения ключа идемпотентности
Ровно то же самое, что и с аргументом любой другой семпантики.
G>Меня смущает, что ты не можешь назвать в какой формальной спецификации ты отдаешь описание методов. Ты старательно обходишь этот вопрос, что намекает, что у тебя нет ответа на него.
Ужос, и исходный код я тоже не выкладываю!!!!!11111йййqqq Все ответы дадены. У тебя по существу пока ничего нового нет.
P>> Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится? G>В случае PUT есть соглашение более высокого уровня, чем твое описание (которое кстати нет пока еще). Это означает что и клиент и сервер, даже не договариваясь между собой, смогут воспользоваться преимуществами идемпотентности.
Правильно понимаю, то самое "соглашение высокого уровня" само себя запроектирует, закодит, зафиксит баги, протестирует, продеплоит и всё само себя?
P>>Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ? G>Odata вполне соответствует REST, и идемпотентность там только для PUT и DELETE, для POST её нет. Также нет способа в рамках EDMX описать идемпотентные методы помимо PUT и DELETE.
Так и есть — PUT сам себя обеспечит гарантиями, доведет до прода сам себя, да еще и баги от юзеров сам будет репортать.
Re[25]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
P>>>Ключ идемпотентности в любом описании апи это явный обязательный параметр. G>>И как определить что параметр это именно ключ идемпотентности? По имени? Или есть какой-то способ в swagger или другой формальной спецификации (WSDL, proto) указать какой параметр является ключом?
P>А как ты определяешь, что параметр является именем пользователя, идентификатором, емейлом, суммой для списания со счета?
По имени параметра. Ты предлагаешь тоже по имени это делать?
P>А correlation ты как определяешь?
Это что?
P>>>Какая именно проблема у тебя тут возникла? G>>Проблема определения ключа идемпотентности P>Ровно то же самое, что и с аргументом любой другой семпантики.
Нет, ключом идемпотентности в PUT и DELETE является url
G>>Меня смущает, что ты не можешь назвать в какой формальной спецификации ты отдаешь описание методов. Ты старательно обходишь этот вопрос, что намекает, что у тебя нет ответа на него. P>Ужос, и исходный код я тоже не выкладываю!!!!!11111йййqqq Все ответы дадены. У тебя по существу пока ничего нового нет.
Теперь понятно
P>>> Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится? G>>В случае PUT есть соглашение более высокого уровня, чем твое описание (которое кстати нет пока еще). Это означает что и клиент и сервер, даже не договариваясь между собой, смогут воспользоваться преимуществами идемпотентности. P>Правильно понимаю, то самое "соглашение высокого уровня" само себя запроектирует, закодит, зафиксит баги, протестирует, продеплоит и всё само себя?
ни одно соглашение этого не сделает
P>>>Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ? G>>Odata вполне соответствует REST, и идемпотентность там только для PUT и DELETE, для POST её нет. Также нет способа в рамках EDMX описать идемпотентные методы помимо PUT и DELETE. P>Так и есть — PUT сам себя обеспечит гарантиями, доведет до прода сам себя, да еще и баги от юзеров сам будет репортать.
Так как odata сервис в основном пишется людьми, которые читали RFC, то ты можешь рассчитывать, что PUT и DELETE там будут идемпотентными, а POST — не будет. Это еще до получения edmx.
Более того, даже если сделают какой-то метод в edmx, который будет вызываться с помощью POST и будет идемпотентен, то ты об этом не узнаешь, потому что в EDMX нет этой информации.
Кроме случаев если в параметрах метода явно написан idempotencyKey, но тогда непонятно почему бы не вынести этот ключ в url и не использовать PUT.
Короче снова пришли к тому, что идемпотентность POST в общем случае не нужна и приседания с её реализацией не имеют смысла.
Re[24]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
P>>Ключ идемпотентности в любом описании апи это явный обязательный параметр. S>Нет. В PUT ключом идемпотентности выступает ровно URL ресурса. Так описано в спеке на HTTP.
Урл нам надо сначала отрендерить
Вот PUT в ODATA протоколе, который REST искаропки
PUT /Warehouse.svc/Orders('an-id')
Вызываем его примерно так:
svc.orders.update('an-id', modifiedOrder);
или так:
svc.orders.update(modifiedOrder);
Т.е. у нас явный параметр, который и будет ключом идемпотентности. Для POST мы этот ключ можем положить куда угодно, это непринципиально.
P>>Что тебя смущает? Ты внятно сформулируй проблему. А то у тебя какие то намёки, страхи, но ничего конкретного нет. S>Проблема — в том, что семантика рукопашного ключа идемпотентности описана где-то в тексте, который нужно прочитать глазами, и реализовать паттерн идемпотентного доступа руками. S>В одном АПИ ключ поедет в хидере, в другом АПИ — в теле, в третьем — вовсе придумают его в query string.
Куда поедет ключ — дело десятое. Есл клиент генерируется по метаданным, а наружу торчит OO-интерфейс, нам это вообще по барабану, где что лежит. Вылезла пробелема с гатевеем, которй не пропускает наш запрос — поменяли атрибут, добавили @Header или @Encode и всё путём — перебилдили, и всё палит. Не надо вообще думать, что там где на самом деле лежит.
P>> Ты предложил использвать идемпотентный PUT. В твоём случае, надо полагать, идемпотентность сама себя обеспечит, напишет дизайн документы, наструячит код, покроет тестами всех уровней, проведет демо и задеплоится? S>Нет, но клиент может полагаться на идемпотентность PUT в силу RFC 2616.
Клиент — может. А на сервере это нужно мейнтейнить руками. Например, какой то шутник решит, что раз изменений нету, то можно и ошибку бросить "already done". И тесты надо написать, что бы такой шутник убедился, что его подход невалидный.
P>>Если ты умеешь обеспечить идемпотентны PUT, то какая именно проблема в том, что бы сделать идемпотентной операцию, например, в той же ODATA ? S>А вы уже посмотрели, как именно операции делаются идемпотентными в той же ODATA?
Что касается одаты, то я запилил серверный фремворк для TypeScript поверх оdata протокола собственной разработки, так что вобщем одату понимаю. Кое что портироал на жээс из odata-olingo, кое что из дотнета, остальное допилил самостоятельно. Собственно, это мой текущий проект — кучка фремворков на разные случаи жизни.
Идемпотентность реализуется ровно так же, как и везде. И на graphql нам она тоже нужна, и на grpc тоже. Например, апи будет торчать — openapi, odata, graphql, grpc. Незачем мучиться и пилить всё под каждый протокол. У нас только контроллеры будут разные, а всё остальнео будет в общем коде, и там же идемпотентность будет сидеть.
Вот например кейс такой, что нам надо проавать апи и юезр будет выбирать протокол и платить за количество фактически вызваных операций. А он возьми и выбери graphql. Разве мы ему скажем, что теперь про идемпотентность он должен забыть?
Re[26]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
P>>А как ты определяешь, что параметр является именем пользователя, идентификатором, емейлом, суммой для списания со счета? G>По имени параметра. Ты предлагаешь тоже по имени это делать?
Я предлагаю вернуться и посмотреть то самое определение апи, которое ты счел несущественным. Сейчас мы просто пересказываем ровно то, что там проиллюстрировано.
P>>А correlation ты как определяешь? G>Это что?
P>>Ровно то же самое, что и с аргументом любой другой семпантики. G>Нет, ключом идемпотентности в PUT и DELETE является url
Ога. А в url будет id объекта, который ты хочешь удалить или перезаписать. То есть, явный параметр. Ты что, запросы из терминала шлёшь, набивая их руками?
P>>Правильно понимаю, то самое "соглашение высокого уровня" само себя запроектирует, закодит, зафиксит баги, протестирует, продеплоит и всё само себя? G>ни одно соглашение этого не сделает
Ужос! Это что же — ты в курсе как имплементать идемпотентность, но вопрошаешь будто бы не в курсе дел?
G>Более того, даже если сделают какой-то метод в edmx, который будет вызываться с помощью POST и будет идемпотентен, то ты об этом не узнаешь, потому что в EDMX нет этой информации.
В edmx есть аннотации, куда ты можешь класть всё что тебе надо. Главное, что бы твой генеренный код протаскивал все нужные параметры как на клиенте, так и на сервере.
G>Кроме случаев если в параметрах метода явно написан idempotencyKey, но тогда непонятно почему бы не вынести этот ключ в url и не использовать PUT.
Потому, что один клиент хочет транспорт graphql, второй — odata, третий grpc, четвертый обычный openapi.
G>Короче снова пришли к тому, что идемпотентность POST в общем случае не нужна и приседания с её реализацией не имеют смысла.
Мы снова пришли к примеру операции в odata протоколе, или grapql, или grpc. Идемпотентность нужна, а вот Put и даже http может и не быть.
Re[25]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Урл нам надо сначала отрендерить
Эта фраза непонятна. P>Вот PUT в ODATA протоколе, который REST искаропки P>
P>PUT /Warehouse.svc/Orders('an-id')
P>
Всё верно. 'an-id' является частью URL.
P>Вызываем его примерно так: P>
P>svc.orders.update('an-id', modifiedOrder);
P>
P>или так: P>
P>svc.orders.update(modifiedOrder);
P>
P>Т.е. у нас явный параметр, который и будет ключом идемпотентности.
Нет. В первую очередь этот параметр — часть навигации.
В частности, мы можем сделать GET /Warehouse.svc/Orders('an-id') и получить этот ордер обратно.
То, что этот 'an-id' является ключом идемпотентности, следует не из какой-то особенной магии OData, а из спецификации HTTP.
Поэтому мы можем между клиентом и сервером воткнуть прокси, который будет, скажем, задерживать респонс случае получения невнятного ответа от апстрима, и продолжать долбить этот апстрим повторяющимися PUT-ами до получения вменяемого ответа — даже если сам клиент ничего не знает про возможности повторных запросов. P>Для POST мы этот ключ можем положить куда угодно, это непринципиально.
Принципиальна возможность как-то донести до клиента или прокси информацию о том, что изо всего букета POST является ключом идемпотентности.
P>Куда поедет ключ — дело десятое. Есл клиент генерируется по метаданным, а наружу торчит OO-интерфейс, нам это вообще по барабану, где что лежит. Вылезла пробелема с гатевеем, которй не пропускает наш запрос — поменяли атрибут, добавили @Header или @Encode и всё путём — перебилдили, и всё палит. Не надо вообще думать, что там где на самом деле лежит.
Это какая-то утопия. Покажите мне гатевей, который путём перебилдивания осознает, что какой-то там кусок квери стринга является на самом деле ключом идемпотентности, и сможет делать авто-повторы от имени тупых клиентов, как я показал выше.
P>Клиент — может. А на сервере это нужно мейнтейнить руками.
В этом смысле все подходы равноценны — можно вообще свой собственный глагол замутить, типа CREATE (чтобы не путаться с PUT, который то ли "создать", то ли "изменить").
Всё равно "всё это нужно мейнтейнить руками".
P>Например, какой то шутник решит, что раз изменений нету, то можно и ошибку бросить "already done". И тесты надо написать, что бы такой шутник убедился, что его подход невалидный.
Ну, с тем же успехом шутник может просто на всё возвращать 200 OK, не записывая ничего в базу. Какое отношение это имеет к проектированию?
P>Что касается одаты, то я запилил серверный фремворк для TypeScript поверх оdata протокола собственной разработки, так что вобщем одату понимаю. Кое что портироал на жээс из odata-olingo, кое что из дотнета, остальное допилил самостоятельно. Собственно, это мой текущий проект — кучка фремворков на разные случаи жизни. P>Идемпотентность реализуется ровно так же, как и везде.
Из ваших слов я делаю вывод, что официальные рекомендации вы не читали.
Потому как в ODATA она всё же не такая, как везде.
P>Вот например кейс такой, что нам надо проавать апи и юезр будет выбирать протокол и платить за количество фактически вызваных операций. А он возьми и выбери graphql. Разве мы ему скажем, что теперь про идемпотентность он должен забыть?
Мы с вами, похоже, говорим о разных вещах. Идемпотентность сама по себе является практически единственным способом построения нормальных распределённых приложений.
Понятно, что гольным HTTP мир не исчерпывается; можно оказаться в чистом поле какого-нибудь RPC или вообще низкоуровневого протокола типа TCP, для которого никто о таких вещах и не планировал задумываться.
Там, понятное дело, мы будем городить идемпотентность из палок и верёвок. Ровно как и дельта-енкодинг, кондишнл геты, кондишнл апдейты (они же оптимистик локинг) и прочие небезынтересные штуки.
Но в случае наличия HTTP имеет смысл как можно больше пользоваться уже разработанными спецификациями. В частности потому, что к ним более-менее готовы все существующие инструменты.
А когда вы выходите в чистое поле, то вы и биться там будете один. Можно посмотреть на богомерзкий SOAP, где пошли ровно по этому пути. Когда чтение какого-нибудь Order делается тоже через POST, а идентификатор уезжает в теле. Ну и всё — пришлось громоздить чудовищную гору всех этих полунеобязательных и слабосовместимых WS-* спецификаций, чтобы закатить солнце вручную.
Хорошо, что мы от этого ушли в сторону REST.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[26]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
P>>Урл нам надо сначала отрендерить S>Эта фраза непонятна.
С т.з. разработчика урл составляется из разных кусков, у которых разная семантика, эти куски и есть фактически параметры.
S>Всё верно. 'an-id' является частью URL.
Это и есть явный параметр. Гарантии ничтожные — если нет других реквестов, юзеров, итд, то реквест можно повторять и ждать того же реквеста. Но нам обычно надо побольше.
S>В частности, мы можем сделать GET /Warehouse.svc/Orders('an-id') и получить этот ордер обратно.
А что это меняет? Гарантии то всё равно слабые. Лучше подкинуть хидер prefer и получить результат в выхлопе post.
P>>Для POST мы этот ключ можем положить куда угодно, это непринципиально. S>Принципиальна возможность как-то донести до клиента или прокси информацию о том, что изо всего букета POST является ключом идемпотентности.
Да, для http POST мы не сможем ничего такого сделать, т.к. прокси сверх хттп ничего не понимает. Зато мы можем сделать свой прокси для нашего сервиса, и он сможет обеспечить все, что нужно. Можно и graphql прокси точно так же примастырить, и все будет путём.
S>Это какая-то утопия. Покажите мне гатевей, который путём перебилдивания осознает, что какой-то там кусок квери стринга является на самом деле ключом идемпотентности, и сможет делать авто-повторы от имени тупых клиентов, как я показал выше.
Теоретически это круто, авто-повторы от имени сверх-тонких клиентов, но практически это лучше делать через гатевей, который понимает тот протокол, который поверх хттп. Тогда к нему можно прикрутить кучку дополнительных вещей.
P>>Например, какой то шутник решит, что раз изменений нету, то можно и ошибку бросить "already done". И тесты надо написать, что бы такой шутник убедился, что его подход невалидный. S>Ну, с тем же успехом шутник может просто на всё возвращать 200 OK, не записывая ничего в базу. Какое отношение это имеет к проектированию?
Прямое — идемпотентность нужно изначально закладывать в дизайн и тащить до тестов всех уровней, вне зависимости от того, описано чтото в спецификации хттп или нет.
P>>Идемпотентность реализуется ровно так же, как и везде. S>Из ваших слов я делаю вывод, что официальные рекомендации вы не читали. S>Потому как в ODATA она всё же не такая, как везде.
Да, мы не поддерживаем эту фичу. Собственно, быстро глянул, они предлагают для всех unsafe методов добавлять доп хидеры, один из которых и будет тем самым ключом идемпотентности.
Т.е. внагрузку к урл, будет еще один ключ. Разумная вещь.
P>>Вот например кейс такой, что нам надо проавать апи и юезр будет выбирать протокол и платить за количество фактически вызваных операций. А он возьми и выбери graphql. Разве мы ему скажем, что теперь про идемпотентность он должен забыть? S>Мы с вами, похоже, говорим о разных вещах. Идемпотентность сама по себе является практически единственным способом построения нормальных распределённых приложений.
В том то и дело, и это не зависит от транспорта. Потому имеет смысл втащить ключ идемпотентности в энвелоп в явном виде и сэкономить себе парочку седых волос. Поступай я иначе, была бы уже вся голова седая, а так у меня только клок другой в бороде седой
S>Но в случае наличия HTTP имеет смысл как можно больше пользоваться уже разработанными спецификациями. В частности потому, что к ним более-менее готовы все существующие инструменты.
Я вот шота навскидку не могу представить, какой из сервисов-посредников поддерживает repeatable requests
S>Хорошо, что мы от этого ушли в сторону REST.
Как по мне, так bff/edge-services, graphql и grpc пожрали и рест, и одату целиком. Скажем, на собесах меня перестали спрашивать по рест лет 5 назад. А про одату товарищи только знают, что этото чтото дотнетное, и ни единого вопроса не задают. Подумаешь, мелочовочка — запилить full-blown серверный процессин, фремворк поверх этого, кодогенератор и тд.
Re[26]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>Нет, ключом идемпотентности в PUT и DELETE является url
Не является. Нет в HTTP (и REST) никаких ключей идемпотентности. К одному URL может быть несколько разных запросов. И каждый из этих запросов может выполняться несколько раз. Поэтому идемпотентность (в том смысле, в котором она определена в HTTP) — это свойство именно операции.
Далее. Похоже, в этой теме есть непонимание того, что такое идемпотентность. Прямо по определению (RFC 2616, 9.1.2) идемпотентность говорит, что req(req(state)) == req(state) (и как следствие req(req(req(...(req(state))...))) == req(state). Всё! В общем случае оно даже не гарантирует, что сломавшийся запрос можно безопасно повторять. Причем об этом прямым текстом написано прямо в той же части про идемпотентность. Если у нас есть несколько акторов (субъектов, систем), оперирующих над одним ресурсом, могут наблюдаться различные неприятные эффекты. Например, система А делает PUT /variables/x с содержимым "1". Система Б читает это значение, выполняет какие-то операции, делает PUT /variables/x с содержимым "2". Затем система А повторяет запрос PUT /variables/x со значением "1". В результате система Б может опять обнаружить значение 1 и повторить свои (уже неидемпотентные) действия. И все усложняется тем, что в реальной системе акторов обычно много. Инфраструктура HTTP в виде балансировщиков нагрузки и маршрутизаторов тоже может выступать в качестве акторов. Например, она может приводить к задержкам запросов, что со стороны получателя может выглядеть как изменение порядка запросов от клиента. Поэтому на практике для обеспечения безопасных повторов нужно использовать дополнительные техники:
Во многих случаях можно сделать конечный автомат без циклов. В этом случае перемещение в предыдущие состояния не допускается. Рудиментарная машина с ровно одним переходом (единственная операция — создание ресурса) является частным случаем такого автомата.
В ряде сценариев можно выделить "главную" систему. Например, корзина (basket) в интернет-магазине может уведомлять склад (warehouse), который обновляет остатки. В этом случае корзина — главная система, владеющая информацией. Она всегда знает последнее состояние и уведомляет склад только этим состоянием. В условиях возможности переупорядочивания запросов в состояние/сообщение явно должен входить индикатор порядка (версия/ревизия или время последнего изменения). Конечного автомата здесь нет, но упорядоченность переходов все равно есть.
Наше REST API является главной системой. Например, у нас внутренняя система (backoffice), в которой несколько менеджеров могут одновременно редактировать один заказ или его свойства. В этом случае обычно делается оптимистическая блокировка, которая на уровне HTTP выглядит в виде условных запросов (Conditional Requests). Обычно это If-Match (для существующих ресурсов) и X-If-Not-Exists/CREATE (для создания нового).
В самом HTTP для существующих глаголов есть два типа идемпотентности. Первый наблюдается у безопасных глаголов (GET/HEAD/OPTIONS). У них состояние ресурса не изменяется, т.е. req(state) == state. Второй тип наблюдается у глаголов PUT/DELETE. Для них выполняется семантика перезаписи. Если запрос применим в состояниях s1 и s2, то состояние после выполнения запроса одно и то же: req(s1) == req(s2). На практике для безопасного повторения запросов в системах со многими акторами хотелось бы больших гарантий. Например, req(req1(req2(...(reqN(req(state)))...))) == req1(req2(...(reqN(req(state)))...)) (т.е. если запрос был выполнен ранее, его повторение не приведет к изменению состояний). Готового глагола с такой семантикой нет. Но операции — есть. Например, движение по конечному автомату без циклов. В этом случае большинство запросов имеют семантику req(state) == max(state, newState). В этом случае повторное выполнение в любом состоянии будет безопасно.
Явный ключ идемпотентности (как в POST) в REST моделируется через команды и рудиментарный конечный автомат с ровно одной операцией (PUT с семантикой CREATE), доступной клиенту. Что-то вроде PUT /resources/xxx/operations/<unique-op-id>. Но, опять же, в данном случае требуемые свойства системы достигаются за счет того, как определен автомат. Технически ресурс может поддерживать больше операций. Например, поддерживать отмену запроса в виде глагола DELETE. И в этом случае можно создавать гонки между PUT/DELETE на одном ресурсе (с разным содержимым команд).
Re[27]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Нет, ключом идемпотентности в PUT и DELETE является url M>Не является. Нет в HTTP (и REST) никаких ключей идемпотентности. К одному URL может быть несколько разных запросов. И каждый из этих запросов может выполняться несколько раз. Поэтому идемпотентность (в том смысле, в котором она определена в HTTP) — это свойство именно операции.
Что такое "операция"? Видимо речь о запросе, запрос это Метод+URL+Тело+Заголовки
Предложение оппонента сделать "идемпотентность" по полю тела или заголовка.
M>Далее. Похоже, в этой теме есть непонимание того, что такое идемпотентность. Прямо по определению (RFC 2616, 9.1.2) идемпотентность говорит, что req(req(state)) == req(state) (и как следствие req(req(req(...(req(state))...))) == req(state). Всё! В общем случае оно даже не гарантирует, что сломавшийся запрос можно безопасно повторять.
Как раз гарантирует. В случае неполучения ответа (пропадания связи) или ответа 500 можно повторять идемпотентный запрос пока не получишь другой ответ.
M>Причем об этом прямым текстом написано прямо в той же части про идемпотентность. Если у нас есть несколько акторов (субъектов, систем), оперирующих над одним ресурсом, могут наблюдаться различные неприятные эффекты. Например, система А делает PUT /variables/x с содержимым "1". Система Б читает это значение, выполняет какие-то операции, делает PUT /variables/x с содержимым "2". Затем система А повторяет запрос PUT /variables/x со значением "1". В результате система Б может опять обнаружить значение 1 и повторить свои (уже неидемпотентные) действия.
Это к идемпотентности не имеет отношения. Это состояние гонки и с ним надо бороться другими методами.
Идемпотентность позволяет повторять запросы пока ты не получил ответа совсем (связи нет) или получил 500 (ошибка на стороне сервера). При получении любого другого ответа надо прекратить повторы.
M>И все усложняется тем, что в реальной системе акторов обычно много. Инфраструктура HTTP в виде балансировщиков нагрузки и маршрутизаторов тоже может выступать в качестве акторов. Например, она может приводить к задержкам запросов, что со стороны получателя может выглядеть как изменение порядка запросов от клиента. Поэтому на практике для обеспечения безопасных повторов нужно использовать дополнительные техники: M>
M> Во многих случаях можно сделать конечный автомат без циклов. В этом случае перемещение в предыдущие состояния не допускается. Рудиментарная машина с ровно одним переходом (единственная операция — создание ресурса) является частным случаем такого автомата. M> В ряде сценариев можно выделить "главную" систему. Например, корзина (basket) в интернет-магазине может уведомлять склад (warehouse), который обновляет остатки. В этом случае корзина — главная система, владеющая информацией. Она всегда знает последнее состояние и уведомляет склад только этим состоянием. В условиях возможности переупорядочивания запросов в состояние/сообщение явно должен входить индикатор порядка (версия/ревизия или время последнего изменения). Конечного автомата здесь нет, но упорядоченность переходов все равно есть. M> Наше REST API является главной системой. Например, у нас внутренняя система (backoffice), в которой несколько менеджеров могут одновременно редактировать один заказ или его свойства. В этом случае обычно делается оптимистическая блокировка, которая на уровне HTTP выглядит в виде условных запросов (Conditional Requests). Обычно это If-Match (для существующих ресурсов) и X-If-Not-Exists/CREATE (для создания нового). M>
В общем случае только последнее имеет смысл. Только к идемпотентности не имеет отношения. Так как даже без повторения запросов можно получить эти проблемы. Кстати способ разрешения конфликтов в вебе был описан раньше REST https://www.w3.org/1999/04/Editing/
M>В самом HTTP для существующих глаголов есть два типа идемпотентности. Первый наблюдается у безопасных глаголов (GET/HEAD/OPTIONS). У них состояние ресурса не изменяется, т.е. req(state) == state. Второй тип наблюдается у глаголов PUT/DELETE. Для них выполняется семантика перезаписи.
Это называется SAFE и IDEMPOTENT
M>Явный ключ идемпотентности (как в POST) в REST моделируется через команды и рудиментарный конечный автомат с ровно одной операцией (PUT с семантикой CREATE), доступной клиенту. Что-то вроде PUT /resources/xxx/operations/<unique-op-id>. Но, опять же, в данном случае требуемые свойства системы достигаются за счет того, как определен автомат. Технически ресурс может поддерживать больше операций. Например, поддерживать отмену запроса в виде глагола DELETE. И в этом случае можно создавать гонки между PUT/DELETE на одном ресурсе (с разным содержимым команд).
Суть разговора была в том, что оппонент предлагает использовать POST и <unique-op-id> в теле или заголовке
Re[28]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
M>>Явный ключ идемпотентности (как в POST) в REST моделируется через команды и рудиментарный конечный автомат с ровно одной операцией (PUT с семантикой CREATE), доступной клиенту. Что-то вроде PUT /resources/xxx/operations/<unique-op-id>. Но, опять же, в данном случае требуемые свойства системы достигаются за счет того, как определен автомат. Технически ресурс может поддерживать больше операций. Например, поддерживать отмену запроса в виде глагола DELETE. И в этом случае можно создавать гонки между PUT/DELETE на одном ресурсе (с разным содержимым команд). G>Суть разговора была в том, что оппонент предлагает использовать POST и <unique-op-id> в теле или заголовке
Тут Синклер скинул ссылку на спеку Repeatable Request, вобщем, это оно и есть. Просто Shmj зашел слишком издалека.
Re[27]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали: P>Это и есть явный параметр. Гарантии ничтожные — если нет других реквестов, юзеров, итд, то реквест можно повторять и ждать того же реквеста. Но нам обычно надо побольше.
Эти гарантии замечательны тем, что хорошо известны всем клиентам — независимо от степени их обученности нашей самоизобретённой супер-технологии. P>А что это меняет? Гарантии то всё равно слабые. Лучше подкинуть хидер prefer и получить результат в выхлопе post.
Речь не о том, что мы хотим сделать GET-после-PUT, а в некоторых мета-соглашениях об API.
Вот, к примеру, когда я вижу, что для создания нового экземпляра мне предлагается сделать POST на некий URL, у меня нет никакой информации о том, где я потом буду эту сущность запрашивать.
Ну да, обычно я могу увидеть список этих сущностей, выполнив GET на тот же URL. И тем не менее — не всегда понятно, чем именно адресуется конкретная сущность.
Никакие prefer тут не помогут.
P>Да, для http POST мы не сможем ничего такого сделать, т.к. прокси сверх хттп ничего не понимает. Зато мы можем сделать свой прокси для нашего сервиса, и он сможет обеспечить все, что нужно. Можно и graphql прокси точно так же примастырить, и все будет путём.
Вы рассуждаете в рамках модели, где и сервер и клиент пишутся вами.
Я же рассматриваю более широкий случай — когда мы пишем что-то одно. То есть либо мы пишем клиента к существующему сервису, либо пишем сервис для неопределённого круга клиентов.
У нас нет вот этой роскоши "поменять аннотацию и перекомпилировать гатевей", потому что мы вообще не контролируем вторую сторону.
Если мы вдруг решим перенести ключ идемпотентности из тела в хидер на стороне сервера, то это просто означает, что сколько-то тысяч клиентов упадут после деплоймента.
А когда мы пишем клиента, у нас возникает вопрос "а как узнать, что и как себя ведёт". Про требования идемпотентности PUT мы знаем из публичных RFC, поэтому пишем наш код соответствующим образом.
Для POST мы должны глазами читать спецификацию на естественном языке. Которая очень редко бывает исчерпывающей, кстати.
Обратите внимание, как замудрёно прикрутили идемпотентность POST к OData — там ещё и предусмотрен способ ограничить продолжительность обязанности сервера по поддержке идемпотентности.
Это придумали практики. Очень может так оказаться, что сервис, который анонсировал идемпотентность в спецификации, на самом деле способен её придерживаться не бесконечно.
P>Теоретически это круто, авто-повторы от имени сверх-тонких клиентов, но практически это лучше делать через гатевей, который понимает тот протокол, который поверх хттп. Тогда к нему можно прикрутить кучку дополнительных вещей.
Осталось понять, где мы его возьмём.
P>Прямое — идемпотентность нужно изначально закладывать в дизайн и тащить до тестов всех уровней, вне зависимости от того, описано чтото в спецификации хттп или нет.
Всё верно. Объём работы на серверной стороне никак не зависит от того, каким именно способом сделана идемпотентность. Более того — он будет таким же и для RPC-based подходов.
Потому что чудес не бывает. Если я изобрету способ делать идемпотентность без помощи прикладного программиста, то быстро заработаю многоденег
P>Да, мы не поддерживаем эту фичу. Собственно, быстро глянул, они предлагают для всех unsafe методов добавлять доп хидеры, один из которых и будет тем самым ключом идемпотентности. P>Т.е. внагрузку к урл, будет еще один ключ. Разумная вещь.
Эта часть — она как у всех. Невозможно сделать POST идемпотентным без ключа идемпотентности.
P>В том то и дело, и это не зависит от транспорта. Потому имеет смысл втащить ключ идемпотентности в энвелоп в явном виде и сэкономить себе парочку седых волос. Поступай я иначе, была бы уже вся голова седая, а так у меня только клок другой в бороде седой
Что такое "в енвелоп"?
Давайте с другой стороны зайдём — у вас же в API авторизация есть? Указываете ли вы "bearerToken" в виде явного параметра у метода BL?
P>Я вот шота навскидку не могу представить, какой из сервисов-посредников поддерживает repeatable requests
Навскидку — никакой. К сожалению.
В итоге, авторы АПИ прикручивают авто-повторы к своим клиентским библиотекам.
Понятно, что в таком подходе можно выбирать любой вариант реализации идемпотентности: https://ably.com/topic/idempotency
Обратите внимание — с т.з. клиента никакого ключа идемпотентности у операции publish нету:
S>>Хорошо, что мы от этого ушли в сторону REST.
P>Как по мне, так bff/edge-services, graphql и grpc пожрали и рест, и одату целиком. Скажем, на собесах меня перестали спрашивать по рест лет 5 назад. А про одату товарищи только знают, что этото чтото дотнетное, и ни единого вопроса не задают. Подумаешь, мелочовочка — запилить full-blown серверный процессин, фремворк поверх этого, кодогенератор и тд.
Ну, для меня REST — это прежде всего подход, а уже во вторую очередь — какой-то конкретный фреймворк и стандарт обмена данными.
Тот же graphQL не противоречит REST-у. C grpc сложнее — он эдакий кадавр, который может реализовать и RESTful, и RPC-style сервис.
Про bff/edge-services ничего не знаю.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[28]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
P>>А что это меняет? Гарантии то всё равно слабые. Лучше подкинуть хидер prefer и получить результат в выхлопе post. S>Речь не о том, что мы хотим сделать GET-после-PUT, а в некоторых мета-соглашениях об API. S>Вот, к примеру, когда я вижу, что для создания нового экземпляра мне предлагается сделать POST на некий URL, у меня нет никакой информации о том, где я потом буду эту сущность запрашивать. S>Ну да, обычно я могу увидеть список этих сущностей, выполнив GET на тот же URL. И тем не менее — не всегда понятно, чем именно адресуется конкретная сущность. S>Никакие prefer тут не помогут.
POST /Orders вернет тебе хидер Location + опционально саму сущность, для которой, например, в одата, будет установлена метадата, типа @odata.editUrl или @odata.readUrl.
То есть, ажно два способа получить ровно то, что тебе надо.
Только при чем здесь идемпотентность?
S>У нас нет вот этой роскоши "поменять аннотацию и перекомпилировать гатевей", потому что мы вообще не контролируем вторую сторону. S>Если мы вдруг решим перенести ключ идемпотентности из тела в хидер на стороне сервера, то это просто означает, что сколько-то тысяч клиентов упадут после деплоймента.
Упадут. Это я мальца погорячился.
S>А когда мы пишем клиента, у нас возникает вопрос "а как узнать, что и как себя ведёт". Про требования идемпотентности PUT мы знаем из публичных RFC, поэтому пишем наш код соответствующим образом. S>Для POST мы должны глазами читать спецификацию на естественном языке. Которая очень редко бывает исчерпывающей, кстати.
Если нужны внятные гарантии повторяемости запроса, читать придется и там, и там. Другого варианта нет.
S>Обратите внимание, как замудрёно прикрутили идемпотентность POST к OData — там ещё и предусмотрен способ ограничить продолжительность обязанности сервера по поддержке идемпотентности.
Не только POST,а PUT, PATCH и еще DELETE. Т.е. речь о том, что встроеной в хттп идемпотентности мало на что хватает.
P>>Теоретически это круто, авто-повторы от имени сверх-тонких клиентов, но практически это лучше делать через гатевей, который понимает тот протокол, который поверх хттп. Тогда к нему можно прикрутить кучку дополнительных вещей. S>Осталось понять, где мы его возьмём.
Напишем, разумеется. Его всё равно придется писать, в том или ином виде, если только не закладываться полностью на фичи клауда.
S>Потому что чудес не бывает. Если я изобрету способ делать идемпотентность без помощи прикладного программиста, то быстро заработаю многоденег
P>>В том то и дело, и это не зависит от транспорта. Потому имеет смысл втащить ключ идемпотентности в энвелоп в явном виде и сэкономить себе парочку седых волос. Поступай я иначе, была бы уже вся голова седая, а так у меня только клок другой в бороде седой S>Что такое "в енвелоп"? S>Давайте с другой стороны зайдём — у вас же в API авторизация есть? Указываете ли вы "bearerToken" в виде явного параметра у метода BL?
Нету. Её берет на себя гатевей, который физически reverse proxy. Реализация АПИ просто получает этот токен через context.authorization.
S>В итоге, авторы АПИ прикручивают авто-повторы к своим клиентским библиотекам.
А потому что автоповторы они разные, для какогото запроса хватит одного повтора, для какого то — серии, для других — долбить до посинения, пока 200 не вылезет. И это может повлечь изменение архитектуры, например, добавится message queue
S>Про bff/edge-services ничего не знаю.
Это способ логически вытащить часть фронтенда на сервер. Здесь нам вообще может хватить на всё одного POST, все остальные исключительно ради оптимизации под конкретные сценарии, и то не всегда.
Фактически, edge-service или bff это ручная реализация api гатевея, который умеет много всего — подклеивать авторизацию, трансформировать запрос, дергать кучу сервисов, повторять запросы и тд и тд. Буквально бизнес-логику такой сервис не выполняет, ну разве что валидацию парметров. Получается чтото среднее между http rest и graphql.
Со стороны страны все выглядит как вызов ровно одного метода типа documentPage.getFullData() и так вне зависимости от того, где делаем запрос — в браузере, в server side rendering, или изнутри другого сервиса.
Самое главное для этого бфф, это склейка клиента и сервера, что бы трансформировать апи можно было влёгкую и не надо было переписывать все тесты, если перетащил параметр из хидера в квери или наоборот.
Соответственно rest ушел в api фасад какого ресурса, который из внешней сети недоступен.
Re[28]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>Что такое "операция"? Видимо речь о запросе, запрос это Метод+URL+Тело+Заголовки
Да, вот это вот всё.
G>Предложение оппонента сделать "идемпотентность" по полю тела или заголовка.
Нет. У оппонента предложение сделать именно "сильную" идемпотентность (не RFC-шную) по какому-либо ключу. Чтобы даже если есть другие (конкурирующие) операции между последовательными запросами, то операция не повторялась. Вряд ли мы говорим о том, что если вдруг сервер получает два разных запроса с одним и тем же idempotency key, то он должен выполнить новый запрос (это именно RFC-семантика). Ну и если уж быть совсем педантом, для идемпотентности на уровне RFC не нужно вообще никаких idempotency key. Сервер (инфраструктура) может просто запоминать последний запрос к ресурсу и просто выдавать сохраненный ответ, если запрос повторяется. Нет же, оппонент хочет какие-то idempotency key. Значит, мы все же о чем-то другом говорим. И вот обычно под idempotency key имеется в виду, что запрос может быть безопасно повторен при наличии конкурентных запросов.
M>>Далее. Похоже, в этой теме есть непонимание того, что такое идемпотентность. Прямо по определению (RFC 2616, 9.1.2) идемпотентность говорит, что req(req(state)) == req(state) (и как следствие req(req(req(...(req(state))...))) == req(state). Всё! В общем случае оно даже не гарантирует, что сломавшийся запрос можно безопасно повторять. G>Как раз гарантирует. В случае неполучения ответа (пропадания связи) или ответа 500 можно повторять идемпотентный запрос пока не получишь другой ответ.
Гарантирует только при условии остутствия гонок (параллельных небезопасных запросов к тому же ресурсу). А если есть гонки, идемпотентность ничего не гарантирует.
G>Это к идемпотентности не имеет отношения. Это состояние гонки и с ним надо бороться другими методами.
Это имеет самое прямое отношение. В некоторых случаях методы борьбы с гонками настолько суровые, что идемпотентность нам больше не нужна. Допустим, мы решили, что все запросы от клиентов должны быть условные (conditional). С этого момента нам идемпотентность ничем не поможет. Потому что либо запрос проходит (и тогда мы знаем, что состояние не изменилось). Либо не проходит с диагностикой о том, что условие не выполняется и нужно разбираться с тем, какое же новое состояние имеет объект. Идемпотентность — один из способов обеспечения надежности, когда условия позволяют ее использовать.
M>>В самом HTTP для существующих глаголов есть два типа идемпотентности. Первый наблюдается у безопасных глаголов (GET/HEAD/OPTIONS). У них состояние ресурса не изменяется, т.е. req(state) == state. Второй тип наблюдается у глаголов PUT/DELETE. Для них выполняется семантика перезаписи. G>Это называется SAFE и IDEMPOTENT
Первые — полностью согласен. Со вторыми сложнее. Класс (небезопасных) идемпотентных операций шире, чем представленный PUT и DELETE. Т.е. PUT и DELETE — идемпотентные, да. Но могут быть и идемпотентные глаголы с другой семантикой.
G>Суть разговора была в том, что оппонент предлагает использовать POST и <unique-op-id> в теле или заголовке
К сожалению, оппонент при этом не дает определения идемпотентности операции, которое он хочет достичь. И мне почему-то кажется, что здесь используется не RFC-шное определение.
Re[14]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Чтобы идемпотентностью пользоваться, нужен какой-то код обвязки вызовов на клиенте. S>То есть, мы не просто делаем где-то в коде клиента httpClient.PostAsync(orderServiceUrl, orderUpdateContent). Нам надо S>1. Записать в локальную базу инфу о том, что "worflow #xxxxxxx is going to update the order #yyyyyyy, idempotence key #kkkkk, update params $pppppppp". S>2. Попытаться выполнить тот самый POST, или PUT, или PATCH S>3. В зависимости от результата либо перейти по успешной ветке, либо по ветке неудачи, либо вернуться на шаг 2.
Спасибо! Это очень существенный момент. Обычно для идемпотентного PUT таких приседаний не нужно. В хорошем API можно просто посылать желаемое (т.е. с точки зрения клиента — текущее) состояние и в случае конфликтов разбираться, где что-то пошло не так.
С явными ключами идемпотентности нет проблем только в браузере. Если браузер был закрыт, запрос можно не повторять. А вот в API, к которому может обращаться сервер, явные ключи идемпотентности могут быть очень неудобны как раз потому, что их нужно генерировать и сохранять. Хотя бы на случай, когда данный инстанс будет остановлен и операцию докатывать будет уже другой экземпляр сервера.
Re[15]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Спасибо! Это очень существенный момент. Обычно для идемпотентного PUT таких приседаний не нужно. В хорошем API можно просто посылать желаемое (т.е. с точки зрения клиента — текущее) состояние и в случае конфликтов разбираться, где что-то пошло не так.
Я не очень понял, что вы имеете в виду под выделенным. Ну, можно просто игнорировать идемпотентность в интерактивных приложениях, оставляя пользователя наедине с request timed out.
Но если хочется хоть как-то пользоваться идемпотентностью, то нужна собственно логика повторов. Опять же, в интерактивном приложении мы можем выполнять шаг 1 не в персистентное хранилище, а просто держать всё в памяти.
Тогда идемпотентность будет ограничена временем жизни конкретного экземпляра приложения (а то и конкретного окна).
M>С явными ключами идемпотентности нет проблем только в браузере. Если браузер был закрыт, запрос можно не повторять. А вот в API, к которому может обращаться сервер, явные ключи идемпотентности могут быть очень неудобны как раз потому, что их нужно генерировать и сохранять. Хотя бы на случай, когда данный инстанс будет остановлен и операцию докатывать будет уже другой экземпляр сервера.
Совершенно верно. Сервер должен быть всегда готов к собственному сбою. По-другому никак нельзя.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
M>>Обычно для идемпотентного PUT таких приседаний не нужно. В хорошем API можно просто посылать желаемое (т.е. с точки зрения клиента — текущее) состояние и в случае конфликтов разбираться, где что-то пошло не так. S>Я не очень понял, что вы имеете в виду под выделенным.
У меня в основном серверные приложения. Типичный сценарий подразумевает, что в какой-то момент объект получает состояние "sending to provider" (без детализации но с разными таймаутами для повторов). В этом состоянии сервер посылает запрос. При успехе — обновляет состояние в базе. При ошибке — ничего не делает. Еще есть универсальный докат транзакций. Он выполняет "select * from entities where state == 'sending to provider'" и далее делает обычный PUT. Все это — относительно просто и универсально. Состояния явно соовтетствуют тому, что происходит на сервере.
Добавление ключей идемпотентности усложняет схему. В состояние добавляется новое поле "ключ идемпотентности". В ряде случаев это не очень сложно. В других — сложно. Например, может быть распределенная архитектура с микроядром (distributed microkernel architecture). Ядро обеспечивает общее изменение состояний. Интеграции с провайдерами обычно получают запрос от ядра, конвертируют его в формат провайдера и отправляют дальше. Во многих случаях эти интеграции вообще без состояния. Т.е. просто взяли запрос, преобразовали его (переместили поля, изменили названия и т.п.), отправили дальше. Потом разобрали/поменяли ответ и передали ядру. Добавление ключей идемпотентности запросто превращается в приключение. Нет никакой гарантии того, что у разных провайдеров будет одинаковый формат ключа. Поэтому приходится делать какую-то кастомизацию. Либо отдельный вызов для генерации таких ключей, либо генерация ключей идемпотентности в модуле интеграции. Во втором случае модуль получает свою отдельную базу данных. Это не всегда плохо, но и не всегда хорошо.
В общем, явные ключи идемпотентности добавляют лишние приседания (на сервере, да), которые не имеют естественного отображения в доменную модель. И добавляет совершенно синтетические атрибуты. А вот PUT (с состоянием "мы посылаем") — вполне естественное состояние в доменной модели. С браузером или клиентом проблем как раз гораздо меньше.
Re[29]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Что такое "операция"? Видимо речь о запросе, запрос это Метод+URL+Тело+Заголовки M>Да, вот это вот всё.
G>>Предложение оппонента сделать "идемпотентность" по полю тела или заголовка. M>Нет. У оппонента предложение сделать именно "сильную" идемпотентность (не RFC-шную) по какому-либо ключу. Чтобы даже если есть другие (конкурирующие) операции между последовательными запросами, то операция не повторялась. Вряд ли мы говорим о том, что если вдруг сервер получает два разных запроса с одним и тем же idempotency key, то он должен выполнить новый запрос (это именно RFC-семантика). Ну и если уж быть совсем педантом, для идемпотентности на уровне RFC не нужно вообще никаких idempotency key. Сервер (инфраструктура) может просто запоминать последний запрос к ресурсу и просто выдавать сохраненный ответ, если запрос повторяется. Нет же, оппонент хочет какие-то idempotency key. Значит, мы все же о чем-то другом говорим. И вот обычно под idempotency key имеется в виду, что запрос может быть безопасно повторен при наличии конкурентных запросов.
Очень, очень верное замечание.
Есть ли ссылки на готовые материалы почитать по данной теме?
Я не припомню, чтобы я встречал где-то рассуждения о слабой/сильной идемпотентностях; хотя, очевидно, желанной является вторая.
Вот у нас есть три клиента — A, B, С,
1. A создаёт объект X.
2. B находит объект X, и модифицирует его (назовём новое состояние X').
3. С находит объект X' и удаляет его.
Теперь представим, что у всех троих нестабильная связь. Очевидно, что A должен иметь возможность повторять попытки создать X и после момента 2, и после момента 3.
При этом мы ожидаем, что он таки получит свой 201 — c его точки зрения, это первая успешная попытка создания.
Чего мы не ожидаем:
— что после 2 он получит 4хх — это бы выглядело так, как будто он сделал что-то нехорошее (пытается создать объект-дубликат)
— что после 2 он получит 200/201 и X' вернётся обратно в X (это бы нарушило ожидания B)
— что после 3 он восстановит X из мёртвых — это бы нарушило ожидания C
B, в свою очередь, должен иметь возможность продолжать повторять попытки изменения X.
По тем же причинам мы ожидаем, что даже после 3 он получит 200/202, а не 410 Gone и не восстановит X' из мёртвых.
При этом, очевидно, семантика RFC для этого совершенно недостаточна.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[30]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>При этом, очевидно, семантика RFC для этого совершенно недостаточна.
Какой RFC имеется ввиду?
Все что необходимо для решения проблемы конкурентного обновления есть в https://httpwg.org/specs/rfc9110.html
Даже два механизма:
— заголовок ответа Last-Modified и изголовки запросов If-Modified-Since, If-Unmodifieed-Since
— заголовок ответа Etag и изголовки запросов If-Match, If-None-Match
Предполагается что в случае невыполнения условия сервер должен вернуть 412 Precondition Failed
S>Я не припомню, чтобы я встречал где-то рассуждения о слабой/сильной идемпотентностях; хотя, очевидно, желанной является вторая.
Потому что оно так никогда не называлось.
Идемпотентность по той же ссылке определяется вот так:
Idempotent methods are distinguished because the request can be repeated automatically if a communication failure occurs before the client is able to read the server's response
Нет никаких рассуждений о "сильной" или "слабой"
Re[30]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, maxkar, Вы писали:
M>>Нет. У оппонента предложение сделать именно "сильную" идемпотентность (не RFC-шную) по какому-либо ключу. Чтобы даже если есть другие (конкурирующие) операции между последовательными запросами, то операция не повторялась. Вряд ли мы говорим о том, что если вдруг сервер получает два разных запроса с одним и тем же idempotency key, то он должен выполнить новый запрос (это именно RFC-семантика). Ну и если уж быть совсем педантом, для идемпотентности на уровне RFC не нужно вообще никаких idempotency key. Сервер (инфраструктура) может просто запоминать последний запрос к ресурсу и просто выдавать сохраненный ответ, если запрос повторяется. Нет же, оппонент хочет какие-то idempotency key. Значит, мы все же о чем-то другом говорим. И вот обычно под idempotency key имеется в виду, что запрос может быть безопасно повторен при наличии конкурентных запросов.
S>Очень, очень верное замечание. S>Есть ли ссылки на готовые материалы почитать по данной теме? S>Я не припомню, чтобы я встречал где-то рассуждения о слабой/сильной идемпотентностях; хотя, очевидно, желанной является вторая.
S>Вот у нас есть три клиента — A, B, С,
S>1. A создаёт объект X. S>2. B находит объект X, и модифицирует его (назовём новое состояние X'). S>3. С находит объект X' и удаляет его.
У нас есть понятие идемпотентности метода, но не группы методов, связанных некой замысловатой семантикой. Т.е. мы можем говорить об идемпотентности PUT отдельно от идемпотентности DELETE, и у нас нет идемпотентности пары PUT+DELETE.
В этом наборе операций для A/B/C у нас ведь есть еще и GET, который вызвается в момент "находит"? Или это кондишнл PUT/DELETE? Если есть GET и параллельные операции создания, то уже одного PUT и GET достаточно что бы получить состояние гонки даже с одним клиентом. Методы PUT и GET должны вызываться взаимоисключающим образом и только так. Пока не получен ответ на PUT, все ответы GET будут скомпрометированы и наоборот. Это даже вне кондишнл и идемпотентности.
В ситуации с несколькими клиентами мы не в силах контролировать время отправки запроса и получения ответа на другом клиенте, т.е. все полученные с сервера ответы, даже без намеков на проблемы транспорта, оптимистические в лучшем случае.
Мы можем лишь придумать непротиворечивое поведение, решающее гонки в некоторых случаях, но это будет всего лишь наше решение, не имеющее ничего общего с идемпотентностью "группы методов со связанной семантикой".
S>Теперь представим, что у всех троих нестабильная связь. Очевидно, что A должен иметь возможность повторять попытки создать X и после момента 2, и после момента 3.
А дело же не только в связи. Пользователю приспичило в туалет, он захлопнул крышку ноута, ноут сделал кибернейт, а после туалета оказалось, что рабочее время вышло и запрос на удаление найденного в пятницу X вылетит лишь в понедельник. А может и не вылететь, если у ноута села батарейка. S>При этом мы ожидаем, что он таки получит свой 201 — c его точки зрения, это первая успешная попытка создания. S>Чего мы не ожидаем: S>- что после 2 он получит 4хх — это бы выглядело так, как будто он сделал что-то нехорошее (пытается создать объект-дубликат) S>- что после 2 он получит 200/201 и X' вернётся обратно в X (это бы нарушило ожидания B) S>- что после 3 он восстановит X из мёртвых — это бы нарушило ожидания C S>B, в свою очередь, должен иметь возможность продолжать повторять попытки изменения X. S>По тем же причинам мы ожидаем, что даже после 3 он получит 200/202, а не 410 Gone и не восстановит X' из мёртвых. S>При этом, очевидно, семантика RFC для этого совершенно недостаточна.
За данную задачу не скажу, не вижу, как ее решить правильно, требования не доконца ясны. Но в проекте корпоративной облачной файлопомойки, в котором я работаю, одноэтапное создание ресурса приводило к неизбежным гонкам, когда ресурс, созданный клиентом А, удалялся клиентом Б до момента получения А ответа о создании. Т.е. А продолжал его создавать при потере ответа сервера о создании, что было неприемлемо. Но в задаче A/B/C это вроде штатный сценарий.
Максимально стабильное решение получилось собрать с двухэтапным созданием ресурсов. Create POST-ом получает сессию с идентификатором нового ресурса, а CompleteCreate завершает создание ресурса на сервере, фактически публикуя созданный ранее скрытый ресурс. Состояние создания ресурса для клиента персистентно, он закончит его создание даже после ребута.
Своим примером я хочу показать, что задача примерно та же, отличается небольшой деталью, но рабочего решения за счет идемпотенетности или кондишнл не видно.
Тут нет задачи проявлять изобретательность в каждом конкретном случае. Можно же задачу обновления ресурса/коллекции ресурсов строить на общих подходах, например CASUpdate, где ключом будет версия/хэш/ETag ресурса. Аки в GIT. Уже упоминал где-то в начале темы.
Немного неизящно, т.к. мы не сможем ничего создать, не получив последнее состояние/версию ресурса. Не сгодится для высоконагруженных систем без троттлинга со стороны клиентов. А в целлом будет как-то работать.
Re[31]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Sinclair, Вы писали:
S>>При этом, очевидно, семантика RFC для этого совершенно недостаточна. G>Какой RFC имеется ввиду?
2616 и 9110.
G>Все что необходимо для решения проблемы конкурентного обновления есть в https://httpwg.org/specs/rfc9110.html G>Даже два механизма: G>- заголовок ответа Last-Modified и изголовки запросов If-Modified-Since, If-Unmodifieed-Since G>- заголовок ответа Etag и изголовки запросов If-Match, If-None-Match G>Предполагается что в случае невыполнения условия сервер должен вернуть 412 Precondition Failed
Это нарушает ожидания от "сильной идемпотентности". И даже с этими хидерами у нас нет никакой гарантии соблюдения идемпотентности в случае взаимодействия с сервером нескольких клиентов.
Попробуйте "починить" приведённый мной пример при помощи добавления этих заголовков в запросы и ответы.
Парочку из аномалий вы предотвратите, но не все.
S>>Я не припомню, чтобы я встречал где-то рассуждения о слабой/сильной идемпотентностях; хотя, очевидно, желанной является вторая. G>Потому что оно так никогда не называлось.
G>Идемпотентность по той же ссылке определяется вот так: G>
G>Idempotent methods are distinguished because the request can be repeated automatically if a communication failure occurs before the client is able to read the server's response
G>Нет никаких рассуждений о "сильной" или "слабой"
В том-то и дело, что в спеке неявно подразумевается, что клиент — единственный, кто взаимодействует с заданным ресурсом на сервере.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[31]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, samius, Вы писали:
S>У нас есть понятие идемпотентности метода, но не группы методов, связанных некой замысловатой семантикой. Т.е. мы можем говорить об идемпотентности PUT отдельно от идемпотентности DELETE, и у нас нет идемпотентности пары PUT+DELETE.
Нет никакой пары. Каждый клиент "видит" только себя и сервер, и пытается реализовать наилучшую, на его взгляд, стратегию работы.
S>В этом наборе операций для A/B/C у нас ведь есть еще и GET, который вызвается в момент "находит"?
Да, конечно. Клиенты B и C используют GET (причём, скорее всего, на уровень выше в иерархии — типа "дай мне список X подходящих под условие отбора")ю
S>Или это кондишнл PUT/DELETE? Если есть GET и параллельные операции создания, то уже одного PUT и GET достаточно что бы получить состояние гонки даже с одним клиентом. Методы PUT и GET должны вызываться взаимоисключающим образом и только так. Пока не получен ответ на PUT, все ответы GET будут скомпрометированы и наоборот. Это даже вне кондишнл и идемпотентности.
С чего бы это вдруг? С точки зрения сервера, первый же PUT был успешным. У него нет никаких причин полагать, что A не получил ответ. Стало быть, он считает X вполне себе валидным ресурсом, который доступен для произвольных манипуляций B и C. S>В ситуации с несколькими клиентами мы не в силах контролировать время отправки запроса и получения ответа на другом клиенте, т.е. все полученные с сервера ответы, даже без намеков на проблемы транспорта, оптимистические в лучшем случае.
Это всего лишь влияет на то, что B получает в своей выдаче. Относительность времени между A и B означает, что B мог не увидеть X, если сервер трактует его GET как прибывший раньше PUT.
Но если B "нашёл" X, то сервер уже не может "притвориться", что X нету.
Ок, опытный B, конечно же, примет меры для предотвращения lost update — в частности, в своём PUT он подложит If-Match, чтобы нечаянно не сломать потенциальных конкурентов, которые могли успеть сделать из X X" в промежутке между GET и PUT. Но смотрите, в чём беда — при повторах своего update B рискует дождаться момента после 3:DELETE, пришедшего от C. Что делать серверу? Формально, If-Match требует отдать 4хх, т.к. ожидаемого X там больше нет.
Если это и будет первым успешно доставленным респонсом на запросы B, то он будет введён в заблуждение. B будет считать, что он так и не успел обновить X перед удалением. А это не так, и это может быть важно из-за семантики приложения.
S>>Теперь представим, что у всех троих нестабильная связь. Очевидно, что A должен иметь возможность повторять попытки создать X и после момента 2, и после момента 3. S>А дело же не только в связи. Пользователю приспичило в туалет, он захлопнул крышку ноута, ноут сделал кибернейт, а после туалета оказалось, что рабочее время вышло и запрос на удаление найденного в пятницу X вылетит лишь в понедельник. А может и не вылететь, если у ноута села батарейка.
Всё верно. Но если запрос на удаление таки поедет в понедельник, то никакого противоречия не будет — что бы там ни ответил сервер, это будет корректно. Например, вмешался D, который изменил Х' на X", и теперь его нельзя удалять без проверки. Отлично. Но если удаление таки прошло в пятницу, а в понедельник сервер делает вид, что ничего такого не было — это уже ай-яй-яй.
S>За данную задачу не скажу, не вижу, как ее решить правильно, требования не доконца ясны. Но в проекте корпоративной облачной файлопомойки, в котором я работаю, одноэтапное создание ресурса приводило к неизбежным гонкам, когда ресурс, созданный клиентом А, удалялся клиентом Б до момента получения А ответа о создании. Т.е. А продолжал его создавать при потере ответа сервера о создании, что было неприемлемо. Но в задаче A/B/C это вроде штатный сценарий.
Нет, это как раз вырожденный вариант, в котором участвуют A и C. В хорошей реализации, независимо от проблем связи, ресурс X должен на сервере проходить жизненный цикл "появился-умер" однократно.
А не так, что он будет "мерцать", пока A и C борются с недоставкой ответов, и результат зависит только от того, у кого их них первым восстановится двусторонняя связь.
S>Максимально стабильное решение получилось собрать с двухэтапным созданием ресурсов. Create POST-ом получает сессию с идентификатором нового ресурса, а CompleteCreate завершает создание ресурса на сервере, фактически публикуя созданный ранее скрытый ресурс. Состояние создания ресурса для клиента персистентно, он закончит его создание даже после ребута.
Звучит как реализация той самой "сильной" идемпотентности вручную.
S>Своим примером я хочу показать, что задача примерно та же, отличается небольшой деталью, но рабочего решения за счет идемпотенетности или кондишнл не видно.
Ну вот есть подозрение, что спека на repeatable requests OData позволяет решить эту проблему. Надо бы поковырять это повнимательнее.
S>Немного неизящно, т.к. мы не сможем ничего создать, не получив последнее состояние/версию ресурса. Не сгодится для высоконагруженных систем без троттлинга со стороны клиентов. А в целлом будет как-то работать.
Да, тут надо повнимательнее посмотреть на вопрос с таймстампами. Если удастся их верно назначить на стороне сервера, то будет работать корректное упорядочивание запросов, и можно будет всем раздавать повторяемые ответы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[32]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>У нас есть понятие идемпотентности метода, но не группы методов, связанных некой замысловатой семантикой. Т.е. мы можем говорить об идемпотентности PUT отдельно от идемпотентности DELETE, и у нас нет идемпотентности пары PUT+DELETE. S>Нет никакой пары. Каждый клиент "видит" только себя и сервер, и пытается реализовать наилучшую, на его взгляд, стратегию работы.
Я о паре/совокупности методов, а не про пару клиентов.
S>>Или это кондишнл PUT/DELETE? Если есть GET и параллельные операции создания, то уже одного PUT и GET достаточно что бы получить состояние гонки даже с одним клиентом. Методы PUT и GET должны вызываться взаимоисключающим образом и только так. Пока не получен ответ на PUT, все ответы GET будут скомпрометированы и наоборот. Это даже вне кондишнл и идемпотентности. S>С чего бы это вдруг? С точки зрения сервера, первый же PUT был успешным. У него нет никаких причин полагать, что A не получил ответ. Стало быть, он считает X вполне себе валидным ресурсом, который доступен для произвольных манипуляций B и C.
С точки зрения клиента. Если он отправил GET и PUT, не дождавшись ответа GET, или наоборот, то клиент не сможет узнать по ответу GET, мог ли быть выполнен отправленный им PUT и чей-то DELETE, если в ответе GET нет X.
S>>В ситуации с несколькими клиентами мы не в силах контролировать время отправки запроса и получения ответа на другом клиенте, т.е. все полученные с сервера ответы, даже без намеков на проблемы транспорта, оптимистические в лучшем случае. S>Это всего лишь влияет на то, что B получает в своей выдаче. Относительность времени между A и B означает, что B мог не увидеть X, если сервер трактует его GET как прибывший раньше PUT.
Исхожу из того, что сервер вообще не знает, кто когда отправил запрос, отвечает моментально в момент получения запроса и не думает о том, кому что показать, показывая свое текущее состояние. Пусть, например, он хранит свое состояние в критической секции, или делает вид что происходит именно это. S>Но если B "нашёл" X, то сервер уже не может "притвориться", что X нету.
Может, если допускается B2, который уже поменял X->X2 S>Ок, опытный B, конечно же, примет меры для предотвращения lost update — в частности, в своём PUT он подложит If-Match, чтобы нечаянно не сломать потенциальных конкурентов, которые могли успеть сделать из X X" в промежутке между GET и PUT. Но смотрите, в чём беда — при повторах своего update B рискует дождаться момента после 3:DELETE, пришедшего от C. Что делать серверу? Формально, If-Match требует отдать 4хх, т.к. ожидаемого X там больше нет. S>Если это и будет первым успешно доставленным респонсом на запросы B, то он будет введён в заблуждение. B будет считать, что он так и не успел обновить X перед удалением. А это не так, и это может быть важно из-за семантики приложения.
Понимаю. И идемпотентность не снимает проблем гонок с разделяемым состоянием. Она не для этого. Это проблема разработчика — обеспечить корректную работу в соответствии с семантикой приложения, не забыв об идемпотентности, которая обеспечит ему возможность повтора вызовов и только лишь.
S>Всё верно. Но если запрос на удаление таки поедет в понедельник, то никакого противоречия не будет — что бы там ни ответил сервер, это будет корректно. Например, вмешался D, который изменил Х' на X", и теперь его нельзя удалять без проверки. Отлично. Но если удаление таки прошло в пятницу, а в понедельник сервер делает вид, что ничего такого не было — это уже ай-яй-яй.
Я хотел продемонстрировать (для других, уверен, что мы с вами понимаем), что проблема не в одной лишь связи, которая может быть сколь угодно надежна. Уже были примеры с метро. А это в плюс пример с офисом, езернетом и резервным питанием всего, что можно.
Но да, не там сделал акцент. Пусть ситуация будет такая, что запрос отправлен, а ответ пришел уже после ухода в кибернейт. Приложение просыпается в понедельник — ответа нет. В контексте исполняющегося потока кода для приложения довольно сложно определить, что предыдущая строчка с вызовом метода выполнялась на прошлой неделе, а текущая — уже на новой неделе. Ответа сервера нет и не будет.
S>>За данную задачу не скажу, не вижу, как ее решить правильно, требования не доконца ясны. Но в проекте корпоративной облачной файлопомойки, в котором я работаю, одноэтапное создание ресурса приводило к неизбежным гонкам, когда ресурс, созданный клиентом А, удалялся клиентом Б до момента получения А ответа о создании. Т.е. А продолжал его создавать при потере ответа сервера о создании, что было неприемлемо. Но в задаче A/B/C это вроде штатный сценарий. S>Нет, это как раз вырожденный вариант, в котором участвуют A и C. В хорошей реализации, независимо от проблем связи, ресурс X должен на сервере проходить жизненный цикл "появился-умер" однократно. S>А не так, что он будет "мерцать", пока A и C борются с недоставкой ответов, и результат зависит только от того, у кого их них первым восстановится двусторонняя связь.
Это зависит от задачи. Вполне допускаю такую задачу, где ресрус именно должен мерцать. Причем, даже без GET. Один лупит PUT X, другой — DELETE X в цикле. Например, синтетическая задача по замеру среднего времени жизни ресурса в таких условиях при разном количестве создающих и удаляющих клиентов.
Не настаиваю на рассмотрении именно такой задачи.
S>>Максимально стабильное решение получилось собрать с двухэтапным созданием ресурсов. Create POST-ом получает сессию с идентификатором нового ресурса, а CompleteCreate завершает создание ресурса на сервере, фактически публикуя созданный ранее скрытый ресурс. Состояние создания ресурса для клиента персистентно, он закончит его создание даже после ребута. S>Звучит как реализация той самой "сильной" идемпотентности вручную.
Возможно, так и есть, но я не думал об этом в терминах "сильной" идемпотентности. обычная книжная идемпотентность в рамках этого решения решает лишь свою маленькую задачку.
S>>Своим примером я хочу показать, что задача примерно та же, отличается небольшой деталью, но рабочего решения за счет идемпотенетности или кондишнл не видно. S>Ну вот есть подозрение, что спека на repeatable requests OData позволяет решить эту проблему. Надо бы поковырять это повнимательнее.
На сколько я понял — нет, не решает. Там предлагают использовать заголовки для того, что бы отличать один PUT X со своими повторами от второго, логически с первым не связанным PUT X со своими повторами, причем, помечать для сервера так же первую попытку вызова от повторных.
так повторный PATCH с добавлением элемента коллекции на сервере можно будет отличить от намеренного добавления дубля ранее добавленного элемента.
S>>Немного неизящно, т.к. мы не сможем ничего создать, не получив последнее состояние/версию ресурса. Не сгодится для высоконагруженных систем без троттлинга со стороны клиентов. А в целлом будет как-то работать. S>Да, тут надо повнимательнее посмотреть на вопрос с таймстампами. Если удастся их верно назначить на стороне сервера, то будет работать корректное упорядочивание запросов, и можно будет всем раздавать повторяемые ответы.
Чистые таймстампы будут препятствовать масштабированию сервера. Та еще мина.
Re[32]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Это всего лишь влияет на то, что B получает в своей выдаче. Относительность времени между A и B означает, что B мог не увидеть X, если сервер трактует его GET как прибывший раньше PUT.
Как я понимаю, идемпотентность позоволяет добавить между клиентом и сервером кеширующий прокси. Как мне кажется, это упрощает понимание сценариев, если предположить, что есть такой прокси, который "абсолютно надёжен" и кеширует все ответы сервера в соответствии с rfc (по урлу как ключу, по глаголам, с обработкой соответсвующих заголовков типа if-match и т.п.). В таком случае сервер видит запрос ровно один раз и даёт ровно один ответ. Клиент, если не смог получить ответ в первый раз, всегда получит его от прокси, в том же виде.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[33]: Идемпотентность POST - хорошая ли практика?
Важно не наличие прокси, а сама возможность восстановить когерентность состояния после сбоя.
Вот у вас есть микросервис Х, который выставляет наружу некоторую операцию A.
Для выполнения этой операции нужно выполнить две операции — A1 и A2, в микросервисах Y и Z.
Для конкретики: А1 — это списание денег, А2 — резервирование авиабилета.
Z ничего не знает про деньги; его работа — чисто резервирование билетов от имени агента.
Y ничего не знает про билеты; его работа — чисто обработка платежей.
Теперь учтём, к примеру, то, что X может внезапно упасть в любой момент:
— до первого обращения к Y
— после обращения к Y, но до того, как ответ от Y сохранён в локальную базу
— после обращения к Y, но перед обращением к Z
— после обращения к Z, но до того, как ответ от Z сохранён в локальную базу.
Плюс к этому, даже если сам X вполне себе функционален, возможен сбой коммуникации между ним и Y/Z. Возможен сбой самих Y и Z — причём в произвольные моменты:
— до получения запроса
— после получения запроса, но до внесения изменений в локальную базу
— после внесения изменений в базу, но до отправки ответа X
Единственный способ избежать безумия и дорогостоящих рукопашных процедур восстановления когерентности — это идемпотентность.
X полагается на то, что у него есть безопасный способ повтора операции, если он "не расслышал" или "забыл" ответ на предыдущий запрос.
Тогда у него есть штатный способ, не зависящий от ручного вмешательства инженеров, довести свою работу "оформление заказа на авиабилет" до конца — успешного там или неуспешного.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[30]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Вот у нас есть три клиента — A, B, С,
S>1. A создаёт объект X. S>2. B находит объект X, и модифицирует его (назовём новое состояние X'). S>3. С находит объект X' и удаляет его.
S>Теперь представим, что у всех троих нестабильная связь. Очевидно, что A должен иметь возможность повторять попытки создать X и после момента 2, и после момента 3. S>При этом мы ожидаем, что он таки получит свой 201 — c его точки зрения, это первая успешная попытка создания. S>Чего мы не ожидаем: S>- что после 2 он получит 4хх — это бы выглядело так, как будто он сделал что-то нехорошее (пытается создать объект-дубликат)
Не вижу в этом проблем. Любая достаточно большая распределённая система постоянно работает с ошибками. Это её нормальное состояние. Любой компонент получает ошибки. Везде есть какие-то баги. Никто не ставит алярмы на единственный HTTP 400. Алярмы ставят, когда ошибок становится больше ожидаемого процента.
То бишь в описанной ситуации A при повторе получает ошибку 400, логгирует её и успокаивается. При этом если для него важно как-то проверять после создания, есть ли объект — он должен сделать GET или подобный запрос и дальше уже работать исходя из этого.
B и C так же получают ошибку и так же примерно с ней работают.
Учитывая, что вероятность этой ошибки невелика, проблем это не вызывает. Главное, чтобы каждый компонент работал устойчиво при наличии этих ошибок.
Re[32]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>В том-то и дело, что в спеке неявно подразумевается, что клиент — единственный, кто взаимодействует с заданным ресурсом на сервере.
Я так не думаю. Неглупые люди писали спеку, в первым автором вообще-то филдинг числится.
Если в спеке не закладывалась идея "сильной идемпотентности", то есть с сохранением порядка запросов, то, видимо, или другие способы обеспечения есть, или "овчинка не стоит выделки".
G>>Все что необходимо для решения проблемы конкурентного обновления есть в https://httpwg.org/specs/rfc9110.html G>>Даже два механизма: G>>- заголовок ответа Last-Modified и изголовки запросов If-Modified-Since, If-Unmodifieed-Since G>>- заголовок ответа Etag и изголовки запросов If-Match, If-None-Match G>>Предполагается что в случае невыполнения условия сервер должен вернуть 412 Precondition Failed S>Это нарушает ожидания от "сильной идемпотентности". И даже с этими хидерами у нас нет никакой гарантии соблюдения идемпотентности в случае взаимодействия с сервером нескольких клиентов. S>Попробуйте "починить" приведённый мной пример при помощи добавления этих заголовков в запросы и ответы. S>Парочку из аномалий вы предотвратите, но не все.
По факту остается только одна проблема, если повторно выполнить PUT с If-None-Match: *, то будет 412 если предыдущая попытка была успешна, но мы не получили ответ.
С другой стороны в этом запросе 412 однозначно трактуется как "запись с этим ключом уже существует" и приложение может продолжать выполнение опираясь на это факт.
Re[34]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Для конкретики: А1 — это списание денег, А2 — резервирование авиабилета. S>Z ничего не знает про деньги; его работа — чисто резервирование билетов от имени агента. S>Y ничего не знает про билеты; его работа — чисто обработка платежей.
Тут мы попадаем на CAP теорему.
Это означает что нам нужно требовать отсутствие разделения, то есть утверждать, что пропадания связи с А1 и А2 или будут совсем отсутствовать, или будут заранее ограничены. Тогда мы можем сделать свой координатор, который будет принимать одним запросом данные билетах и платежах, а сам будет организовывать повторы столько раз сколько необходимо, даже с учетом перезагрузки самого координатора.
Re[34]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Важно не наличие прокси, а сама возможность восстановить когерентность состояния после сбоя.
Для меня прокси как умственный констркут, позволяющий мыслить как операции работают, упрощают понимание сути.
Т.е. вместо того, чтобы мучиться рассуждениями как должен себя вести сервер при получении дубликатов — просто можно считать, что до сервера дубликаты не доходят, а этим занимается прокси. Иными словами, вместо одного сверхумного компонента, рассматриваем два простых — тупой сервер который умеет обрабатывать один запрос без повторов и кеш который тупо возвращает то что видел.
S>Вот у вас есть микросервис Х, который выставляет наружу некоторую операцию A. S>Для выполнения этой операции нужно выполнить две операции — A1 и A2, в микросервисах Y и Z.
По-моему ты ожидаешь от идемпотентности больше, чем положено. Идемпотентность про одну операцию, а не про их взаимодействие. (вспомни формулу f ∘ f = f — там нет никаких A,Y,Z, ровно одна функция).
S>Для конкретики: А1 — это списание денег, А2 — резервирование авиабилета. S>Z ничего не знает про деньги; его работа — чисто резервирование билетов от имени агента. S>Y ничего не знает про билеты; его работа — чисто обработка платежей.
А это всё разруливается бизнес-логикой и универсального решения нет. Ну и CAP подлянки подстраивает.
Например, типично делают временную блокировку билета (скажем на 15 минут) в течение которой должна пройти успешно оплата. После этого уже резервирование билета.
Притом, в случае технической проблемы (всё упало, и после оплаты не удалось уложиться в 15 минут завершить резервацию), то предусматривают ручную утряску или возврат денег.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[31]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, vsb, Вы писали: vsb>Не вижу в этом проблем.
А зря. vsb>Любая достаточно большая распределённая система постоянно работает с ошибками. Это её нормальное состояние. Любой компонент получает ошибки. Везде есть какие-то баги. Никто не ставит алярмы на единственный HTTP 400. Алярмы ставят, когда ошибок становится больше ожидаемого процента.
Дело не в алярме, а в восстановлении после сбоя. Получить 200 ок, когда на самом деле API Call упал — ничуть не хуже, чем получить 4хх, когда он на самом деле сработал.
vsb>То бишь в описанной ситуации A при повторе получает ошибку 400, логгирует её и успокаивается. При этом если для него важно как-то проверять после создания, есть ли объект — он должен сделать GET или подобный запрос и дальше уже работать исходя из этого.
Вот наш клиент позвал метод "перевести деньги", получил 4хх. Ок, у нас есть автоматизированная схема "попробовать следующий метод платежа".
Попробовал — получил 200, пометил у себя "всё ок, я оплатил заказ". В итоге продавцу деньги ушли дважды, и поймаем мы это только через месяцок, когда будем сверять баланс счёта.
vsb>B и C так же получают ошибку и так же примерно с ней работают.
Неа.
vsb>Учитывая, что вероятность этой ошибки невелика, проблем это не вызывает. Главное, чтобы каждый компонент работал устойчиво при наличии этих ошибок.
Вызывает Невозможно обеспечить "устойчивую работу", если для этого не предложено средств.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[35]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: ·>Т.е. вместо того, чтобы мучиться рассуждениями как должен себя вести сервер при получении дубликатов — просто можно считать, что до сервера дубликаты не доходят, а этим занимается прокси. Иными словами, вместо одного сверхумного компонента, рассматриваем два простых — тупой сервер который умеет обрабатывать один запрос без повторов и кеш который тупо возвращает то что видел.
Можно, но это никак не поможет рассуждать о корректности. В описанном сценарии прокси между A/B/C и сервисах ничего не изменят — по-прежнему состояние сервера будет разрушено, хотя каждый из клиентов всё делал безупречно.
·>По-моему ты ожидаешь от идемпотентности больше, чем положено. Идемпотентность про одну операцию, а не про их взаимодействие. (вспомни формулу f ∘ f = f — там нет никаких A,Y,Z, ровно одна функция).
Я иду с другой стороны. У меня нет задачи "о, прикольная штука эта ваша идемпотентность, к чему бы полезному её пристроить". У меня задача — ровно наоборот: спроектировать и реализовать API, который позволяет написать к нему клиентов, которые смогут корректно работать при наличии сбоев.
·>А это всё разруливается бизнес-логикой и универсального решения нет.
Если мы придумаем решение для этой конкретной бизнес-логики, то оно легко станет универсальным. ·>Ну и CAP подлянки подстраивает.
Нет, CAP тут ни при чём. ·>Например, типично делают временную блокировку билета (скажем на 15 минут) в течение которой должна пройти успешно оплата. После этого уже резервирование билета.
Это вообще не решение. Вот у нас оплата успешно прошла, но клиент об этом не узнал. Дальше что? ·>Притом, в случае технической проблемы (всё упало, и после оплаты не удалось уложиться в 15 минут завершить резервацию), то предусматривают ручную утряску или возврат денег.
Ну вот я и хочу избавиться от ручной утряски — это очень дорогостоящая процедура.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[35]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали: G>Тут мы попадаем на CAP теорему.
Не вижу её применимости. G>Это означает что нам нужно требовать отсутствие разделения, то есть утверждать, что пропадания связи с А1 и А2 или будут совсем отсутствовать, или будут заранее ограничены. Тогда мы можем сделать свой координатор, который будет принимать одним запросом данные билетах и платежах, а сам будет организовывать повторы столько раз сколько необходимо, даже с учетом перезагрузки самого координатора.
Нет конечно. CAP — очень убогая штука, она оперирует слишком ограниченными определениями.
В нашем случае достаточно понимать, что по мере повторных выполнений идемпотентных запросов вероятность продолжить некогерентность падает экспоненциально быстро.
Грубо говоря, 90% запросов будут обработаны с одного раза.
9% потребуют одного повтора.
<1 потребуют трёх повторов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Т.е. вместо того, чтобы мучиться рассуждениями как должен себя вести сервер при получении дубликатов — просто можно считать, что до сервера дубликаты не доходят, а этим занимается прокси. Иными словами, вместо одного сверхумного компонента, рассматриваем два простых — тупой сервер который умеет обрабатывать один запрос без повторов и кеш который тупо возвращает то что видел. S>Можно, но это никак не поможет рассуждать о корректности. В описанном сценарии прокси между A/B/C и сервисах ничего не изменят — по-прежнему состояние сервера будет разрушено, хотя каждый из клиентов всё делал безупречно.
Не очень ясно причём тут идемпотентность тогда. Идемпотентность никак не помогает рассуждать о корректности взаимодействия между множеством систем, только между двумя. Именно между двумя системами происходит State Transfer.
S>·>По-моему ты ожидаешь от идемпотентности больше, чем положено. Идемпотентность про одну операцию, а не про их взаимодействие. (вспомни формулу f ∘ f = f — там нет никаких A,Y,Z, ровно одна функция). S>Я иду с другой стороны. У меня нет задачи "о, прикольная штука эта ваша идемпотентность, к чему бы полезному её пристроить". У меня задача — ровно наоборот: спроектировать и реализовать API, который позволяет написать к нему клиентов, которые смогут корректно работать при наличии сбоев.
Так это уже CAP.
S>·>А это всё разруливается бизнес-логикой и универсального решения нет. S>Если мы придумаем решение для этой конкретной бизнес-логики, то оно легко станет универсальным. S>·>Ну и CAP подлянки подстраивает. S>Нет, CAP тут ни при чём.
Именно причём. У тебя происходит Partitioning (между клиентом и сервером произошел разрыв связи) и бизнес должен решить, чем жертвовать C или A.
S>·>Например, типично делают временную блокировку билета (скажем на 15 минут) в течение которой должна пройти успешно оплата. После этого уже резервирование билета. S>Это вообще не решение. Вот у нас оплата успешно прошла, но клиент об этом не узнал. Дальше что?
Оплата прошла, билет куплен успешно. Если у клиент об этом не узнал (мобильник выпал из рук и разбился), то это забота клиента найти способ связаться и узнать о результате.
S>·>Притом, в случае технической проблемы (всё упало, и после оплаты не удалось уложиться в 15 минут завершить резервацию), то предусматривают ручную утряску или возврат денег. S>Ну вот я и хочу избавиться от ручной утряски — это очень дорогостоящая процедура.
А есть варианты? И, главное, причём тут идемпотентность?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[37]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Не очень ясно причём тут идемпотентность тогда. Идемпотентность никак не помогает рассуждать о корректности взаимодействия между множеством систем, только между двумя. Именно между двумя системами происходит State Transfer.
Ну так у нас взаимодействие всегда происходит между двумя системами. Я же вроде очень подробно пример расписал. Непонятно, что вам непонятно
·>Так это уже CAP.
Нет. CAP — это некий удобный акроним, на который можно списать всё, что угодно. Утекли деньги со счёта — "это CAP виновата ". Нет, это так не работает.
·>Именно причём. У тебя происходит Partitioning (между клиентом и сервером произошел разрыв связи) и бизнес должен решить, чем жертвовать C или A.
Ок, я выбираю пожертвовать A (хотя это опять ложная дилемма — A не является бинарной величиной). Верните мне мою C.
·>Оплата прошла, билет куплен успешно. Если у клиент об этом не узнал (мобильник выпал из рук и разбился), то это забота клиента найти способ связаться и узнать о результате.
Не мобильник выпал и разбился, а VM была перезапущена в рамках стандартного failover. Клиент — это серверный процесс. Как именно вы предлагаетее ему "связаться и узнать о результатах"?
иться в 15 минут завершить резервацию), то предусматривают ручную утряску или возврат денег. S>>Ну вот я и хочу избавиться от ручной утряски — это очень дорогостоящая процедура. ·>А есть варианты? И, главное, причём тут идемпотентность?
Конечно есть. Вариант — обеспечить идемпотентность запросов. Даже в случае возможных конкурирующих запросов от других клиентов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>В нашем случае достаточно понимать, что по мере повторных выполнений идемпотентных запросов вероятность продолжить некогерентность падает экспоненциально быстро. S>Грубо говоря, 90% запросов будут обработаны с одного раза. S>9% потребуют одного повтора. S><1 потребуют трёх повторов.
В описано сценарии надо еще и отказ обрабатывать:
1) Если бронь не прошла, то надо откатить оплату
2) Если оплата не прошла, то надо откатить бронь
3) Тот кто отправляет запросы может перезагрузиться в любой момент и при этом должно отработать все корректно
И при этом на каждом шаге еще и может возникнуть необходимость повторов.
В общем это очень сложная задача. И она очень похожа на "задачу о двух генералах".
Поэтому в реальности бронирование билетов происходит таким образом:
1) После выбора билетов клиентом сразу отправляется предварительная бронь, она держится от 5 от 30 минут
2) За этим 5-30 минут клиент должен выбрать опции и способ оплаты. В это время никто другой не может взаимодействовать с забронированными местами.
3) После оплаты отправляется подтверждение сервису бронирования. Причем сразу по двум путям — одно от клиента с кодом оплаты, второе отправляет сам платежный сервер в систему бронирования. Если получено подтверждение интерактивным путем, то клиент сразу получает билет, если фоновым, то отправляется на почту (обычно происходит оба варианта).
4) Если подтверждение до сервера бронирования так и не дошло за 5-30 минут, то то сервер пытается отменить оплаты по код бронирования.
Такой сценарий полностью исключает состояние гонки при бронировании и описанные выше проблемы становятся неактуальными.
Предполагает сто связь неустойчива между всеми узлами, вплоть до того, что связь может отсутствовать неограниченно долго.
Я думаю те, кто писали спеку 9110 прекрасно понимали сложность систем с повторами и порядком доставки сообщений, поэтому не включали в понятие идемпотентности сохранение порядка запросов, ибо во многих случаях это сложная, но мало чего дает клиенту.
Re[38]: Идемпотентность POST - хорошая ли практика?
S>·>Так это уже CAP. S>Нет. CAP — это некий удобный акроним, на который можно списать всё, что угодно. Утекли деньги со счёта — "это CAP виновата ". Нет, это так не работает.
CAP это проблема, которую должен решать программист. При наличии признаков CAP надо понимать что при потере связи система будет терять согласованность или доступность.
И надо будет что-то делать, чтобы не терять.
Или увеличивать надежность сетевых соединений, уменьшая время потери доступности, или вносить в систему механизм восстановления согласованности, если часть сообщений потерялась.
В простых случаях механизм восстановления согласованности может быть тупым — повторять запросы, пока что-нибудь не вернет. Но часто оказывается сложнее, примерно как при покупке билетов, который я описал выше.
Здравствуйте, Sinclair, Вы писали:
S>·>Не очень ясно причём тут идемпотентность тогда. Идемпотентность никак не помогает рассуждать о корректности взаимодействия между множеством систем, только между двумя. Именно между двумя системами происходит State Transfer. S>Ну так у нас взаимодействие всегда происходит между двумя системами. Я же вроде очень подробно пример расписал. Непонятно, что вам непонятно
Да. Но ты хочешь добиться каких-то гарантий между 2+ систем. Partitioning мешается.
S>·>Так это уже CAP. S>Нет. CAP — это некий удобный акроним, на который можно списать всё, что угодно. Утекли деньги со счёта — "это CAP виновата ". Нет, это так не работает.
Не совсем. CAP диктует какие сценарии возможны. А это уже дело BA определить поведение адекватное с т.з. бизнеса в таких сценариях.
S>·>Именно причём. У тебя происходит Partitioning (между клиентом и сервером произошел разрыв связи) и бизнес должен решить, чем жертвовать C или A. S>Ок, я выбираю пожертвовать A (хотя это опять ложная дилемма — A не является бинарной величиной). Верните мне мою C.
Ну в рассамтриваемом примере это означает, что самолёт никуда не полетит (no Availability) пока каждый из заказов не подвердится/отклонится каждым из клиентов.
S>·>Оплата прошла, билет куплен успешно. Если у клиент об этом не узнал (мобильник выпал из рук и разбился), то это забота клиента найти способ связаться и узнать о результате. S>Не мобильник выпал и разбился, а VM была перезапущена в рамках стандартного failover. Клиент — это серверный процесс.
Да без разницы, человек это или vm. failover может перезапустить процесс, но что-то опять может пойти не так. Место на диске закончилось, например, и процесс застрял. А админы спят, диск почистить некому, самолёт готовится к вылету. Шо делать?
S>Как именно вы предлагаетее ему "связаться и узнать о результатах"?
Или я вопрос не понял?..
S>иться в 15 минут завершить резервацию), то предусматривают ручную утряску или возврат денег. S>>>Ну вот я и хочу избавиться от ручной утряски — это очень дорогостоящая процедура. S>·>А есть варианты? И, главное, причём тут идемпотентность? S>Конечно есть. Вариант — обеспечить идемпотентность запросов. Даже в случае возможных конкурирующих запросов от других клиентов.
Как это поможет в случае "клиент об этом не узнал"?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Да. Но ты хочешь добиться каких-то гарантий между 2+ систем. Partitioning мешается.
Нет, не мешается.
·>Не совсем. CAP диктует какие сценарии возможны. А это уже дело BA определить поведение адекватное с т.з. бизнеса в таких сценариях.
Не совсем. Полезность CAP примерно равна нулю. Потому, что её терминология не соответствует примерно ничему в инженерии.
·>Ну в рассамтриваемом примере это означает, что самолёт никуда не полетит (no Availability) пока каждый из заказов не подвердится/отклонится каждым из клиентов.
Ничего подобного. В рассматриваемом примере это означает, что самолёт улетит без пассажира. И рано или поздно клиент сервиса получит информацию о том, что так произошло, после чего сможет корректным образом отменить перевод денег. Зачем вы пишете ерунду?
·>Да без разницы, человек это или vm. failover может перезапустить процесс, но что-то опять может пойти не так. Место на диске закончилось, например, и процесс застрял. А админы спят, диск почистить некому, самолёт готовится к вылету. Шо делать?
Ну, а вы как думаете?
S>>Как именно вы предлагаетее ему "связаться и узнать о результатах"? ·>Или я вопрос не понял?..
Мне отсюда не видно, поняли вы или нет. Как именно процесс-клиент должен связываться и узнавать о результатах запроса, ответ на который он не получил — потому что сам был рестартован, или потому что при коммуникации возник сбой, или потому что он получил 500 и не имеет понятия, успел ли сервер внести изменения на своей стороне перед тем, как упасть и ответить 500. S>>Конечно есть. Вариант — обеспечить идемпотентность запросов. Даже в случае возможных конкурирующих запросов от других клиентов. ·>Как это поможет в случае "клиент об этом не узнал"?
Очень просто: клиент рано или поздно узнАет результат.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Не совсем. CAP диктует какие сценарии возможны. А это уже дело BA определить поведение адекватное с т.з. бизнеса в таких сценариях. S>Не совсем. Полезность CAP примерно равна нулю. Потому, что её терминология не соответствует примерно ничему в инженерии.
Это соответствует бизнес-процессам. Дело инженера лишь объяснить бизнес-аналисту суть ограничений, накладываемых теоремой.
S>·>Ну в рассамтриваемом примере это означает, что самолёт никуда не полетит (no Availability) пока каждый из заказов не подвердится/отклонится каждым из клиентов. S>Ничего подобного. В рассматриваемом примере это означает, что самолёт улетит без пассажира. И рано или поздно клиент сервиса получит информацию о том, что так произошло, после чего сможет корректным образом отменить перевод денег. Зачем вы пишете ерунду?
Это означает, что самолёт улетит с пустым местом и авиакомпания потеряет деньги. А так бы место могли продать кому-то другому, но место было отмечено как занятое, никто не полетел, деньги не списались, обед пошел в мусор. Нарушение Consistency.
S>·>Да без разницы, человек это или vm. failover может перезапустить процесс, но что-то опять может пойти не так. Место на диске закончилось, например, и процесс застрял. А админы спят, диск почистить некому, самолёт готовится к вылету. Шо делать? S>Ну, а вы как думаете?
Наказать невиновных, наградить непричастных. А больше ничего не сделаешь.
S>>>Как именно вы предлагаетее ему "связаться и узнать о результатах"? S>·>Или я вопрос не понял?.. S>Мне отсюда не видно, поняли вы или нет. Как именно процесс-клиент должен связываться и узнавать о результатах запроса, ответ на который он не получил — потому что сам был рестартован, или потому что при коммуникации возник сбой, или потому что он получил 500 и не имеет понятия, успел ли сервер внести изменения на своей стороне перед тем, как упасть и ответить 500.
Послать запрос опять и обработать результат. Что должно произойти на сервере — понять просто: преставсь себе, что до сервера повторный запрос не дойдёт, а ответит прокси из кеша.
S>>>Конечно есть. Вариант — обеспечить идемпотентность запросов. Даже в случае возможных конкурирующих запросов от других клиентов. S>·>Как это поможет в случае "клиент об этом не узнал"? S>Очень просто: клиент рано или поздно узнАет результат.
Т.е. теряется consistency. Клиент, пока не узнал результат, находится в некосистентном с сервером состоянии — у клиента состояние "неизвестно" у сервера "зарезервировано". Опять CAP.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[41]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Sinclair, Вы писали:
S>>·>Не совсем. CAP диктует какие сценарии возможны. А это уже дело BA определить поведение адекватное с т.з. бизнеса в таких сценариях. S>>Не совсем. Полезность CAP примерно равна нулю. Потому, что её терминология не соответствует примерно ничему в инженерии. ·>Это соответствует бизнес-процессам. Дело инженера лишь объяснить бизнес-аналисту суть ограничений, накладываемых теоремой.
Нет там никаких особенных ограничений. Вот вы сейчас играете за инженера, а я — за BA. Вот вы мне объяснили, что C и A невозможны одновременно. Я вам в ответ — ок, я согласен на A = 99.99%. Какая С у вас получится при таком допущении?
·>Это означает, что самолёт улетит с пустым местом и авиакомпания потеряет деньги. ·>А так бы место могли продать кому-то другому, но место было отмечено как занятое, никто не полетел, деньги не списались, обед пошел в мусор. Нарушение Consistency.
Деньги как раз списались. Если деньги не списались — то и проблемы нет: точно так же, как и в предлагаемом вами варианте, резервация слетела по времени. А вот если списались, то неявка на рейс — проблема пассажира.
Тем более, что у него остаётся ещё N часов до собственно вылета, чтобы всё же получить заветную квитанцию после N retry.
S>>·>Да без разницы, человек это или vm. failover может перезапустить процесс, но что-то опять может пойти не так. Место на диске закончилось, например, и процесс застрял. А админы спят, диск почистить некому, самолёт готовится к вылету. Шо делать? S>>Ну, а вы как думаете? ·>Наказать невиновных, наградить непричастных. А больше ничего не сделаешь. Понятно. Нет, меня не устраивает.
S>>Мне отсюда не видно, поняли вы или нет. Как именно процесс-клиент должен связываться и узнавать о результатах запроса, ответ на который он не получил — потому что сам был рестартован, или потому что при коммуникации возник сбой, или потому что он получил 500 и не имеет понятия, успел ли сервер внести изменения на своей стороне перед тем, как упасть и ответить 500. ·>Послать запрос опять и обработать результат. Что должно произойти на сервере — понять просто: преставсь себе, что до сервера повторный запрос не дойдёт, а ответит прокси из кеша.
Ну, так мы и вернулись к вопросу идемпотентности. Прокси-то ответит не то, что стало с ресурсом теперь, когда его потрогали другие клиенты. Он вернёт из кэша ровно тот же 200 Ok, что сервер отдал ещё при первой попытке.
S>>Очень просто: клиент рано или поздно узнАет результат. ·>Т.е. теряется consistency. Клиент, пока не узнал результат, находится в некосистентном с сервером состоянии — у клиента состояние "неизвестно" у сервера "зарезервировано". Опять CAP.
Не надо пытаться отмазаться от решения инженерных задач, кивая на CAP. CAP, собственно, заканчивается на том, что "невозможно достучаться до отключенного узла".
Проблема не-идемпотентных подходов — ровно в том, что у них нет способа вернуться к консистентности даже после окончания partition.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>>>Не совсем. Полезность CAP примерно равна нулю. Потому, что её терминология не соответствует примерно ничему в инженерии. S>·>Это соответствует бизнес-процессам. Дело инженера лишь объяснить бизнес-аналисту суть ограничений, накладываемых теоремой. S>Нет там никаких особенных ограничений. Вот вы сейчас играете за инженера, а я — за BA. Вот вы мне объяснили, что C и A невозможны одновременно. Я вам в ответ — ок, я согласен на A = 99.99%. Какая С у вас получится при таком допущении?
Не очень понял что этот процент значит в контексте CAP.
S>·>Это означает, что самолёт улетит с пустым местом и авиакомпания потеряет деньги. S>·>А так бы место могли продать кому-то другому, но место было отмечено как занятое, никто не полетел, деньги не списались, обед пошел в мусор. Нарушение Consistency. S>Деньги как раз списались. Если деньги не списались — то и проблемы нет: точно так же, как и в предлагаемом вами варианте, резервация слетела по времени. А вот если списались, то неявка на рейс — проблема пассажира. S>Тем более, что у него остаётся ещё N часов до собственно вылета, чтобы всё же получить заветную квитанцию после N retry.
Ты меня запутал в сценариях.
Если сценарий — деньги списались, но не удалось в течение 15 минут завершить резервацию, сервер упал, то извиняемся перед клиентом и возвращаем деньги. Проблема в том, что деньги будут возвращены только после 15 минут+время на восстановление упавшего сервера и успешной отправки инструкции отмены списания денег. И это нарушение availability, т.к. у клиента будет минус на счету и ему может не хватить денег на покупку нового билета.
Если сценарий — деньги списались, резервирование завершилось, но клиент про это не смог узнать (т.к. всё легло) и пропустил рейс, то тоже проблема. Нарушение consistency.
S>>>·>Да без разницы, человек это или vm. failover может перезапустить процесс, но что-то опять может пойти не так. Место на диске закончилось, например, и процесс застрял. А админы спят, диск почистить некому, самолёт готовится к вылету. Шо делать? S>>>Ну, а вы как думаете? S>·>Наказать невиновных, наградить непричастных. А больше ничего не сделаешь. S> Понятно. Нет, меня не устраивает.
А какие варианты-то?
S>>>Мне отсюда не видно, поняли вы или нет. Как именно процесс-клиент должен связываться и узнавать о результатах запроса, ответ на который он не получил — потому что сам был рестартован, или потому что при коммуникации возник сбой, или потому что он получил 500 и не имеет понятия, успел ли сервер внести изменения на своей стороне перед тем, как упасть и ответить 500. S>·>Послать запрос опять и обработать результат. Что должно произойти на сервере — понять просто: преставсь себе, что до сервера повторный запрос не дойдёт, а ответит прокси из кеша. S>Ну, так мы и вернулись к вопросу идемпотентности. Прокси-то ответит не то, что стало с ресурсом теперь, когда его потрогали другие клиенты. Он вернёт из кэша ровно тот же 200 Ok, что сервер отдал ещё при первой попытке.
Запросом клиента будет "деньги списались, резервирование завершилось?" — ответ будет OK хоть год спустя. Или я не понял которую операцию ты имеешь в виду. В твоём сценарии будет несколько операций.
S>>>Очень просто: клиент рано или поздно узнАет результат. S>·>Т.е. теряется consistency. Клиент, пока не узнал результат, находится в некосистентном с сервером состоянии — у клиента состояние "неизвестно" у сервера "зарезервировано". Опять CAP. S>Не надо пытаться отмазаться от решения инженерных задач, кивая на CAP. CAP, собственно, заканчивается на том, что "невозможно достучаться до отключенного узла". S>Проблема не-идемпотентных подходов — ровно в том, что у них нет способа вернуться к консистентности даже
Согласен, идемпотентность нужна для обеспечения консистентности. Но мы, вроде, говорим о сценарии, который состоит из множества операций. Идемпотентность каждой из операции никакой магии не сделает и CAP обойти не сможет.
S>после окончания partition.
Т.е. при отсутствии Partition мы можем наконец-то получить Consistency и Availabilty. Ну да, всё в соответствии с теоремой.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Не очень понял что этот процент значит в контексте CAP.
В контексте CAP — ничего не значит. Именно поэтому она полезна примерно никак. Инженеры не измеряют доступность в терминах "есть/нету". Доступность в reliability engineering — это доля успешно обслуженных запросов.
·>Если сценарий — деньги списались, но не удалось в течение 15 минут завершить резервацию, сервер упал, то извиняемся перед клиентом и возвращаем деньги. Проблема в том, что деньги будут возвращены только после 15 минут+время на восстановление упавшего сервера и успешной отправки инструкции отмены списания денег. И это нарушение availability, т.к. у клиента будет минус на счету и ему может не хватить денег на покупку нового билета. ·>Если сценарий — деньги списались, резервирование завершилось, но клиент про это не смог узнать (т.к. всё легло) и пропустил рейс, то тоже проблема. Нарушение consistency.
А если сценарий — деньги списались один раз, но резервирований произошло два (или N) — это нарушение чего? Без идемпотентности вы не сможете достичь даже at most once.
·>А какие варианты-то?
Варианты — постараться автоматически вернуть согласованность после окончания partition.
S>>Ну, так мы и вернулись к вопросу идемпотентности. Прокси-то ответит не то, что стало с ресурсом теперь, когда его потрогали другие клиенты. Он вернёт из кэша ровно тот же 200 Ok, что сервер отдал ещё при первой попытке. ·>Запросом клиента будет "деньги списались, резервирование завершилось?" — ответ будет OK хоть год спустя. Или я не понял которую операцию ты имеешь в виду. В твоём сценарии будет несколько операций.
Чтобы это было "ок хоть год спустя", как раз и нужна идемпотентность. Иначе получается так, что прокси бы ответил "200 Ok", а сервер при вопросе напрямую — "409 conflict", потому что бронирование перестало быть актуальным.
·>Согласен, идемпотентность нужна для обеспечения консистентности. Но мы, вроде, говорим о сценарии, который состоит из множества операций. Идемпотентность каждой из операции никакой магии не сделает и CAP обойти не сможет.
Нам не нужно обходить CAP. Нам нужно максимизировать A и C. S>>после окончания partition. ·>Т.е. при отсутствии Partition мы можем наконец-то получить Consistency и Availabilty. Ну да, всё в соответствии с теоремой.
При отcутствии "сильной идемпотентности" у нас Consistency и Availability не достигаются даже после окончания Partition.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[44]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Не очень понял что этот процент значит в контексте CAP. S>В контексте CAP — ничего не значит. Именно поэтому она полезна примерно никак. Инженеры не измеряют доступность в терминах "есть/нету". Доступность в reliability engineering — это доля успешно обслуженных запросов.
Это терминологическая придирка. Да, один термин означает разные вещи в разных контекстах... ну бывает.
S>·>Если сценарий — деньги списались, но не удалось в течение 15 минут завершить резервацию, сервер упал, то извиняемся перед клиентом и возвращаем деньги. Проблема в том, что деньги будут возвращены только после 15 минут+время на восстановление упавшего сервера и успешной отправки инструкции отмены списания денег. И это нарушение availability, т.к. у клиента будет минус на счету и ему может не хватить денег на покупку нового билета. S>·>Если сценарий — деньги списались, резервирование завершилось, но клиент про это не смог узнать (т.к. всё легло) и пропустил рейс, то тоже проблема. Нарушение consistency. S>А если сценарий — деньги списались один раз, но резервирований произошло два (или N) — это нарушение чего? Без идемпотентности вы не сможете достичь даже at most once.
Нарушение консистентности же.
S>·>А какие варианты-то? S>Варианты — постараться автоматически вернуть согласованность после окончания partition.
Так ведь окончание может наступить слишком поздно, т.е. нарушение availiability.
S>>>Ну, так мы и вернулись к вопросу идемпотентности. Прокси-то ответит не то, что стало с ресурсом теперь, когда его потрогали другие клиенты. Он вернёт из кэша ровно тот же 200 Ok, что сервер отдал ещё при первой попытке. S>·>Запросом клиента будет "деньги списались, резервирование завершилось?" — ответ будет OK хоть год спустя. Или я не понял которую операцию ты имеешь в виду. В твоём сценарии будет несколько операций. S>Чтобы это было "ок хоть год спустя", как раз и нужна идемпотентность. Иначе получается так, что прокси бы ответил "200 Ok", а сервер при вопросе напрямую — "409 conflict", потому что бронирование перестало быть актуальным.
Мы видимо в голове разные сценарии и набор операций себе представляем. Я не очень понимаю возражение.
S>·>Согласен, идемпотентность нужна для обеспечения консистентности. Но мы, вроде, говорим о сценарии, который состоит из множества операций. Идемпотентность каждой из операции никакой магии не сделает и CAP обойти не сможет. S>Нам не нужно обходить CAP. Нам нужно максимизировать A и C.
Т.е. значит нам придётся минимизировать Partitioning. Всё в соответствии с теоремой.
S>>>после окончания partition. S>·>Т.е. при отсутствии Partition мы можем наконец-то получить Consistency и Availabilty. Ну да, всё в соответствии с теоремой. S>При отcутствии "сильной идемпотентности" у нас Consistency и Availability не достигаются даже после окончания Partition.
Я честно говоря, не понял что такое "сильная" и чем отличается от "слабой". Как по мне, обычной идемпотентности f*f=f хватит. Про другие не знаю.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[45]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: S>>В контексте CAP — ничего не значит. Именно поэтому она полезна примерно никак. Инженеры не измеряют доступность в терминах "есть/нету". Доступность в reliability engineering — это доля успешно обслуженных запросов. ·>Это терминологическая придирка. Да, один термин означает разные вещи в разных контекстах... ну бывает.
Нас интересует тот термин, у которого есть практическая полезность.
CAP-теорема делает вид, что существует всего два класса распределённых систем — C- и A- системы.
Это, мягко говоря, неправда. Есть целый спектр систем между двумя полюсами; для некоторых задач мы вообще можем двигать ручку между A и С вправо-влево.
А для некоторых задач внезапно выясняется, что и при сохранении строгой согласованности можно добиваться близкой к 100% доступности даже при крайне низкой надёжности сети между узлами.
S>>·>А какие варианты-то? S>>Варианты — постараться автоматически вернуть согласованность после окончания partition. ·>Так ведь окончание может наступить слишком поздно, т.е. нарушение availiability.
А может и не наступить. Вот мы и приходим к статистическим параметрам вместо банальной "тут нет гарантии availability".
Системы, которые восстанавливают consistency автоматически после восстановления связи, предпочтительнее тех, что требуют ручного вмешательства.
Хотя бы потому, что их итоговая availability оказывается выше. Не имея идемпотентных "кирпичиков" мы вынуждены полагаться на способность пользователя и админов успеть починить повреждённые данные за 15 минут, даже если сетка моргнула на 1 минуту в самом начале или VM была перезагружена. А если у нас такие кирпичики есть, то всё, что заметит пользователь — некоторую задержку в обработке его заказа.
·>Мы видимо в голове разные сценарии и набор операций себе представляем. Я не очень понимаю возражение.
Я в начале ветки привёл подробный пример того, чем "сильная" идемпотентность отличается от "слабой".
·>Т.е. значит нам придётся минимизировать Partitioning. Всё в соответствии с теоремой.
Нет, partitioning нам задан свыше, как свойство среды. Можем её определить количественно, как параметры распределения для расписания сбоев.
S>>При отcутствии "сильной идемпотентности" у нас Consistency и Availability не достигаются даже после окончания Partition. ·>Я честно говоря, не понял что такое "сильная" и чем отличается от "слабой". Как по мне, обычной идемпотентности f*f=f хватит. Про другие не знаю.
Вот тут описано, чем отличается сильная от слабой: https://rsdn.org/forum/design/8374428.1
При слабой идемпотентности повторная попытка A создать X в момент времени между 2 и 3 вернёт ему ошибку 4хх (или 200 ok с затиранием X'), а в момент времени после 3 создаст ещё один экземпляр X. В итоге мы получим рассогласование.
При сильной идемпотентности повторные попытки A cоздать X всегда будут отдавать ему 201, независимо от момента повтора; при этом восстановления X не произойдёт — в точности так же, как если бы A общался через прокси, который "запомнил" ответ 201, отданный сервером на самую первую попытку создания, и всегда отвечал именно его, не консультируясь с сервером.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[30]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали: S>Очень, очень верное замечание. S>Есть ли ссылки на готовые материалы почитать по данной теме? S>Я не припомню, чтобы я встречал где-то рассуждения о слабой/сильной идемпотентностях; хотя, очевидно, желанной является вторая.
Обсуждений в чистом виде про семантику идемпотентности (и её возможных трактовок) я тоже не встречал. Часть практических вопросов, наверное, можно найти в системах сообщений, обеспечивающих как минимум одну доставку (at-least-once). Часто там еще бывает переупорядочивание (либо в силу самой системы, либо из-за того, что гарантированная отправка исходного сообщения может задействовать повторы), поэтому практические подходы умеют все это учитывать. Если интересует (математическая) теория, есть связная область, изучающая Conflict-Free Replicated Data Types (CRDT). В качестве вводных материалов можно посмотреть на https://crdt.tech/. Идеи REST очень хорошо соотносятся с State-Based CRDT (можете в Glossary посмотреть). Там как раз идет передача полного состояния (здравствуй, PUT). Функция слияния состояний (merge) включает в себя требования идемпотентности. Может быть, где-то в теоретических работах (не только по state-based) есть и новые названия для различных классов гарантий. На практике и другие CRDT могут быть полезны. Например, operation-based можно моделировать через "одноразовый" (at most once) PUT /entity/<id>/operations/<uniqueId>. PUT может только создать новый ресурс, либо вернуть 409/200 (конфликт или повтор). Или есть Delta-Based, которая может быть похожа на (сильно-)идемпотентный PATCH.
Re[33]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Sinclair, Вы писали:
S>>В том-то и дело, что в спеке неявно подразумевается, что клиент — единственный, кто взаимодействует с заданным ресурсом на сервере. G>Я так не думаю. Неглупые люди писали спеку, в первым автором вообще-то филдинг числится. G>Если в спеке не закладывалась идея "сильной идемпотентности", то есть с сохранением порядка запросов, то, видимо, или другие способы обеспечения есть, или "овчинка не стоит выделки".
Скорее всего, эта идея не рассматривалась. Первые (да и следующие) спецификации HTTP писались преимущественно под браузер и решали соответствующие проблемы. В 1999 году HTTP API были (наравне с ftp и email), но на общем фоне их было мало. 99% HTTP был браузер. Cледы того, что протокол писался под конкретные сценарии, видны даже в эволюции текста. Например, RFC 2616 в части POST говорит про "связные" ресурсы: "new subordinate of the resource identified by the Request-URI". Это хорошо описывает основные сценарии (дополнительные аннотации к существующему ресурсу, создание сообщения на форуме и т.п.). Но тот же RPC over HTTP совершенно не ложится в эту семантику. Поэтому в 2014 году в RFC 7231 POST уже не упоминает никаких субординатов и фокусируется на семантике, специфичной для ресурса: "... according to the resource's own specific semantics".
Соответственно, PUT вводится как хорошая альтернатива для POST с учетом браузерной специфики. Наверное, он задумывался как альтернатива POST для форм:
В этом случае браузер в случае обрыва связи не выводил бы предупреждение "обновление страницы может привести к необратимым последствиям" (что он делает в случае POST). А может даже — автоматически повторял бы запрос или предлагал пользователю повторить его. К сожалению, PUT не вошел в список допустимых методов в HTML Cама семантика PUT ("перезаписать" ресурс) соответствует двум основным сценариям. Это создание нового дочернего ресурса (формы). Или просто "создание ресурса" — например, загрузка файла. Т.е. PUT /cats/001.jpg может загружать котика, перезаписывать его. Какие-либо гонки там просто не встречаются. Фокус на браузерах остается и в дальнейших спецификациях. Например, так и не появилось новых глаголов для "повторимых" (идемпотентных) операций, с семантикой, отличной от PUT. А таких операций много. Это и "дельта" (патчи), и определенный класс "RPC-оперций". Например, было бы естественно делать
SomeStronglyIdempotentVerb /orders/123 HTTP/1.1
Content-Type: operations/cancel;f=json;v=1
{"comment": "Don't like the buyer", "manager-id": 123}
Или взять же статусные коды. 404 Not found описывает два совершенно разных класса ошибок. Первый — URL понятен серверу, но ресурс отсутствует. Например, GET /orders/123 — заказ с ID=123 не найден. URL верный, но какие-то параметры не верны. Второй — серверу вообще не понятно, что клиент пытался сказать. Например, GET /wer/ifad/awe?12=nb. С точки зрения браузера проблем здесь нет. Сервер сгенерирует различные странички с описанием. В первом случае — предложит вернуться назад и поискать другой заказ. Во втором — описать шаги для получения ошибки и отправить разработчикам. А вот в случае API отличия более принципиальные. В первом случае вполне вероятна ошибка пользователя (например, оператор неверно ввел номер заказа в форму поиска). А во втором случае это явно ошибка программиста, конфигурировавшего приложение. Да, можно дополнительную информацию передавать в теле сообщения. Но лучше было бы такое важное различие обозначать в кодах.
Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать. Например, появился новый API, на который нужно перейти. В этом случае приложение или инфраструктура (service mesh) может обнаружить заголовок и отобразить это в системе мониторинга. Владельцы системы-клиента могут обнаружить это изменение API и со временем мигрировать. Для браузера заголовок смысла не имеет.
В итоге HTTP для API используется не потому, что это идеальный протокол. А потому, что он лучший из существующих. Все остальные (ftp, raw tcp) оказались на практике хуже. В HTTP проблемы (для API) тоже есть, но с ними можно жить. А сам протокол очень широко поддерживается. Есть клиентские библиотеки. Есть вся инфраструктура.
Re[34]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Sinclair, Вы писали:
S>>>В том-то и дело, что в спеке неявно подразумевается, что клиент — единственный, кто взаимодействует с заданным ресурсом на сервере. G>>Я так не думаю. Неглупые люди писали спеку, в первым автором вообще-то филдинг числится. G>>Если в спеке не закладывалась идея "сильной идемпотентности", то есть с сохранением порядка запросов, то, видимо, или другие способы обеспечения есть, или "овчинка не стоит выделки". M>Скорее всего, эта идея не рассматривалась. Первые (да и следующие) спецификации HTTP писались преимущественно под браузер и решали соответствующие проблемы. В 1999 году HTTP API были (наравне с ftp и email), но на общем фоне их было мало. 99% HTTP был браузер. Cледы того, что протокол писался под конкретные сценарии, видны даже в эволюции текста. Например, RFC 2616 в части POST говорит про "связные" ресурсы: "new subordinate of the resource identified by the Request-URI". Это хорошо описывает основные сценарии (дополнительные аннотации к существующему ресурсу, создание сообщения на форуме и т.п.). Но тот же RPC over HTTP совершенно не ложится в эту семантику. Поэтому в 2014 году в RFC 7231 POST уже не упоминает никаких субординатов и фокусируется на семантике, специфичной для ресурса: "... according to the resource's own specific semantics".
Актуальная спека — 9110 https://www.rfc-editor.org/rfc/rfc9110.html. Дата последней редакции — июнь 2022. Ведущий автор — Рой Филдинг, тот самый который придумал REST.
Вряд ли этот документ можно обвинять в неактуальности, а автора в недальновидности.
M>Фокус на браузерах остается и в дальнейших спецификациях.
Можете дать ссылку на конкретные слова в документе?
M>Например, так и не появилось новых глаголов для "повторимых" (идемпотентных) операций, с семантикой, отличной от PUT. А таких операций много. Это и "дельта" (патчи), и определенный класс "RPC-оперций". Например, было бы естественно делать
Спека говорит что вы можете поддерживать любые глаголы с любой семантикой. Новы обязаны поддерживать идемпотентный PUT.
M>Или взять же статусные коды. 404 Not found описывает два совершенно разных класса ошибок. Первый — URL понятен серверу, но ресурс отсутствует. Например, GET /orders/123 — заказ с ID=123 не найден. URL верный, но какие-то параметры не верны. Второй — серверу вообще не понятно, что клиент пытался сказать. Например, GET /wer/ifad/awe?12=nb
Вы здесь путаете HTTP и REST+HATEOAS. С точки зрения HTTP все ресурсы независимы и равноправны, REST+HATEOAS описывает иерархию и связи.
M>Нет в HTTP и API-специфичных вещей.
И не должно быть. HTTP не ограничивает вас в расширении.
M>В итоге HTTP для API используется не потому, что это идеальный протокол. А потому, что он лучший из существующих.
Идеального вообще ничего не существует.
Re[17]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Добавление ключей идемпотентности усложняет схему ...
Вот поэтому я и написал, что такие ключи долджны быть в хидерах, а не в явно прописанных параметрах. И, если это не понятно, они должны быть опциональными. Т.е. если клиент его не передал — значит считаем что это новый ключ.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[24]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>Вот, к примеру, когда я вижу, что для создания нового экземпляра мне предлагается сделать POST на некий URL, у меня нет никакой информации о том, где я потом буду эту сущность запрашивать.
Рекомендуется в респонсе передавать этот Url в поле location. Посмотри, к примеру, на метод CreatedAtRoute/Action в аспнете.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[27]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Далее. Похоже, в этой теме есть непонимание того, что такое идемпотентность. Прямо по определению (RFC 2616, 9.1.2) идемпотентность говорит, что req(req(state)) == req(state) (и как следствие req(req(req(...(req(state))...))) == req(state). Всё! В общем случае оно даже не гарантирует, что сломавшийся запрос можно безопасно повторять. Причем об этом прямым текстом написано прямо в той же части про идемпотентность.
2616 некоторым образом устарел. А в актуальном 9110 написано так:
A request method is considered "idempotent" if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request.
Да и в 2616 еаписано вовсе не про state
the side-effects of N > 0 identical requests is the same as for a single request.
Даже если уж мы говорим про state, то надо понимать что это наблюдаемый c клиента state, а вовсе не реальный state сервера. И да, там таки упоминается что идемпотентность запроса и идемпотентность последовательности запросов это разные вещи.
M>В самом HTTP для существующих глаголов есть два типа идемпотентности.
Это не два типа идемпотентности, это другой признак, называется safety.
M>Если запрос применим в состояниях s1 и s2, то состояние после выполнения запроса одно и то же: req(s1) == req(s2). На практике для безопасного повторения запросов в системах со многими акторами хотелось бы больших гарантий.
В распределенных системах это вряд ли реализуемо, так как упирается в САР-теорему. Максимум можно такое обеспечить для асинхронных операций, и то это будет та еще эквилибристика.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[34]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать.
И кто будет твой нестандартный хидер читать?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[33]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Здравствуйте, Sinclair, Вы писали:
S>>Это всего лишь влияет на то, что B получает в своей выдаче. Относительность времени между A и B означает, что B мог не увидеть X, если сервер трактует его GET как прибывший раньше PUT. ·>Как я понимаю, идемпотентность позоволяет добавить между клиентом и сервером кеширующий прокси.
Кешировать можно только запросы GET, и то не всегда. Кешировать PUT и DELETE это мягко говря преступление, даже если они сто тыщ пяццот раз идемпотентные.
Re[34]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Кешировать можно только запросы GET, и то не всегда. Кешировать PUT и DELETE это мягко говря преступление, даже если они сто тыщ пяццот раз идемпотентные.
Ты путаешь кеширование самих запросов и кеширование отклика. Речь идет именно про кеширование самих запросов, правильный термин тут — ретрай. И таки да, есть варианты построения инфраструктуры, когда ретраи происходят не в самом сервисе, а в специальной проксе. Такой вариант позволяет писать сервисы командам широкого спектра квалификаций на широком спектре средств разработки не вынуждая создавать для каждой поддерживаемой платформы полный спектр инструментария. Т.е. это как раз против той самой описанной тобой ситуации с внезапно забытой мидлварей. Ретраи на уровне инфры забыть невозможно в принципе.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[35]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>Кешировать можно только запросы GET, и то не всегда. Кешировать PUT и DELETE это мягко говря преступление, даже если они сто тыщ пяццот раз идемпотентные.
НС>Ты путаешь кеширование самих запросов и кеширование отклика. Речь идет именно про кеширование самих запросов, правильный термин тут — ретрай.
Кеширование и повторяемые запросы на мой взгляд вещи сильно разные, о чем ты сам говоришь — что правильный термин это ретрай. А я говорю — про кеширование, а не retry.
Re[35]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать.
НС>И кто будет твой нестандартный хидер читать?
Консумеры API. Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами. Если это внутренняя кухня, то это вполне себе работает. Т.е. это просто конвеншн внутри экосистемы, и чем она больше, тем разработчики глубже вникают в таки детали.
Другое дело, если это внешний API, а клиенты были написаны в лучшем случае год назад. Тогда такой подход будет бессмысленным.
Re[36]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>И кто будет твой нестандартный хидер читать? P>Консумеры API.
И что эти консумеры с ним будут делать?
P> Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами.
Это все абстрактно. Давай конкретно. Вот есть некий API. К нему кто то написал клиента и использует в своем софте. Вдруг в хидере начинает приходить сообщение о том, что это API устарело. Кто это сообщение увидит?
P>Другое дело, если это внешний API, а клиенты были написаны в лучшем случае год назад. Тогда такой подход будет бессмысленным.
Вот именно.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[36]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>И кто будет твой нестандартный хидер читать? P>Консумеры API. Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами. Если это внутренняя кухня, то это вполне себе работает. Т.е. это просто конвеншн внутри экосистемы, и чем она больше, тем разработчики глубже вникают в таки детали.
Сделай емейл-рассылку или сайт для новостей, телеграмм-канал какой-нибудь. Трафик съэкономишь.
P>Другое дело, если это внешний API, а клиенты были написаны в лучшем случае год назад. Тогда такой подход будет бессмысленным.
Угу.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[37]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>И кто будет твой нестандартный хидер читать? P>>Консумеры API.
НС>И что эти консумеры с ним будут делать?
Будут поступать в соответствии с соглашением.
P>> Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами.
НС>Это все абстрактно. Давай конкретно. Вот есть некий API. К нему кто то написал клиента и использует в своем софте. Вдруг в хидере начинает приходить сообщение о том, что это API устарело. Кто это сообщение увидит?
Я дал тебе ответ. Еще раз
1. для экосистемы построеной вокруг конвеншна, все это уже поддерживается
2. во внешнем апи это не будет поддерживаться, т.к. клиенты уже написаны
ты почему то видишь только п2 но не видишь п1
Re[37]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Консумеры API. Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами. Если это внутренняя кухня, то это вполне себе работает. Т.е. это просто конвеншн внутри экосистемы, и чем она больше, тем разработчики глубже вникают в таки детали. ·>Сделай емейл-рассылку или сайт для новостей, телеграмм-канал какой-нибудь. Трафик съэкономишь.
Зачем? У нас внутри экосистемы подобные механизмы документированы и поддерживаются всеми клиентам. Консумер или берет такой клиент, или пилит свой с учетом конвеншна.
P>>Другое дело, если это внешний API, а клиенты были написаны в лучшем случае год назад. Тогда такой подход будет бессмысленным. ·>Угу.
Что уго? Типа внешний апи это единственный кейс?
Re[38]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>И что эти консумеры с ним будут делать? P>Будут поступать в соответствии с соглашением.
К чему эти отписки? Напиши честно — не знаю.
НС>>Это все абстрактно. Давай конкретно. Вот есть некий API. К нему кто то написал клиента и использует в своем софте. Вдруг в хидере начинает приходить сообщение о том, что это API устарело. Кто это сообщение увидит? P>Я дал тебе ответ.
Нет.
P>1. для экосистемы построеной вокруг конвеншна, все это уже поддерживается
Каким образом? Я же написал — давай конкретно, а от тебя опять абстрактные рассуждения.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>И что эти консумеры с ним будут делать? P>>Будут поступать в соответствии с соглашением.
НС>К чему эти отписки? Напиши честно — не знаю.
Я пишу о том, как это уже работает внутри экосистемы. И с этим работают не только аритекторы и разработчики приложений, но и ops, l2, qa и тд.
P>>1. для экосистемы построеной вокруг конвеншна, все это уже поддерживается
НС>Каким образом? Я же написал — давай конкретно, а от тебя опять абстрактные рассуждения.
Что именно ты ждешь? Код, контакт, или запись видео? Внятно вопрос сформулируй.
Re[38]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>Консумеры API. Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами. Если это внутренняя кухня, то это вполне себе работает. Т.е. это просто конвеншн внутри экосистемы, и чем она больше, тем разработчики глубже вникают в таки детали. P>·>Сделай емейл-рассылку или сайт для новостей, телеграмм-канал какой-нибудь. Трафик съэкономишь. P>Зачем?
Меньше трафика. Послать емейл — один раз, а хедер будет в каждом ответе. Да и у емейла больше шанса, что его прочитают и отреагируют.
P>У нас внутри экосистемы подобные механизмы документированы и поддерживаются всеми клиентам. Консумер или берет такой клиент, или пилит свой с учетом конвеншна.
Ты так и не обосновал, зачем это пихать в каждый ответ. Чем это принципиально отличается от простой публикации changelog консьюмерам.
Я ещё понимаю, если посылать номер версии в хедере "Server" или каком-нибудь "X-My-API-Version". Так консумеры могут догадаться, что с v1.2.3 работало, а с v1.2.4 что-то вдруг подглючивать стало, значит стоит поподробнее changelog почитать. Но что делать с Warning?
P>>>Другое дело, если это внешний API, а клиенты были написаны в лучшем случае год назад. Тогда такой подход будет бессмысленным. P>·>Угу. P>Что уго? Типа внешний апи это единственный кейс?
Да в любом кейсе это бессмысленно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>К чему эти отписки? Напиши честно — не знаю. P>Я пишу о том, как это уже работает внутри экосистемы. И с этим работают не только аритекторы и разработчики приложений, но и ops, l2, qa и тд.
Каким образом они работают? Я не понимаю кто и в какой момент увидит этот хидер.
P>>>1. для экосистемы построеной вокруг конвеншна, все это уже поддерживается НС>>Каким образом? Я же написал — давай конкретно, а от тебя опять абстрактные рассуждения. P>Что именно ты ждешь? Код, контакт, или запись видео? Внятно вопрос сформулируй.
Я жду ответа на простой вопрос: "кто будет твой нестандартный хидер читать"?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Я ещё понимаю, если посылать номер версии в хедере "Server" или каком-нибудь "X-My-API-Version".
Это тоже бессмысленно, потому что в нормальном REST url будет вида /api/vXX/collection. И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[41]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>Я пишу о том, как это уже работает внутри экосистемы. И с этим работают не только аритекторы и разработчики приложений, но и ops, l2, qa и тд.
НС>Каким образом они работают? Я не понимаю кто и в какой момент увидит этот хидер.
Архитекторы описывают стандарт для экосистемы, девелоперы пакетов читают эти доки, пишут пакеты которые реализуют капабилити, девелоперы продуктов используют эти пакеты и смотрят трафик в прокси, логах, читают доки от архитекторов разумеется, l2 смотрят логи и точно так же читают доки.
P>>Что именно ты ждешь? Код, контакт, или запись видео? Внятно вопрос сформулируй.
НС>Я жду ответа на простой вопрос: "кто будет твой нестандартный хидер читать"?
Непосредственно читать-писать будет конкретный пакет, который отвечает за капабилити или продуктовый если его команда решит все вручную пилить. Есть конвеншн — все документировано.
В итоге какой бы ты сервис ни взял, все единообразно
Re[28]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Если запрос применим в состояниях s1 и s2, то состояние после выполнения запроса одно и то же: req(s1) == req(s2). На практике для безопасного повторения запросов в системах со многими акторами хотелось бы больших гарантий. НС>В распределенных системах это вряд ли реализуемо, так как упирается в САР-теорему. Максимум можно такое обеспечить для асинхронных операций, и то это будет та еще эквилибристика.
А что сложного? Если у нас REST, то CAP нам не мешает. Мы уже более-менее согласились на eventual consistency. Поэтому распределенной "моментальной" консистентности и не требуется. A и P есть в рамках отдельной системы. Когда-нибудь C тоже будет достигнута. Например, на десятую повторную отправку можно делать алерты и идти ругаться с владельцами лежащего сервиса и девопсами. Т.е. чинить availaiblity/consistency. В рамках eventual consistency уже могут быть различные варианты и техники реализации (те же CRDT-типы в разных вариациях). Ну и вообще, у нас же "Representational State Transfer". У нас операций нет. Мы просто иногда делимся представлением своего локального состояния. В этом плане отправка состояния по HTTP мало чем отличается от "асинхронной отправки". Ну да, мы поделились своим состоянием. Сервер когда-нибудь поделился своим. И мы должны более-менее одинаково обрабатывать ситуации, когда ответ пришел синхронно (в ответ на "первый" запрос) и асинхронно (в ответ на повторо или что-то само изменилось на сервере и он послал уведомление в очередь сообщений).
Re[35]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать. НС>И кто будет твой нестандартный хидер читать?
Я же один из вариантов написал — service mesh. Например, Istio, Envoy, Kong или Conduit. Не так сложно будет убедить девопсов настроить мониторинг заголовков "из коробки". И будет у каждого пользователя сервиса метрика, от которой они не смогут отказаться. И вот если бы был стандартный заголовок, он бы с большой вероятностью уже поддерживался этими продуктами. Ну и да, пользователи сервиса тоже могут это реализовывать. Я бы без проблем сделал метрику и alert на такие предупреждения у тех сервисов, которые я вызываю. Даже если бы они были разные для каждого сервиса.
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>·>Я ещё понимаю, если посылать номер версии в хедере "Server" или каком-нибудь "X-My-API-Version". НС>Это тоже бессмысленно, потому что в нормальном REST url будет вида /api/vXX/collection. И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может.
Не может, конечно. Но есть, и будет есть всегда! Баги всё ещё не отменили. Поэтому знать версии всех компонентов — must have. Сильно облегчает поиск проблем.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[37]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>> Обычно люди, которые используют тот или иной API, делают это не от балды, а осознанно, потому можно ожидать, что они будут пользоваться такими вещами. НС>Это все абстрактно. Давай конкретно. Вот есть некий API. К нему кто то написал клиента и использует в своем софте. Вдруг в хидере начинает приходить сообщение о том, что это API устарело. Кто это сообщение увидит?
Клиент и увидит. Я такой заголовок обычно включаю в публичный API своего сервиса сразу. Даже если он "пока" не используется. Поэтому когда через 3 месяца я удалю поддержку старого API и клиент придет жаловаться, у меня будут аргументы. Заголовок был документирован? Был. Я его выдавал? Выдавал. Три месяца — разумный срок? Да вроде разумный. Кто решил не делать мониторинг заголовка и сам себе злобный буратино?
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Да и у емейла больше шанса, что его прочитают и отреагируют.
Совершенно не факт. Это у вас какая-то идеальная корпорация в вакууме. На практике там будет "ой, а мы не заметили". Или "ой, а на тот момент у нас были другие приоритеты и потом мы забиыли". Или вообще "а мы сервис только месяц назад получили, нас никто об изменениях не уведомлял". А так у меня все прекрасно получается. Письма я отправил всем, кому мог и кого знал (да еще и не один раз). Если вдруг не заметили — API выдавало предупреждения уже 3 месяца. Вон, в Istio нарисовано же в метриках. Так что в том, что у них там что-то перестало работать, виноват совсем не я.
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может.
А сколько мы будет этот vXX поддерживать, если у нас уже есть vYY и даже vZZ? И кто будет оплачивать поддержку этого vXX в течение следующих 5 лет? И ладно бы это был внешний API (там как раз могут найтись клиенты с деньгами). А вот если API внутренний и другие ищут предлоги вообще ничего не делать?
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>У нас внутри экосистемы подобные механизмы документированы и поддерживаются всеми клиентам. Консумер или берет такой клиент, или пилит свой с учетом конвеншна. ·>Ты так и не обосновал, зачем это пихать в каждый ответ. Чем это принципиально отличается от простой публикации changelog консьюмерам.
changelog содержит мизерное количество информации — название, ссылка на тикет, подробности, каменты, пул-реквест и тд. Отсюда далеко не всегда ясно, каким именно будет поведение конкретной системы. Соответсвенно, придется 1. прогнать тесты для всех n-систем/сервисов 2. надеяться, что в тестах будет прокрыта именно та самая ветка(и тут надо вспомнить, что не существует таких гарантий).
Т.е. все равно придется подкрутить мониторинг, что бы он хоть как то детектил проблемы, на случай п.2
А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и дает знать команде соответсвующего сервиса, что у них чтото там не то.
·>Я ещё понимаю, если посылать номер версии в хедере "Server" или каком-нибудь "X-My-API-Version". Так консумеры могут догадаться, что с v1.2.3 работало, а с v1.2.4 что-то вдруг подглючивать стало, значит стоит поподробнее changelog почитать. Но что делать с Warning?
Например, мониторинг может подсказать, что после передеплоймента какого то из сервисов часть клиенты начали получать варнинги, и это стоит проверить.
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>·>Да и у емейла больше шанса, что его прочитают и отреагируют. M>Совершенно не факт. Это у вас какая-то идеальная корпорация в вакууме. На практике там будет "ой, а мы не заметили". Или "ой, а на тот момент у нас были другие приоритеты и потом мы забиыли". Или вообще "а мы сервис только месяц назад получили, нас никто об изменениях не уведомлял". А так у меня все прекрасно получается. Письма я отправил всем, кому мог и кого знал (да еще и не один раз). Если вдруг не заметили —
Ну если клиент важный и платит много денег, то можно добиться реакции на письмо. Если на мыло не отвечают совсем, то можно даже позвонить и даже ногами прийти.
M>API выдавало предупреждения уже 3 месяца. Вон, в Istio нарисовано же в метриках.
А это бесмысленная попытка решать административные проблемы техническими средствами.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, ·, Вы писали:
P>>>У нас внутри экосистемы подобные механизмы документированы и поддерживаются всеми клиентам. Консумер или берет такой клиент, или пилит свой с учетом конвеншна. P>·>Ты так и не обосновал, зачем это пихать в каждый ответ. Чем это принципиально отличается от простой публикации changelog консьюмерам. P>changelog содержит мизерное количество информации — название, ссылка на тикет, подробности, каменты, пул-реквест и тд. Отсюда далеко не всегда ясно, каким именно будет поведение конкретной системы. Соответсвенно, придется 1. прогнать тесты для всех n-систем/сервисов 2. надеяться, что в тестах будет прокрыта именно та самая ветка(и тут надо вспомнить, что не существует таких гарантий).
В changelog в любом случае можно поместить несравненно больше информации, чем в хедер.
P>Т.е. все равно придется подкрутить мониторинг, что бы он хоть как то детектил проблемы, на случай п.2 А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и
Это всё средства.
P>дает знать команде соответсвующего сервиса, что у них чтото там не то.
А вот и цель. Так чем это принципиально отличается от емейла?
P>·>Я ещё понимаю, если посылать номер версии в хедере "Server" или каком-нибудь "X-My-API-Version". Так консумеры могут догадаться, что с v1.2.3 работало, а с v1.2.4 что-то вдруг подглючивать стало, значит стоит поподробнее changelog почитать. Но что делать с Warning? P>Например, мониторинг может подсказать, что после передеплоймента какого то из сервисов часть клиенты начали получать варнинги, и это стоит проверить.
Уже поздно. Хотя... если придерживаться принципа "лучше поздно, чем никогда"... то может и ок. Но это как последняя линия обороны.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>l2 смотрят логи и точно так же читают доки.
Т.е предлагается этот хидер писать в логи? Если вызовов 1 млн, то +1 млн записей в лог пока не выкатят релиз с фиксом, верно?
P>>>Что именно ты ждешь? Код, контакт, или запись видео? Внятно вопрос сформулируй. НС>>Я жду ответа на простой вопрос: "кто будет твой нестандартный хидер читать"? P>Непосредственно читать-писать будет конкретный пакет, который отвечает за капабилити или продуктовый если его команда решит все вручную пилить.
Ну прочел твой пакет, и? Что он с ним делать то будет?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[38]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>Это все абстрактно. Давай конкретно. Вот есть некий API. К нему кто то написал клиента и использует в своем софте. Вдруг в хидере начинает приходить сообщение о том, что это API устарело. Кто это сообщение увидит? M>Клиент и увидит.
Клиент это программа. Толку от того что она что то увидит никакого.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[41]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
НС>>Это тоже бессмысленно, потому что в нормальном REST url будет вида /api/vXX/collection. И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может. ·>Не может, конечно. Но есть, и будет есть всегда! Баги всё ещё не отменили.
Все равно передавать это в каждом респонсе бессмысленно. Достаточно возвращать это в каком нибудь /status или /health.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[41]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может. M>А сколько мы будет этот vXX поддерживать, если у нас уже есть vYY и даже vZZ?
Пока есть ощутимое количество пользователей. А чтобы простимулировать переход — рассылаем им письма. Добавление твоего хидера проблему никак не лечит.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>В распределенных системах это вряд ли реализуемо, так как упирается в САР-теорему. Максимум можно такое обеспечить для асинхронных операций, и то это будет та еще эквилибристика. M>А что сложного?
M>Мы уже более-менее согласились на eventual consistency.
Поэтому я и написал про асинхронные вызовы.
M> В рамках eventual consistency уже могут быть различные варианты и техники реализации (те же CRDT-типы в разных вариациях).
И все они сильно сложнее простого синхронного вызова.
M> Ну и вообще, у нас же "Representational State Transfer". У нас операций нет.
Есть. Про verb в HTTP слышал?
M> Мы просто иногда делимся представлением своего локального состояния.
Давай посмотрим на определение, раз уж ты о терминах заговорил:
The term representational state transfer was introduced and defined in 2000 by Roy Fielding in his doctoral dissertation. The term is intended to evoke an image of how a well-designed Web application behaves: it is a network of Web resources (a virtual state machine) where the user advances through the application by selecting links (e.g. http://www.example.com/articles/21), resulting in the next resource's representation (the next application state) being transferred to the client and rendered for the user.
Тут, как видишь, нет ничего про "делимся представлением". Здесь есть про переходы по ссылкам (ака операции), которые приводят к изменению состояния.
M> В этом плане отправка состояния по HTTP мало чем отличается от "асинхронной отправки".
Под асинхронной отправкой я подразумевал менее абстрактные вещи (так то почти все можно асинхронным обозвать). Например когда API использует 202 код, поллинг, хттп-колбеки етц.
С той же оплатой, к примеру — реальные платежные системы, конечно, имеют и синхронное API, и его даже используют. Но при его использовании в 99% случаев начинаются проблемы (лично несколько раз такое лечил в чужих проектах). А нормальный API подразумевает нотификации. Т.е. сервис оплаты по заданному url сам тебя дергает, когда оплата проходит. В промежутке до прихода этой нотификации заказ находится в промежуточном состоянии.
Вот такой подход (та самая eventual consistency) — работает. Но он сильно сложнее по всем параметрам, чем простая синхронная реализация, когда ты просто говоришь POST, а в ответ тебе либо 200, либо ошибка. Поэтому рядом и существует хоть и полурабочее, но простое синхронное апи.
Здравствуйте, ·, Вы писали:
P>>changelog содержит мизерное количество информации — название, ссылка на тикет, подробности, каменты, пул-реквест и тд. Отсюда далеко не всегда ясно, каким именно будет поведение конкретной системы. Соответсвенно, придется 1. прогнать тесты для всех n-систем/сервисов 2. надеяться, что в тестах будет прокрыта именно та самая ветка(и тут надо вспомнить, что не существует таких гарантий). ·>В changelog в любом случае можно поместить несравненно больше информации, чем в хедер.
changelog сам пойдет тестировать задеплоеные сервисы и проверять, покрывают ли тесты все критические места или нет?
P>>Т.е. все равно придется подкрутить мониторинг, что бы он хоть как то детектил проблемы, на случай п.2 А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и ·>Это всё средства.
Это автоматизируется. А changelog — нет.
P>>дает знать команде соответсвующего сервиса, что у них чтото там не то. ·>А вот и цель. Так чем это принципиально отличается от емейла?
Степенью автоматизации.
P>>Например, мониторинг может подсказать, что после передеплоймента какого то из сервисов часть клиенты начали получать варнинги, и это стоит проверить. ·>Уже поздно. Хотя... если придерживаться принципа "лучше поздно, чем никогда"... то может и ок. Но это как последняя линия обороны.
Неважно, первая или последняя. Закладываться на один только changelog идея так себе — например, некто забыл включить строчку этот changelog. Приплыли.
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>l2 смотрят логи и точно так же читают доки.
НС>Т.е предлагается этот хидер писать в логи? Если вызовов 1 млн, то +1 млн записей в лог пока не выкатят релиз с фиксом, верно?
У нас тысячи сервисов и все используют трейсинг. Соответственно, там и так будет 1млн записей, только +1 строчка в каждой записи. Изменение трафика ничтожное.
НС>>>Я жду ответа на простой вопрос: "кто будет твой нестандартный хидер читать"? P>>Непосредственно читать-писать будет конкретный пакет, который отвечает за капабилити или продуктовый если его команда решит все вручную пилить.
НС>Ну прочел твой пакет, и? Что он с ним делать то будет?
В соответствии со спекой для капабилити, и конфигом конкретного сервиса. Встроеные [ничего не делать, логировать, нотифицировать, бросить ошибку, вызвать хук], по дефолту — логировать. Каждую капабилити настраивает продуктовый код — "on-warning-header-behavoir":"use-hook"
Re[41]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Ну если клиент важный и платит много денег, то можно добиться реакции на письмо. Если на мыло не отвечают совсем, то можно даже позвонить и даже ногами прийти.
Клиент — внутренний и не особо нас любит. Причем не любит "просто-так", а не за то, что и как мы делаем. И вообще он по иерархии того же уровня, что и моя команда. Так что это совсем не моя обязанность в течение трех месяцев уговаривать их перейти на новый API.
M>>API выдавало предупреждения уже 3 месяца. Вон, в Istio нарисовано же в метриках. ·>А это бесмысленная попытка решать административные проблемы техническими средствами.
Почему бессмысленая? Как раз таки очень осмысленная. По результату всех принятых мер я и моя команда находимся в хорошем положении. Если что-то не работает — это не наши проблемы! Этим и достигается цель. Да, я могу выслушать грустную историю. Предложить административные пути. Например, увеличить сроки обратной совместимости (и, соответственно, быть готовым к уменьшению нашей скорости разработки). Или провести лекцию о метриках и мониторинге для той команды, которая три месяца предпочитала ничего не замечать. С техническими средствами я сделал все, что было в моих силах в рамках моей зоны ответственности. А без технических средств я останусь виноватым в недостаточной коммуникации. С учетом того, что я формально разработчик — выбор очевиден.
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>В changelog в любом случае можно поместить несравненно больше информации, чем в хедер.
И в changelog оно тоже есть, коды предупреждений на него и ссылаются. Только вот насколько регулярно вы читаете этот changelog? И сколько именно этих changelog вы читаете? Может, у вашей команды 5 сервисов, которые обращаются к 10 другим сервисам. И за всеми изменениями нужно следить. С метриками чуть проще. На dashboard делается сводная статистика "по команде" по предупреждениям. Если что-то есть, можно посмотреть в конкретные сервисы. В результате я получаю ровно одно место, за которым нужно регулярно следить. Например, заходить туда раз в неделю.
P>>А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и ·>Это всё средства.
А в чем проблема с данными средствами? Они же (в простейшем варианте) дешевые. Настолько сложно добавить заголовок в ответ? Или очень сложно посмотреть на заголовки ответа и увеличить метрику? Хотя да, почему-то второе сейчас является большой проблемой для программистов .
P>>дает знать команде соответсвующего сервиса, что у них чтото там не то. ·>А вот и цель. Так чем это принципиально отличается от емейла?
Сложнее пропустить или забыть со временем. Настроенные алерты по метрикам (например, раз в неделю) — отличная напоминалка. Нет вероятности, что про конкретного пользователя системы забудут. И нет лишнего спама, когда changelog рассылается всем "на всякий случай". Сразу видна релевантность. Не нужно думать о том, затрагивают ли изменения именно ваши сервисы или нет. Можно делать сводные метрики и статистику "по команде" а не 10 списков по отдельным сервисам.
Есть и неочевидное преимущество. Предупреждения автоматические и не зависят от человека. Они могут находить "заброшенные" ветки в коде. Например, есть у нас сценарий, который встречается 3-4 раза в неделю. Он реализован уже давно, работает уже больше года без изменений. И вот какое-то API, используемое в этом редком случае, меняется. Какова вероятность того, что разработчики сервиса вспомнят про этот редкий случай и обновят использование там? Обнаружат ли забытое изменение во время тестов (и если да, то как)? В случае заголовка обычно чуть проще. Заголовок обрабатывается на уровне обертки вокруг http-клиента (т.е. универсально). Забытый сценарий будет отображен на метриках. И у команды будет еще много времени на то, чтобы найти и обновить использование API.
P>>Например, мониторинг может подсказать, что после передеплоймента какого то из сервисов часть клиенты начали получать варнинги, и это стоит проверить. ·>Уже поздно. Хотя... если придерживаться принципа "лучше поздно, чем никогда"... то может и ок. Но это как последняя линия обороны.
Не поздно. Ничего непоправимого пока не произошло. Так что этот заголовок из серии "лучше иметь чем не иметь".
Re[39]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Клиент это программа. Толку от того что она что то увидит никакого.
Какая программа? Если браузер — да, смысла никакого. Если же это другое (серверное) приложение, то как минимум она может увеличить метрику. Свою метрику. Потому что переходить на новое API нужно команде, отвечающей за приложение-клиента.
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>А чтобы простимулировать переход — рассылаем им письма. Добавление твоего хидера проблему никак не лечит.
У меня в основном внутрикорпоративные клиенты. И один из самых лучших методов стимуляции — эскалация к общему начальнику. Отлично работает! "Я им и письма послал, и заголовки сделал, чтобы они могли сами все увидеть, а они ни в какую". С начальником еще и SLA по обратной совместимости можно обсудить. Так что когда что-то через три месяца сломается — моя совесть будет чиста.
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Клиент — внутренний и не особо нас любит. Причем не любит "просто-так"
НС> НС>И зачем тогда об этих прекрасных отношениях внутри вашей организации писать сюда, преподнося это как аргумент?
Внутренние клиенты есть всегда. Вот внешние — это далеко не обязательно. Скажем, доля рестовых коммуникаций сильно скукожилась т.е. новые околобраузерные веяния вытесняют рест и задвигают его в приватную сеть.
То есть, браузер фактически общается с api gateway, а реальный rest сервис сидит в приватной сети. То есть, api gateway для нас это внутренний консумер. Сервис, который обращется к другому сервису — снова внутренний консумер. Бакенд обращается к кучке сервисов — снова внутренний консумер.
Даже если мы продаём API, то всё равно напрямую никто не лезет в приватную сеть минуя файрволы и гатевеи. Отсюда ясно, что чуть ли не все непосредственные консумеры это внутренние.
И вот на такой api gateway как правило навешиваются самые разные капабилити, и не важно, где они документированы, в open source, как трейсинг, или во внутренней документации экосистемы.
Более того, часто продукты используют пакет X-саpability не напрямую, а в составе какого то компонента как депенденси 2го уровня. Отсюда ясно, что changelog ничем не помогает — мало кто способен отслеживать все n*m зависимостей 2го уровня.
Например, им нужен не "умный клиент к сервису AБЦ", а "источник данных для аналитики". Аналитика пишется другой командой, и это просто пакет, который умеет тащить данные из разных источников и обрабатывать их. Соответственно, как только в конфиге появилась строчка "analytic-source": { "use-provider": "odata", "endpoint": "${analytic-endpoint}" } то у нас вдруг играет тот самый кейс — обновили чего то там, а эффекты появляются здесь. И при этом команда конкретного продукта абсолютно не в курсе, какие из её компонентов что то там унутре делают. Все что им надо — подлючили пакет аналитики, прикрутили роут, подкинули страничку-стили и всё готово.
Далее, при деплое зависимости 2го уровня могут малёха поменяться, так, по мелочи. Кто будет курить changelog n*m таких зависимостей?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>А не проще тогда в лог или метрику сразу писать, а не пересылать зачем то в хидерах клиентам?
В чей лог? В лог моего сервера писать бесполезно. Я прекрасно знаю, что API было объявлено deprecated (или что там у нас по сообщению). И раз изменение там, значит, я уже принял решение совсем убрать API через некоторое время. И должно очень многое измениться, чтобы я изменил свое решение. (Хотя внутренняя метрика тоже будет собираться, это да). Сейчас очередь что-то менять уже за клиентами. Нужно уведомлять их. Да, им будут письма и changelog. Но их можно забыть или пропустить на общем фоне. Или забыть про какой-то редкий сервис (например, работающий раз в неделю по таймеру). А еще нужно бы доставлять уведомления только релевантным клиентам. Может, из трех клиентских приложений изменения потребуются только в одном? Т.е. задача в том, чтобы как-то воздействовать на сервис-клиента.
Да, в некотором виде можно делать метрику "для другой команды". Делать "произвольные" метрики я не очень хочу. Например, максимум, что я могу различать — это внутренний логин или токен приложения. А что если у них несколько различных модулей ходят под одним логином? (Например, web-api и докатка транзакий, отвалившихся из-за сетевой ошибки). Я на сервере не смогу их отличить. А вот клиент вполне может иметь нужные идентификации метрик, чтобы сказать "да, докатчик-то мы и забыли". Поэтому в моей философии проще дать клиенту достаточно гибкие средства и пусть они используют их так, как могут. Метрики в Service Mesh здесь были бы идеальным вариантом. Но, опять же, я должен сказать мешу, что "вот в процессе этого обмена сообщениями есть подозрительные вещи". А не просто посчитать, сколько у меня было сомнительных клиентов.
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>И зачем тогда об этих прекрасных отношениях внутри вашей организации писать сюда, преподнося это как аргумент?
Например затем, чтобы показать, что технические средства все-таки решают реальные проблемы. В том числе — и проблемы неэффективных организаций. Все-таки приходится разрабатывать системы в коллективах с реальными людьми. Можно ждать, пока огранизация станет идеальной (не станет). Можно решать по мере сил. Технические решения, которые работают только в строго контроллируемых условиях меня мало интересуют.
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>changelog содержит мизерное количество информации — название, ссылка на тикет, подробности, каменты, пул-реквест и тд. Отсюда далеко не всегда ясно, каким именно будет поведение конкретной системы. Соответсвенно, придется 1. прогнать тесты для всех n-систем/сервисов 2. надеяться, что в тестах будет прокрыта именно та самая ветка(и тут надо вспомнить, что не существует таких гарантий). P>·>В changelog в любом случае можно поместить несравненно больше информации, чем в хедер. P>changelog сам пойдет тестировать задеплоеные сервисы и
Ну да, естественно. Деплоймент и прогон тестов называется. Выкатываешь новую версию и смотришь какие тесты упали.
P>проверять, покрывают ли тесты все критические места или нет?
У тестов должно быть ровно два состояния — PASS и FAIL. Чем тут помогут warnings?
P>>>Т.е. все равно придется подкрутить мониторинг, что бы он хоть как то детектил проблемы, на случай п.2 А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и P>·>Это всё средства. P>Это автоматизируется.
Добавление хедеров и варнингов в правильных местах? Правильная реакция на неправильные хедеры? Что именно автоматизируется-то?
P>А changelog — нет.
changelog автоматизировать на порядки легче. Даже во всяких github/jira это всё из коробки.
P>>>дает знать команде соответсвующего сервиса, что у них чтото там не то. P>·>А вот и цель. Так чем это принципиально отличается от емейла? P>Степенью автоматизации.
Верно. Емейлы-то элементарно автоматизируются. Чего не скажешь о кастомных хедерах.
P>>>Например, мониторинг может подсказать, что после передеплоймента какого то из сервисов часть клиенты начали получать варнинги, и это стоит проверить. P>·>Уже поздно. Хотя... если придерживаться принципа "лучше поздно, чем никогда"... то может и ок. Но это как последняя линия обороны. P>Неважно, первая или последняя. Закладываться на один только changelog идея так себе — например, некто забыл включить строчку этот changelog. Приплыли.
Тесты должны упасть.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>·>Ну если клиент важный и платит много денег, то можно добиться реакции на письмо. Если на мыло не отвечают совсем, то можно даже позвонить и даже ногами прийти. M>Клиент — внутренний и не особо нас любит. Причем не любит "просто-так", а не за то, что и как мы делаем. И вообще он по иерархии того же уровня, что и моя команда. Так что это совсем не моя обязанность в течение трех месяцев уговаривать их перейти на новый API.
А посылать хедер в течение трёх месяцев — обязанность что-ли? Хедеры обладают какой-то более сильной уговаривающей силой или что?
M>>>API выдавало предупреждения уже 3 месяца. Вон, в Istio нарисовано же в метриках. M>·>А это бесмысленная попытка решать административные проблемы техническими средствами. M>Почему бессмысленая? Как раз таки очень осмысленная. По результату всех принятых мер я и моя команда находимся в хорошем положении. Если что-то не работает — это не наши проблемы! Этим и достигается цель. Да, я могу выслушать грустную историю. Предложить административные пути. Например, увеличить сроки обратной совместимости (и, соответственно, быть готовым к уменьшению нашей скорости разработки). Или провести лекцию о метриках и мониторинге для той команды, которая три месяца предпочитала ничего не замечать. С техническими средствами я сделал все, что было в моих силах в рамках моей зоны ответственности. А без технических средств я останусь виноватым в недостаточной коммуникации. С учетом того, что я формально разработчик — выбор очевиден.
Непонятно в чём принципиальная разница незамечания емейлов от незамечания хедеров.
Незамеченный емейл можно вышестоящему начальству форварднуть, а что делать с незамеченным хедером — совсем неясно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[40]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>Клиент это программа. Толку от того что она что то увидит никакого. M>Какая программа? Если браузер — да, смысла никакого. Если же это другое (серверное) приложение, то как минимум она может увеличить метрику. Свою метрику.
Для этого надо знать про твои хидеры и специально туда в клиента засунуть код, который метрику будет писать. Какой то интересный у тебя получается клиент. С одной стороны емейлы и релизноты читать не хочет, но метрику с твоим кастомным хидером во все свои проекты засунуть готов.
Собственно, в текущем проекте у меня была похожая проблема. Мы делали breaking changes, писали об этом в релизнотах и проговаривали на демах, а потом все равно прибегали плачущие товарищи с воплями, что у них все сломалось.
Решилась проблема чисто административными методами — заставили всех затронутых в обязательном порядке внимательно читать релизноты, благо они обычно не гигантские. И, как по волшебству, все проблемы исчезли.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>А чтобы простимулировать переход — рассылаем им письма. Добавление твоего хидера проблему никак не лечит. M>У меня в основном внутрикорпоративные клиенты. И один из самых лучших методов стимуляции — эскалация к общему начальнику. Отлично работает!
Или так.
M> "Я им и письма послал, и заголовки сделал
Заголовки тут — абсолютно лишняя сущность.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[44]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>То есть, браузер ... P>Даже если мы продаём API ... P>И вот на такой api gateway ...
У меня текущий продукт ровно по такой схеме и построен. Только при чем тут заголовки с варнингами?
P>Более того, часто продукты используют пакет X-саpability не напрямую, а в составе какого то компонента как депенденси 2го уровня. Отсюда ясно, что changelog ничем не помогает — мало кто способен отслеживать все n*m зависимостей 2го уровня.
Зависимости 2-го уровня тебе и заголовки не помогут отследить, они ж только на одном уровне присутствуют. А релизноты непосредственных зависимостей ты читать обязан, и заголовки — крайне фиговая им замена.
P>Например, им нужен не "умный клиент к сервису AБЦ", а "источник данных для аналитики". Аналитика пишется другой командой, и это просто пакет, который умеет тащить данные из разных источников и обрабатывать их. Соответственно, как только в конфиге появилась строчка "analytic-source": { "use-provider": "odata", "endpoint": "${analytic-endpoint}" } то у нас вдруг играет тот самый кейс — обновили чего то там, а эффекты появляются здесь.
Заголовки тут не спасут.
P>Далее, при деплое зависимости 2го уровня могут малёха поменяться, так, по мелочи. Кто будет курить changelog n*m таких зависимостей?
Заголовки тут не спасут.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[44]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
НС>>А не проще тогда в лог или метрику сразу писать, а не пересылать зачем то в хидерах клиентам? M>В чей лог? В лог моего сервера писать бесполезно. Я прекрасно знаю, что API было объявлено deprecated (или что там у нас по сообщению).
Ну и прекрасно. Осталось сделать даш и предоставить к нему доступ клиентам, чтобы они могли в реальном времени наблюдать свои косяки. Можешь даже настроить репликацию нужной части своих метрик в их кластер, если он у них другой. Это все равно будет намного лучше какого то неизвестного хидера, засирающего боевой обмен.
Наконец, ты у себя можешь настроить алерты, которые будут рассылаться пациентам в автоматичном режиме.
M>А что если у них несколько различных модулей ходят под одним логином?
Это их проблема. Пусть UA корректно выставляют, к примеру.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[42]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Это тоже бессмысленно, потому что в нормальном REST url будет вида /api/vXX/collection. И в рамках конкретного vXX никаких ломающих изменений и устаревших API в принципе быть не может. НС>·>Не может, конечно. Но есть, и будет есть всегда! Баги всё ещё не отменили. НС>Все равно передавать это в каждом респонсе бессмысленно. Достаточно возвращать это в каком нибудь /status или /health.
Да, может быть достаточно. В общем случае — недостаточно, например, если есть какой-нибудь load balancer, который потенциально может распределять запросы инстансам разных версий.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>·>например, если есть какой-нибудь load balancer, который потенциально может распределять запросы инстансам разных версий. НС>Это уже какой то абсурд.
Это спека REST. Там каждый запрос независим и может обрабатываться разными серверами.
Берёшь какой-нибудь kubernetes и там такое как минимум во время деплоев происходит.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[45]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>У меня текущий продукт ровно по такой схеме и построен. Только при чем тут заголовки с варнингами?
При том, что трафик после такого гатевея уже внутренний, а раз так, то на него можно навешивать какие угодно капабилити. Т.е. приложение переписывать не нужно, а только переконфигурить сам гатевей который обычно не часть приложения, т.е. его можно пичкать какой угодно логикой. Например, гатевей будет блокировать реквесты от конкретных юзеров, клиентов, если варнинги идут больше недели.
НС>Зависимости 2-го уровня тебе и заголовки не помогут отследить, они ж только на одном уровне присутствуют. А релизноты непосредственных зависимостей ты читать обязан, и заголовки — крайне фиговая им замена.
1. сhangelog это в чистом виде человеческий фактор. например, девелопер не просмотрел, не учел последствия. Или поставил в тикете не ту версию, или не тот статус, или вообще забыл про статус. Или случайно вмергал. Или xxx-yyy других причин. И в changelog ничего внятного просто нет.
А может быть changelog просто дикий, вбросили адову кучу мелких фиксов и обновлений зависимостей, а у вас эта либа используется повсюду.
2. И вот ты прочел changelog, проверил все что мог, тебя тесты зелёные. Твои действия? Что конкретно ты будешь предпринимать
в такой вот ситуации? Есть хороший пример, что бы не абстрактно рассуждать? ты то не надеешься на варнинги, как с проблемой будешь работать?
P>>Например, им нужен не "умный клиент к сервису AБЦ", а "источник данных для аналитики". Аналитика пишется другой командой, и это просто пакет, который умеет тащить данные из разных источников и обрабатывать их. Соответственно, как только в конфиге появилась строчка "analytic-source": { "use-provider": "odata", "endpoint": "${analytic-endpoint}" } то у нас вдруг играет тот самый кейс — обновили чего то там, а эффекты появляются здесь.
НС>Заголовки тут не спасут.
Зато это уже можно автоматизировать. А вот как автоматизировать обработку changelog депенденсов 2го уровня — не ясно.
P>>Далее, при деплое зависимости 2го уровня могут малёха поменяться, так, по мелочи. Кто будет курить changelog n*m таких зависимостей?
НС>Заголовки тут не спасут.
Это смотря как ты ими пользоваться будешь.
Re[43]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>changelog сам пойдет тестировать задеплоеные сервисы и ·>Ну да, естественно. Деплоймент и прогон тестов называется. Выкатываешь новую версию и смотришь какие тесты упали.
Очевидно — никакие. Дальше что?
P>>проверять, покрывают ли тесты все критические места или нет? ·>У тестов должно быть ровно два состояния — PASS и FAIL. Чем тут помогут warnings?
Подозреваю, щас у тебя будет очередной аргумент "а надо писать без багов". 100% покрытие просто недостижимо, даже если считать по строчкам кода. Отсюда ясно, что должны быть другие механизмы обнаруживать и репортить ошибки
1. логирование
2. мониторинг
3. эксплорейтори тестирование (не путать с рандомным)
4. ассерты, варнинги, фолты, итд
P>>>>Т.е. все равно придется подкрутить мониторинг, что бы он хоть как то детектил проблемы, на случай п.2 А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и P>>·>Это всё средства. P>>Это автоматизируется. ·>Добавление хедеров и варнингов в правильных местах? Правильная реакция на неправильные хедеры? Что именно автоматизируется-то?
Тебе что, не ясно, что такое мониторинг? Цитирую себя:
"А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и "
P>>А changelog — нет. ·>changelog автоматизировать на порядки легче. Даже во всяких github/jira это всё из коробки.
ну написано в там — пофиксили уязвимость в парсере. твои тесты зелёные. Дальше что?
P>>Степенью автоматизации. ·>Верно. Емейлы-то элементарно автоматизируются. Чего не скажешь о кастомных хедерах.
С емейлами одна проблема — это в чистом виде человеческий фактора, например, потому что "устал, много писем, (не)прочитаю в понедельник"
Я например регулярно сталкиваюсь с ситуацией , что какой либо менеджер не отвечает на письма. Думаешь если ему подкинуть еще сотню-другу емейлов, так он быстрее разгребется?
P>>Неважно, первая или последняя. Закладываться на один только changelog идея так себе — например, некто забыл включить строчку этот changelog. Приплыли. ·>Тесты должны упасть.
Ну ок — реквест состоит из 100 переменных true-false, как долго будешь искать, какая же комбинация "та самая"?
Re[44]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>changelog сам пойдет тестировать задеплоеные сервисы и P>·>Ну да, естественно. Деплоймент и прогон тестов называется. Выкатываешь новую версию и смотришь какие тесты упали. P>Очевидно — никакие. Дальше что?
Дальше работаем.
P>>>проверять, покрывают ли тесты все критические места или нет? P>·>У тестов должно быть ровно два состояния — PASS и FAIL. Чем тут помогут warnings? P> Подозреваю, щас у тебя будет очередной аргумент "а надо писать без багов". 100% покрытие просто недостижимо, даже если считать по строчкам кода. Отсюда ясно, что должны быть другие механизмы обнаруживать и репортить ошибки P>1. логирование P>2. мониторинг P>3. эксплорейтори тестирование (не путать с рандомным) P>4. ассерты, варнинги, фолты, итд
Это всё внутренняя кухня. Зачем это слать наружу, в каждом респонзе и засирать прод трафик-то? С учётом того, что консьюмеры это могут всё влёгкую игнорировать.
P>>>·>Это всё средства. P>>>Это автоматизируется. P>·>Добавление хедеров и варнингов в правильных местах? Правильная реакция на неправильные хедеры? Что именно автоматизируется-то? P>Тебе что, не ясно, что такое мониторинг? Цитирую себя: P>"А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и "
Ты обещал автоматически. Как автоматически появится такой мониторинг? И как ты убедишься, что этот мониторинг есть и выдаёт адекватные сигналы? Кто будет проверять эти сигналы? Никакой автоматики я пока не вижу — всё придётся вручную сооружать, расставлять эти варнинги, майнтейнить, анализировать и... в итоге слать менеджерам письма, чтобы они на эти варнинги хоть как-то реагировали. Не проще ли сразу начать с писем?
P>>>А changelog — нет. P>·>changelog автоматизировать на порядки легче. Даже во всяких github/jira это всё из коробки. P> ну написано в там — пофиксили уязвимость в парсере. твои тесты зелёные. Дальше что?
Ты сценарий не с потолка бери, а начни с того, как тебе помогут варнинг-хедеры и каким образом они появятся _автоматически_ как ты обещаешь.
P>>>Степенью автоматизации. P>·>Верно. Емейлы-то элементарно автоматизируются. Чего не скажешь о кастомных хедерах. P>С емейлами одна проблема — это в чистом виде человеческий фактора, например, потому что "устал, много писем, (не)прочитаю в понедельник" P>Я например регулярно сталкиваюсь с ситуацией , что какой либо менеджер не отвечает на письма. Думаешь если ему подкинуть еще сотню-другу емейлов, так он быстрее разгребется?
Ясно. Хедеры значит этот менеджер читает, а на емейлы сил уже не хватает.
P>>>Неважно, первая или последняя. Закладываться на один только changelog идея так себе — например, некто забыл включить строчку этот changelog. Приплыли. P>·>Тесты должны упасть. P>Ну ок — реквест состоит из 100 переменных true-false, как долго будешь искать, какая же комбинация "та самая"?
Не дольше, чем искать для какой комбинации нужен варнинг.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
P>>Очевидно — никакие. Дальше что? ·>Дальше работаем.
Очевидно, ты проигнорировал проблему. А вот наличие варнингов можно словить мониторингом и зарепортать.
Ровно так же работают и логи, ассерты и многие вещи. Хидер нужен в том случае, что бы уведомить вызывающую сторону тем или иным способом. Например, если клиент предоставляешь свой собственный.
·>Это всё внутренняя кухня. Зачем это слать наружу, в каждом респонзе и засирать прод трафик-то? С учётом того, что консьюмеры это могут всё влёгкую игнорировать.
Внутренние консумеры не могут. А это бОльшая часть трафика. Внешние — тоже могут учитывать.
P>>"А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и " ·>Ты обещал автоматически. Как автоматически появится такой мониторинг? И как ты убедишься, что этот мониторинг есть и выдаёт адекватные сигналы? Кто будет проверять эти сигналы?
Добавить правило в мониторинг это дело секунд. Все остальное — автоматически. В AWS это вообще мышом делается, накликал и будет анализировать логи/хидеры до скончания времён.
> Никакой автоматики я пока не вижу — всё придётся вручную сооружать, расставлять эти варнинги, майнтейнить, анализировать и... в итоге слать менеджерам письма, чтобы они на эти варнинги хоть как-то реагировали. Не проще ли сразу начать с писем?
О чем писать будешь, если тесты зелёные? Эй, манагеры, n*m зависимостей второго уровня чего то там поменяли, а вдруг у нас чтото не то?
P>> ну написано в там — пофиксили уязвимость в парсере. твои тесты зелёные. Дальше что? ·>Ты сценарий не с потолка бери, а начни с того, как тебе помогут варнинг-хедеры и каким образом они появятся _автоматически_ как ты обещаешь.
Я уже несколько раз показал. А ты еще ни разу. У тебя какая то магия — changelog сделает всё сам за себя.
Варнинги появляются как обычно, это разновидность ассертов/логирования, только рендерится и в респонс.
Итого — ты как решать будешь?
P>>С емейлами одна проблема — это в чистом виде человеческий фактора, например, потому что "устал, много писем, (не)прочитаю в понедельник" P>>Я например регулярно сталкиваюсь с ситуацией , что какой либо менеджер не отвечает на письма. Думаешь если ему подкинуть еще сотню-другу емейлов, так он быстрее разгребется? ·>Ясно. Хедеры значит этот менеджер читает, а на емейлы сил уже не хватает.
Я пишу про мониторинг, а тебе мерещится "менеджер хидеры читает". Ты адекватен?
Как в твоем случае проблему обнаруживать будешь?
P>>Ну ок — реквест состоит из 100 переменных true-false, как долго будешь искать, какая же комбинация "та самая"? ·>Не дольше, чем искать для какой комбинации нужен варнинг.
Ты похоже не понял, что такое 2 в степени 100. Тестами ты гарантировано ничего такого не найдешь, т.к. прогон тестов закончится вместе с электричеством.
А вот на проде, скажем, если поставишь Warning.assert(precondontion, 'unexpected input') то все значения будут проходит эту проверку, и все подозрительные будут зарепортаны.
Здравствуйте, Pauel, Вы писали:
P>>>Очевидно — никакие. Дальше что? P>·>Дальше работаем. P>Очевидно, ты проигнорировал проблему. А вот наличие варнингов можно словить мониторингом и зарепортать.
Я не увидел проблему.
P>·>Это всё внутренняя кухня. Зачем это слать наружу, в каждом респонзе и засирать прод трафик-то? С учётом того, что консьюмеры это могут всё влёгкую игнорировать. P>Внутренние консумеры не могут. А это бОльшая часть трафика. Внешние — тоже могут учитывать.
Почему не могут? И на вопрос "зачем" ты так и не ответил.
P>>>"А так у нас сразу есть звоночек от мониторинга — на сервисах 0, 8, 124 варнинги, реквест-респонс прилагаются. дальше l2 разбирается, что откуда куда пришло, по трейсингу, и " P>·>Ты обещал автоматически. Как автоматически появится такой мониторинг? И как ты убедишься, что этот мониторинг есть и выдаёт адекватные сигналы? Кто будет проверять эти сигналы? P>Добавить правило в мониторинг это дело секунд.
А толку? Правило в мониторинге полезно только тогда, когда оно работает, работает правильно и сообщает нужным людям нужную информацию. Этот аспект ты полностью умалчиваешь. Ведь по итогу все эти дашборды и мониторинги лишь для того, чтобы создать таску в джире и послать емейл.
>> Никакой автоматики я пока не вижу — всё придётся вручную сооружать, расставлять эти варнинги, майнтейнить, анализировать и... в итоге слать менеджерам письма, чтобы они на эти варнинги хоть как-то реагировали. Не проще ли сразу начать с писем? P>О чем писать будешь, если тесты зелёные? Эй, ребята, n*m зависимостей второго уровня чего то там поменяли, а вдруг у нас чтото не то?
У этих ребят должен быть свой мониторинг и процессы QA. Как ни странно.
P>·>Ты сценарий не с потолка бери, а начни с того, как тебе помогут варнинг-хедеры и каким образом они появятся _автоматически_ как ты обещаешь. P>Я уже несколько раз показал. А ты еще ни разу. У тебя какая то магия — changelog сделает всё сам за себя. P>Варнинги появляются как обычно, это разновидность логирования, только рендерится и в респонс.
В чём преимущество рендерить в респонс-то? Рендери как обычно, в логи. Логи можно раздавать всем желающим, если хочется.
P>Итого — ты как решать будешь?
Чтобы что-то решать, я должен понять задачу. Какую задачу решает логгирование в респонз и не может решить логирование в логи?
P>·>Ясно. Хедеры значит этот менеджер читает, а на емейлы сил уже не хватает. P>Я пишу про мониторинг, а тебе мерещится "менеджер хидеры читает". Ты адекватен? P>Как в твоем случае проблему обнаруживать будешь?
Вначале расскажи, какую проблему можно обнаружить по хедерам, но невозможно обнаружить по логам?
P>·>Не дольше, чем искать для какой комбинации нужен варнинг. P> Ты похоже не понял, что такое 2 в степени 100. Тестами ты гарантировано ничего такого не найдешь, т.к. прогон тестов закончится вместе с электричеством. P>А вот на проде, скажем, если поставишь Warning.assert(precondontion, 'unexpected input') то все значения будут проходит эту проверку, и все подозрительные будут зарепортаны.
Да ради бога. Для этого и придумали логи. Зачем в респонз-то?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[47]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Очевидно, ты проигнорировал проблему. А вот наличие варнингов можно словить мониторингом и зарепортать. ·>Я не увидел проблему.
В том то и дело, что тесты её не показывают. Её можно увидеть только в рантайме, если есть. Ровно то же, что и трейсинг/логирование, только идет в обратную сторону.
P>>·>Это всё внутренняя кухня. Зачем это слать наружу, в каждом респонзе и засирать прод трафик-то? С учётом того, что консьюмеры это могут всё влёгкую игнорировать. P>>Внутренние консумеры не могут. А это бОльшая часть трафика. Внешние — тоже могут учитывать. ·>Почему не могут? И на вопрос "зачем" ты так и не ответил.
Потому, что внутренних консумеров мы контролируем, для этого есть документация по каждой из капабилити. Например, мы требуем трейсинг, а это значит, что они берут готовый инструмент с нашими настройками, а не мастырят чтото своё на коленке "я просто пишу в сокет". Ровно так же с любой капабилити.
P>>Добавить правило в мониторинг это дело секунд. ·>А толку? Правило в мониторинге полезно только тогда, когда оно работает, работает правильно и сообщает нужным людям нужную информацию. Этот аспект ты полностью умалчиваешь.
Мониторинг уже протестировали. Остается кейс конкретного сервиса.
P>>О чем писать будешь, если тесты зелёные? Эй, ребята, n*m зависимостей второго уровня чего то там поменяли, а вдруг у нас чтото не то? ·>У этих ребят должен быть свой мониторинг и процессы QA. Как ни странно.
У тех ребят точно так же 100% покрытия недостижимо. А раз у них есть и мониторинг, то проблема наполовину решена.
P>>Варнинги появляются как обычно, это разновидность логирования, только рендерится и в респонс. ·>В чём преимущество рендерить в респонс-то? Рендери как обычно, в логи. Логи можно раздавать всем желающим, если хочется.
Можно. Если ты точно знаешь, что у конечного сервиса есть все данные, что бы идентифицировать проблему, то можно и так. А если сервис не может этого сделать, надо бы делегировать обязанности тому, кто может, например, api gateway тот же.
P>>А вот на проде, скажем, если поставишь Warning.assert(precondontion, 'unexpected input') то все значения будут проходит эту проверку, и все подозрительные будут зарепортаны. ·>Да ради бога. Для этого и придумали логи. Зачем в респонз-то?
Здравствуйте, Pauel, Вы писали:
НС>>У меня текущий продукт ровно по такой схеме и построен. Только при чем тут заголовки с варнингами? P>При том, что трафик после такого гатевея уже внутренний
Да. Я тебе больше скажу — у меня там целая пачка кастомных хидеров бегает. Но вот варнинги там точно не нужны.
P>, а раз так, то на него можно навешивать какие угодно капабилити.
Можно, но в хидерах не нужно. Это, по сути, статическая информация. Меняется при деплое, либо, в совсем уж экзотических случаях типа А/В, при изменении конфигурации. В условиях кубера такое обычно реализуют при помощи custom resource, из которого сервисы либо напрямую читают, либо их кормит этим специальный оператор. Так если для публичного апи какую то сомнительную пользу из обсуждаемого хидера еще и можно извлечь, то внутри кластера такие варнинги как собаке пятая нога.
P>Например, гатевей будет блокировать реквесты от конкретных юзеров, клиентов, если варнинги идут больше недели.
Такие вещи, как я уже сказал, обычно делаются при помощи CR и оператора (либо, если нужна супероперативность, с каким нибудь промежуточным хранилищем типа редиса или консула), а не засером всего внутреннего трафика дублирующейся информацией, которую придется как то обрабатывать всем сервисам (ну либо вешать на все сервисы специальные RP как в istio, что отдельная история).
P>1. сhangelog это в чистом виде человеческий фактор. например, девелопер не просмотрел, не учел последствия.
И это надо чинить. Потому что релизноты покрывают намного больше кейсов, чем предложенные заголовки.
P>2. И вот ты прочел changelog, проверил все что мог, тебя тесты зелёные. Твои действия? Что конкретно ты будешь предпринимать P> в такой вот ситуации? Есть хороший пример, что бы не абстрактно рассуждать? ты то не надеешься на варнинги, как с проблемой будешь работать?
Вопрос непонятен. О какой проблеме речь?
НС>>Заголовки тут не спасут. P>Зато это уже можно автоматизировать.
Можно. Но заголовки — лишняя сущность для этого.
P> А вот как автоматизировать обработку changelog депенденсов 2го уровня — не ясно.
Еще раз — 2 уровень заголовки тоже не отслеживают (если конечно ты не будешь эти заголовки пропогейтить по всей цепочке, что совсем уж дичь если сопоставить с исходной задачей).
Ты выкинь из головы все технические подробности и посмотри на проблему сверху. У тебя уже ровно в момент прихода реквеста непосредственно в сервис уже все известно и понятно. От того что ты потом эту информацию погонишь с респонсом обратно — ни новой информации, не улучшения доступности существующей не дает. Это абсолютно бессмысленное с точки зрения системы действо. Единственное что может быть полезно это если эти заголовки кто то в какой то момент увидит глазами (ну там всякие HATEOAS, да). Но в данном случае это ничего не даст, того же эффекта можно достичь убиранием заобсоличеных методов из OpenAPI definition, что обычно и так делается автоматом.
P>>>Далее, при деплое зависимости 2го уровня могут малёха поменяться, так, по мелочи. Кто будет курить changelog n*m таких зависимостей? НС>>Заголовки тут не спасут. P>Это смотря как ты ими пользоваться будешь.
Расскажи как.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[48]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>Очевидно, ты проигнорировал проблему. А вот наличие варнингов можно словить мониторингом и зарепортать. P>·>Я не увидел проблему. P>В том то и дело, что тесты её не показывают. Её можно увидеть только в рантайме, если есть. Ровно то же, что и трейсинг/логирование, только идет в обратную сторону.
"Не увидел" в том смысле, что ты не обозначил какую задачу мы решаем.
P>>>Внутренние консумеры не могут. А это бОльшая часть трафика. Внешние — тоже могут учитывать. P>·>Почему не могут? И на вопрос "зачем" ты так и не ответил. P>Потому, что внутренних консумеров мы контролируем, для этого есть документация по каждой из капабилити. Например, мы требуем трейсинг, а это значит, что они берут готовый инструмент с нашими настройками, а не мастырят чтото своё на коленке "я просто пишу в сокет". Ровно так же с любой капабилити.
Ну трейсинг. И что дальше-то? Крутится где-то там у них ваш навязанный мониторинг, и всем пофиг что там всё красным моргает, никто туда не смотрит, ибо свои дела есть. "устал, много варнингов, (не)загляну в понедельник".
P>>>Добавить правило в мониторинг это дело секунд. P>·>А толку? Правило в мониторинге полезно только тогда, когда оно работает, работает правильно и сообщает нужным людям нужную информацию. Этот аспект ты полностью умалчиваешь. P>Мониторинг уже протестировали. Остается кейс конкретного сервиса.
А кейс — по сути это конкретный сценарий, который надо задокументировать, имплементировать, протестировать и мейнтейнить. В чём автоматизация — неясно.
P>>>Варнинги появляются как обычно, это разновидность логирования, только рендерится и в респонс. P>·>В чём преимущество рендерить в респонс-то? Рендери как обычно, в логи. Логи можно раздавать всем желающим, если хочется. P>Можно. Если ты точно знаешь, что у конечного сервиса есть все данные, что бы идентифицировать проблему, то можно и так. А если сервис не может этого сделать, надо бы делегировать обязанности тому, кто может, например, api gateway тот же.
Неясно каким волшебным образом, как ты обещаешь автоматически, это появится благодаря хедерам.
P>·>Да ради бога. Для этого и придумали логи. Зачем в респонз-то? P>Тебе ж уже сказали — http://rsdn.org/forum/design/8377498.1
Я не очень понял из этого ответа, почему это должно быть именно поле в респонзе, а не строчка в логе. Поясни. Я не очень понял что за системы у него упомянутые, но могу представить что в таких окружениях будет какая-нибудь kibana куда собираются все логи и настраиваются дашборды-алерты.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[47]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>При том, что трафик после такого гатевея уже внутренний
НС>Да. Я тебе больше скажу — у меня там целая пачка кастомных хидеров бегает. Но вот варнинги там точно не нужны.
А разве я говорю что надо всенепременно именно варнинг добавить? Если ты научился протаскивать капабилити с одним кастомным хидером, то какие проблемы будут с другой капабилити ?
P>>2. И вот ты прочел changelog, проверил все что мог, тебя тесты зелёные. Твои действия? Что конкретно ты будешь предпринимать P>> в такой вот ситуации? Есть хороший пример, что бы не абстрактно рассуждать? ты то не надеешься на варнинги, как с проблемой будешь работать?
НС>Вопрос непонятен. О какой проблеме речь?
Вот так обычно и отвечают, когда указываешь, что changelog какая то хрень.
P>> А вот как автоматизировать обработку changelog депенденсов 2го уровня — не ясно.
НС>Еще раз — 2 уровень заголовки тоже не отслеживают (если конечно ты не будешь эти заголовки пропогейтить по всей цепочке, что совсем уж дичь если сопоставить с исходной задачей).
Зачем пропагейтить? Делегируешь процессинг другому компоненту, он от себя будет кидать, что бы ничего не пропагейтить.
НС>Ты выкинь из головы все технические подробности и посмотри на проблему сверху. У тебя уже ровно в момент прихода реквеста непосредственно в сервис уже все известно и понятно.
Теоретически. Когда ты всё контролируешь, и ничего никому не делегируешь, то можно и заранее дать ответ. Но таких случаев не так уж и много. Варнинг можно интерпретировать мониторингом как на этой стороне, так и на той. И это может быть дешевле чем мастырить архитектуру поверх всего.
P>>>>Далее, при деплое зависимости 2го уровня могут малёха поменяться, так, по мелочи. Кто будет курить changelog n*m таких зависимостей? НС>>>Заголовки тут не спасут. P>>Это смотря как ты ими пользоваться будешь.
НС>Расскажи как.
Я уже рассказал и тебе, и точке.
Re[49]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>В том то и дело, что тесты её не показывают. Её можно увидеть только в рантайме, если есть. Ровно то же, что и трейсинг/логирование, только идет в обратную сторону. ·>"Не увидел" в том смысле, что ты не обозначил какую задачу мы решаем.
Ага, ты не увидел, следовательно, это другие не поднесли тебе на блюдечке под нос Тут похоже твои "особенности" чтения.
·>Ну трейсинг. И что дальше-то? Крутится где-то там у них ваш навязанный мониторинг, и всем пофиг что там всё красным моргает, никто туда не смотрит, ибо свои дела есть. "устал, много варнингов, (не)загляну в понедельник".
Если люди могут игнорировать даже мониторинг, то changelog, емейлы, логи будут игнорировать с еще большей вероятностью.
P>>Мониторинг уже протестировали. Остается кейс конкретного сервиса. ·>А кейс — по сути это конкретный сценарий, который надо задокументировать, имплементировать, протестировать и мейнтейнить. В чём автоматизация — неясно.
В случае с changlog ты вообще всю работу делаешь руками. А в данном случае ты просто добавил правило в мониторинг и всё.
P>>Можно. Если ты точно знаешь, что у конечного сервиса есть все данные, что бы идентифицировать проблему, то можно и так. А если сервис не может этого сделать, надо бы делегировать обязанности тому, кто может, например, api gateway тот же. ·>Неясно каким волшебным образом, как ты обещаешь автоматически, это появится благодаря хедерам.
Здравствуйте, Pauel, Вы писали:
P>>>В том то и дело, что тесты её не показывают. Её можно увидеть только в рантайме, если есть. Ровно то же, что и трейсинг/логирование, только идет в обратную сторону. P>·>"Не увидел" в том смысле, что ты не обозначил какую задачу мы решаем. P>Ага, ты не увидел, следовательно, это другие не поднесли тебе на блюдечке под нос Тут похоже твои "особенности" чтения.
Телепатией не обладаю.
P>·>Ну трейсинг. И что дальше-то? Крутится где-то там у них ваш навязанный мониторинг, и всем пофиг что там всё красным моргает, никто туда не смотрит, ибо свои дела есть. "устал, много варнингов, (не)загляну в понедельник". P>Если люди могут игнорировать даже мониторинг, то changelog, емейлы, логи будут игнорировать с еще большей вероятностью.
Ага. Ты стал приходить к пониманию, что это проблема административная. Важна реакция людей, а не хедеры.
Теперь последний шаг. В чём будет выражаться неигнорирование мониторинга? Ну допустим заметил какой-нибудь сисоп какой-то варнинг на дашбоарде. Дальше-то что?
P>>>Мониторинг уже протестировали. Остается кейс конкретного сервиса. P>·>А кейс — по сути это конкретный сценарий, который надо задокументировать, имплементировать, протестировать и мейнтейнить. В чём автоматизация — неясно. P>В случае с changlog ты вообще всю работу делаешь руками. А в данном случае ты просто добавил правило в мониторинг и всё.
Какую "всю"? Для справки, сhangelog — это лог сделанных изменений.
P>>>Можно. Если ты точно знаешь, что у конечного сервиса есть все данные, что бы идентифицировать проблему, то можно и так. А если сервис не может этого сделать, надо бы делегировать обязанности тому, кто может, например, api gateway тот же. P>·>Неясно каким волшебным образом, как ты обещаешь автоматически, это появится благодаря хедерам. P>Ты или забыл, что такое мониторинг, или забыл, про что речь.
Речь про хедеры. Мониторинг это лишь твой риторический приём перевести обсуждение на другую тему. Ты рассказываешь про мониторинг, но никак не можешь объяснить, почему нужно мониторить именно хедеры, а не логи, например.
P>>>Тебе ж уже сказали — http://rsdn.org/forum/design/8377498.1
Сказали, кстати, не мне.
P>·>Я не очень понял из этого ответа P>Так возьми там же и уточни, это разве трудно?
Ок, maxkar, прошу уточнить. А то Pauel и сам не знает, просто как cargo cult повторяет.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[51]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Ага. Ты стал приходить к пониманию, что это проблема административная. Важна реакция людей, а не хедеры.
Да ты я вижу Шерлок Холмс — вывел меня на чистую воду. Особенно с учетом того, что было явно обозначено, что проблема — админстративная.
·>Теперь последний шаг. В чём будет выражаться неигнорирование мониторинга? Ну допустим заметил какой-нибудь сисоп какой-то варнинг на дашбоарде. Дальше-то что?
Ты не в курсе как работает мониторинг и опсы?
P>>В случае с changlog ты вообще всю работу делаешь руками. А в данном случае ты просто добавил правило в мониторинг и всё. ·>Какую "всю"? Для справки, сhangelog — это лог сделанных изменений.
Именно.
1. надо прочитать, вникнуть в каждый тикет, посмотреть тамошние подробности
2. каждую строку проверить на предмет того, а не цепляет ли это вас
Повторить для всех n*m зависимостей
Прогнать тесты
Если они красные пофиксить
А если зеленые — а хер его знает. Тут мы выяснили, что ты плохо понимаешь, что такое 2^100 комбинаций, простейший случай
Как и несколько месяцев назад, ты как то не в курсе, что те же ассерты и тесты покрывают немного разные классы задач. Одни дискретные, другие — непрерывные. Для тебя, похоже, это пустой звук.
assert(deprecated) сработает вне зависимости от того, сколько у нас данных, 2^10 или 2^10^10.
P>>·>Неясно каким волшебным образом, как ты обещаешь автоматически, это появится благодаря хедерам. P>>Ты или забыл, что такое мониторинг, или забыл, про что речь. ·>Речь про хедеры. Мониторинг это лишь твой риторический приём перевести обсуждение на другую тему. Ты рассказываешь про мониторинг, но никак не можешь объяснить, почему нужно мониторить именно хедеры, а не логи, например.
А где я написал, что не надо мониторить логи? Нам надо сообщить вызывающей стороне. У них нет доступа к твоим логами. Жесткий вариант — кидануть ошибку. Мягкий вариант — ворнинг. Его можно послать разными способами — городить архитектуру вида "мой человек свяжется с твоим человеком" или воспользоваться возможностями транспорта. Это возможно, если вызывающая сторона пользуется твоим клиентом. Тогда в ихних логах, и ихнем мониторинге тоже появятся нужные строчки.
То есть, в этом случае у нас хидер x-варнинг есть часть АПИ
Здравствуйте, Ночной Смотрящий, Вы писали:
M>>Можно ждать, пока огранизация станет идеальной (не станет).
НС>Не надо ждать идеала. Надо решить конкретную проблему административным способом — это быстрее, дешевле и не создает оверхеда в работающей системе.
Ога. У девелопера полномочий нет решать такие проблемы. Все что он может — написать кому то письмо. А дальше придет ответ "придумай решение сейчас, а налаживать коммуникацю наймем специалиста"
Вот так и появляется хидер x-варанинг
Re[52]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>·>Ага. Ты стал приходить к пониманию, что это проблема административная. Важна реакция людей, а не хедеры. P>Да ты я вижу Шерлок Холмс — вывел меня на чистую воду. Особенно с учетом того, что было явно обозначено, что проблема — админстративная.
Так и решать её надо административно. Хедер не может административную проблему решить.
P>·>Теперь последний шаг. В чём будет выражаться неигнорирование мониторинга? Ну допустим заметил какой-нибудь сисоп какой-то варнинг на дашбоарде. Дальше-то что? P>Ты не в курсе как работает мониторинг и опсы?
В курсе. Теперь ты на мой вопрос ответь.
P>>>В случае с changlog ты вообще всю работу делаешь руками. А в данном случае ты просто добавил правило в мониторинг и всё. P>·>Какую "всю"? Для справки, сhangelog — это лог сделанных изменений. P>Именно. P>1. надо прочитать, вникнуть в каждый тикет, посмотреть тамошние подробности P>2. каждую строку проверить на предмет того, а не цепляет ли это вас P>Повторить для всех n*m зависимостей P>Прогнать тесты P>Если они красные пофиксить P>А если зеленые — а хер его знает. Тут мы выяснили, что ты плохо понимаешь, что такое 2^100 комбинаций, простейший случай
У тебя нет 2^100 комбинаций. В рассматриваемом случае у тебя есть ровно одна, ты же сам её написал. Вот она: Warning.assert(precondontion, 'unexpected input').
Если до тебя допёрло что можно написать именно этот Warning, значит ты с таким же успехом можешь создать джиру/послать емейл и добиться проверки|тестироваия|исправления этого данного precondontion. Заметать это под коврик хедеров, это лишь оттягивать удовольствие и вводить кучу никому не нужных слоёв, рискуя прод-инцидентами.
P>Как и несколько месяцев назад, ты как то не в курсе, что те же ассерты и тесты покрывают немного разные классы задач. Одни дискретные, другие — непрерывные. Для тебя, похоже, это пустой звук.
Провал ассерта это проблема твоя, а не твоих консьюмеров. Тебя она и должна беспокоить. Зачем это слать кому-то в хедерах — расскажи.
P>assert(deprecated) сработает вне зависимости от того, сколько у нас данных, 2^10 или 2^10^10.
Верно. Но если этот assert бабахнет, это твоя проблема, ты и обязан фиксить. Поэтому это должно быть в твоих логах. С какого боку тут хедеры?
P>>>·>Неясно каким волшебным образом, как ты обещаешь автоматически, это появится благодаря хедерам. P>>>Ты или забыл, что такое мониторинг, или забыл, про что речь. P>·>Речь про хедеры. Мониторинг это лишь твой риторический приём перевести обсуждение на другую тему. Ты рассказываешь про мониторинг, но никак не можешь объяснить, почему нужно мониторить именно хедеры, а не логи, например.
P>А где я написал, что не надо мониторить логи?
Ты невнимательно читаешь вопрос. Я спрашиваю, почему именно хедеры надо? (а логи лишь _например_).
P> Нам надо сообщить вызывающей стороне.
Хедер — не единственный способ сообщить что-то кому-то. Объясни в чём уникальность хедера, что другие способы не могут работать?
P> У них нет доступа к твоим логами.
Дай доступ. Настрой свой мониторинг и шли кому надо какие-нибудь сообщения в каком-либо виде — емейл, чаты, смски, джиры, етс, но не в хедерах каждого респонза. Терабайты съэкономишь.
P>Жесткий вариант — кидануть ошибку.
Правильный вариант в SIT-окружении, как минимум.
P>Мягкий вариант — ворнинг. Его можно послать разными способами — городить архитектуру вида "мой человек свяжется с твоим человеком" или воспользоваться возможностями транспорта. Это возможно, если вызывающая сторона пользуется твоим клиентом. P>Тогда в ихних логах, и ихнем мониторинге тоже появятся нужные строчки.
Сами — не появятся. Даже если появятся, всё равно самое важное, чтобы на них кто-то обратил внимание и принял соответствующие действия. Хедер ничего этого не даёт, с таким же успехом можно посылать лучи ненависти (лучи даже лучше, трафик не отожрут).
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[46]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Ога. У девелопера полномочий нет решать такие проблемы.
Девелопер — понятие растяжимое. Если ты имел в виду программера — так он и не должен эти проблемы решать.
P> Все что он может — написать кому то письмо. А дальше придет ответ "придумай решение сейчас, а налаживать коммуникацю наймем специалиста"
Или не придет.
P>Вот так и появляется хидер x-варанинг
Да заради бога, каждый кузнец своего счастья. Но советовать такое другим ...
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[48]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>А разве я говорю что надо всенепременно именно варнинг добавить?
В топике зашла речь именно про него.
P> Если ты научился протаскивать капабилити с одним кастомным хидером
Пошли по кругу.
НС>>Еще раз — 2 уровень заголовки тоже не отслеживают (если конечно ты не будешь эти заголовки пропогейтить по всей цепочке, что совсем уж дичь если сопоставить с исходной задачей). P>Зачем пропагейтить? Делегируешь процессинг другому компоненту, он от себя будет кидать, что бы ничего не пропагейтить.
Ничего не понял.
НС>>Ты выкинь из головы все технические подробности и посмотри на проблему сверху. У тебя уже ровно в момент прихода реквеста непосредственно в сервис уже все известно и понятно. P>Теоретически.
И практически тоже.
P>Когда ты всё контролируешь,
Не надо контролировать все, надо контролировать свой собственный сервис и свои собственные логи, даши и алерты.
P>Варнинг можно интерпретировать мониторингом как на этой стороне, так и на той.
Можно не означает нужно.
P> И это может быть дешевле чем мастырить архитектуру поверх всего.
Не знаю при чем тут архитектура поверх всего и что ты под ней понимаешь. Но больше на эту роль подходят кастомные хидеры.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[49]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>В топике зашла речь именно про него.
Это просто пример кастомного хидера. Такие хидеры ни разу не рокетсаенс, и поддерживаются тем же ResponseHeaders в OpenApi
P>>Зачем пропагейтить? Делегируешь процессинг другому компоненту, он от себя будет кидать, что бы ничего не пропагейтить.
НС>Ничего не понял.
Ты не в курсе, что такое делегирование и весь код у тебя в контроллерах? Чужой компонент может обрабатывать реквесты от твоего имени, все, что тебе надо — дать конфиг.
P>>Теоретически.
НС>И практически тоже.
Практически может оказаться так, что только сам сервис может решить в самом конце процессинга, что нужен ворнинг. Или ты собираешься всю бизнеслогику продублировать в мониторинге, лоадбалансере или ажно в файрволе?
P>>Когда ты всё контролируешь,
НС>Не надо контролировать все, надо контролировать свой собственный сервис и свои собственные логи, даши и алерты.
Про делегирование ты не в курсе. Как же ты чужой компонент контролируешь, ы?
P>>Варнинг можно интерпретировать мониторингом как на этой стороне, так и на той.
НС>Можно не означает нужно.
Если это часть апи, то нужно ожидать, что мониторинг на той стороне справится самостоятельно.
P>> И это может быть дешевле чем мастырить архитектуру поверх всего.
НС>Не знаю при чем тут архитектура поверх всего и что ты под ней понимаешь. Но больше на эту роль подходят кастомные хидеры.
Ты сам привел пример, забыл?
Re[47]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>Ога. У девелопера полномочий нет решать такие проблемы.
НС>Девелопер — понятие растяжимое. Если ты имел в виду программера — так он и не должен эти проблемы решать.
Именно. Потому ждать решения административных проблем на стороне разработчика смысла мало. Так и вижу "ребята, закончу фичу через пять лет, когда топ-менеджмент решит вон те вопросы"
P>> Все что он может — написать кому то письмо. А дальше придет ответ "придумай решение сейчас, а налаживать коммуникацю наймем специалиста"
НС>Или не придет.
Именно. В том то и проблема — большой менеджмент не обязан перед тобой отчитываться.
P>>Вот так и появляется хидер x-варанинг
НС>Да заради бога, каждый кузнец своего счастья. Но советовать такое другим ...
А кто тебе это советует? Это был пример, а не совет. Товарищи в апи протащили не только ошибки, но и варнинги.
Хорошая вещь — например тротлинг сопровождаешь ворнингом. Когда L2 суппорт на той стороне будет искать причину просадки, обязательно заглянет в хидеры
Re[53]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Так и решать её надо административно. Хедер не может административную проблему решить.
Предлагаешь взять до кучи роль топ-менеджера и потратить пять лет на выстраивание процесса коммуникации с консумерами что бы закончить фичу?
P>>·>Теперь последний шаг. В чём будет выражаться неигнорирование мониторинга? Ну допустим заметил какой-нибудь сисоп какой-то варнинг на дашбоарде. Дальше-то что? P>>Ты не в курсе как работает мониторинг и опсы? ·>В курсе. Теперь ты на мой вопрос ответь.
Дальше в соответствии с инструкциями. Например, наши L2 после мониторинга обязаны локализовать проблему, связаться с разработчиками-менеджерами и предпринять кое какие шаги, если есть такая возможность, что бы купировать проблему.
P>>>>В случае с changlog ты вообще всю работу делаешь руками. А в данном случае ты просто добавил правило в мониторинг и всё. P>>·>Какую "всю"? Для справки, сhangelog — это лог сделанных изменений. P>>Именно. P>>1. надо прочитать, вникнуть в каждый тикет, посмотреть тамошние подробности P>>2. каждую строку проверить на предмет того, а не цепляет ли это вас P>>Повторить для всех n*m зависимостей P>>Прогнать тесты P>>Если они красные пофиксить P>>А если зеленые — а хер его знает. Тут мы выяснили, что ты плохо понимаешь, что такое 2^100 комбинаций, простейший случай ·>У тебя нет 2^100 комбинаций.
Есть. Типичный реквест содержит куда больше информации.
>В рассматриваемом случае у тебя есть ровно одна, ты же сам её написал. Вот она: Warning.assert(precondontion, 'unexpected input'). ·>Если до тебя допёрло что можно написать именно этот Warning, значит ты с таким же успехом можешь создать джиру/послать емейл и добиться проверки|тестироваия|исправления этого данного precondontion.
Мы снова говорим о том, что ты не понимаешь роль ассертов. Ассерт используется там, где джира-емейл-тестирование неприменимо. Это механизм того же рода, что и логи.
> Заметать это под коврик хедеров, это лишь оттягивать удовольствие и вводить кучу никому не нужных слоёв, рискуя прод-инцидентами.
Вот-вот. Ассерты это те же логи, только, только условные. Логи знаешь, а ассерты — нет?
P>>Как и несколько месяцев назад, ты как то не в курсе, что те же ассерты и тесты покрывают немного разные классы задач. Одни дискретные, другие — непрерывные. Для тебя, похоже, это пустой звук. ·>Провал ассерта это проблема твоя, а не твоих консьюмеров. Тебя она и должна беспокоить. Зачем это слать кому-то в хедерах — расскажи.
P>>assert(deprecated) сработает вне зависимости от того, сколько у нас данных, 2^10 или 2^10^10. ·>Верно. Но если этот assert бабахнет, это твоя проблема, ты и обязан фиксить. Поэтому это должно быть в твоих логах. С какого боку тут хедеры?
И снова ты пишешь о том, что не в курсе проблемы которую решают ассерты.
Какой смысл продолжать?
P>>А где я написал, что не надо мониторить логи? ·>Ты невнимательно читаешь вопрос. Я спрашиваю, почему именно хедеры надо? (а логи лишь _например_).
Мы рассматриваем конкретную фичу апи. Кроме того, l2 суппорт смотрит не только хидеры, а много чего еще.
·>Хедер — не единственный способ сообщить что-то кому-то. Объясни в чём уникальность хедера, что другие способы не могут работать?
Тебе все рассказали. Это самый простой способ тригерить сообщения в мониторинг на той стороне.
P>> У них нет доступа к твоим логами. ·>Дай доступ.
у вас там что, секюрити не изобрели? В логах чудовищное количество сенситив инфрмации. Если даешь доступ сотне-тысяче консумеров, это все равно что приговор себе подписать.
>Настрой свой мониторинг и шли кому надо какие-нибудь сообщения в каком-либо виде — емейл, чаты, смски, джиры, етс, но не в хедерах каждого респонза. Терабайты съэкономишь.
Тебе уже сказали, что все это уже есть. Снова нечитатель?
Re[51]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Ок, maxkar, прошу уточнить. А то Pauel и сам не знает, просто как cargo cult повторяет.
Да без проблем. Только я прекрасно вижу, что Pauel знает и понимает, что и зачем я предлагаю. Давайте в лицах. Pauel сделал API и предусмотрел в нем заголовок для предупреждений. Я в процессе чтения документации увидел этого заголовок и решил, что да — в целом идея хорошая. Добавил метрику. Добавление метрики — это дешево. У меня в любом случае будут метрики вокруг вызова внешних сервисов (время ответа, процент ошибок, распределение кодов ответа), еще один параметр проблемой не будет. И добавлю один график Warnings across team на dashboard команды (аггрегированый по всем сервисам). В один прекрасный день я получаю письмо от Pauel. Там написано что-то вроде "Мы сделали замечательный API /api/v22 и решили прекращаем поддержку существующего /api/v21 через 3 месяца. Соответствующее предупреждение W092 будет вовзрващаться при всех вызовах API /api/v21 со следующего понедельника.". Я на это письмо посмотрю и сборошу в "для информации". Ключевой момнет для меня там — я все равно увижу это в мониторинге. Я далеко не всегда хочу идти в Jira и сразу заводить тикет. Например, я жду ответа от внешнего поставщика услуг по актуальному вопросу. И не хочу тратить лишнее время на то, что не относится к текущей проблеме. А еще для одного из моих сервисов в Jira уже есть тикет на миграцию с deprecated API(s). И вот для этого сервиса можно было бы обновить сразу два API. Но для этого мне надо знать, что есть зависимость. А у меня голова на данный момент забита другими проблемами. Если что, на дашборд я не забуду посмотреть. Я туда хожу регулярно. Там можно много интересного увидеть. Например, что у нас регулярно нагрузка на сервис достигает 85% от того, что мы гоняли на тестах быстродействия. Стоило бы перетестировать под большую нагрузку. У одного из провайдеров ночью вырастает время ответа уже третью неделю. Надо-бы спросить их, что происхоидт. И появился новый warning. Этим warning мы займемся через неделю, у нас тогда запланированы "внутренние" технические работы (которые не business value). Более того, dashboard — одна из первых вещей, которые я смотрю после выхода из отпуска. Еще до того, как начинаю разбирать тысячу писем, скопившихся за месяц (тысяча — не преувеличение).
Вопрос не в том, что это можно решить административно. Вопрос в том, как это решить удобно. Причем удобно для широкого класса разработчиков. Кто-то будет реагировать на письмо. Другие — на предупреждения. У меня нет цели сделать все единообразно. Пусть каждый выбирает то, что лучше всего работает для его команды. Для меня jira — это так, хотелки. Их можно деприоритизировать. А вот метрики — это объективная реальность и показатель здоровья системы. Плюс подобные метрики асинхронны — система не требует "незамедлительного" внимания, переключения контекста и т.п.
Для контекста. Я предпочитаю культуру с высокой автономией команд. Команды имеют "общую" высокоуровневую цель, но при этом могут выбирать средства достижения с учетом своей предметной области и других факторов. На уровне компании мы хотим быстро развиваться и экспериментировать. Команды у нас взрослые. Они ответственно подходят к работоспособности своей системы. В результате этих факторов, у нас получается сложнее применять глобальные решения. Они неизбежно будут кому-то неудобны. Так что курс идет на автономию. И отсюда же дополнительные "механизмы безопасности" на случай человеческого фактора. На дороге в светлое будущее у нас безопасно не потому, что очень детальные правила дорожного движения. А потому, что с текущими средствами безопасности можно ехать быстро и не бояться разбиться.
Ну и исходная задача (я ее уже в общих чертах приводил). Есть сервис A. Он предоставляет /servicea/api/v1. В один прекрасный день команда реализует новый API /service/api/v2 и решает удалить /servicea/api/v1 через три месяца. Кроме того, у нас есть два других сервиса (разрабатываемых другими командами). Сервис Б последний раз деплоился полгода назад и с тех пор не менялся. Сервис В деплоится сейчас два раза в неделю. К сожалению, его команда на ближайший месяц занята своими задачами — удовлетрворяют новые требования законодательства. Так что в течение следующего месяца они так и продолжат использовать /servicea/api/v1. Задача — сделать такие механизмы, чтобы обе команды (Б и В) не забыли перейти на /servicea/api/v2 вовремя. Задача со звездочкой — сделать так, чтобы механизм был удобен и воспринимался естественно в рамках целей компании а не как очередной навязанный процесс. Вот вы что-то про тесты писали. Я совсем не понимаю, как они приблизят нас к решению задачи. Когда/почему будут выполняться тесты для сервиса Б? Как будет выглядеть использование deprecated api в процессе тестирования? Что должна делать команда В, которая осознанно использует deprecated API в течение некоторого времени?
Re[53]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Дай доступ. ... Терабайты съэкономишь.
Ой! Какой ужас, терабайты! Давайте посчитаем, сколько они стоят. Например, aws ec2 transfer. Самый дорогой — это первые 10Тб, отправленные в интернет. Стоит это 0.09 USD/GB. Т.е. 90 USD/TB. Это где-то 1.5-2 человекочаса. Если вдруг терабайт заголовков позволяет сэкономить 2 часа (суммарно) на координации, переключениях контекста и прочем обслуживании, мы остаемся в плюсе! Данный доступ — это плохое решение. Вместо того, чтобы иметь одну систему мониторинга (для своих сервисов) команда теперь будет вынуждена ходить в несколько различных — свою и каждой зависимости. На ровном месте мы чуть-чуть экономим на заголовках и создаем проблемы администрирования и координации!
Кроме того. Есть еще один замечательный момент. Заголовок с содержимым выглядит примерно так: "X-API-Warnings: W084,W092,W103". Округляя, 100 байт. В килобайте — 10 заголовков. В терабайте 10^10. (мега, гига, тера — 3*3 порядка). Допустим, команда все три месяца ничего не делала и перешла на новый API в последний момент. Т.е. 10^10 ответов было отправлено за 3 месяца. Это дает 10^10 / 3 / 30 / 24 / 60 / 60 = 1286 сообщений в секунду. Что-то мне кажется не очень выгодным тратить время команды, поддерживающей такую нагрузку, на административные задачи и координацию. Я думаю, разработчики будут гораздо более полезны на технических задачах и задачах бизнеса.
Что еще. Если у нас терабайты дополнительных заголовков, то логи не работают. Потому что логов тоже терабайты. Ну ладно, по сети они передаются сжатыми. Но обработка и хранение? Я пока не встречал ни одного предложения по обработке логов, где 1ТБ стоил бы всего 90 USD. Так что остаются только метрики. Для этого нам нужно идентифицировать клиентов. Здравствуйте, заголовки. И я уже упоминал сценарий, где несколько deployment unit являются частью одного сервиса и используют одни и те же credentials. Коллега тут предложил использовать "User-Agent". Ну т.е. заголовок. В каждом запросе (API Warnings ходят только там, где есть предупреждения). И по размеру обычно гораздо больше, чем те же коды предупреждений. И кто из нас экономит траффик?
Ну и потом, гоняться по разным Jira и системам за командами — то еще удовольствие. Ведь нужно не только поставить тикет. Нужно, чтобы его заметили нужные люди (я себе настраиваю так, чтобы digest новых тикетов отправлялся на почту каждый день, но далеко не все так делают). Нужно, чтобы не забыли. Особенно если сейчас они заняты другим. А вот постоянно горящая лампочка check engine api usage — хорошая напоминалка. И если команда пользователей делает лампочку сама, с большой вероятностью она окажется на приборной панели (на виду) а не где-нибудь под капотом (там, куда никто из команды не заходит).
Re[54]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>·>Так и решать её надо административно. Хедер не может административную проблему решить. P>Предлагаешь взять до кучи роль топ-менеджера и потратить пять лет на выстраивание процесса коммуникации с консумерами что бы закончить фичу?
Без хедера фича не работает?
P>>>·>Теперь последний шаг. В чём будет выражаться неигнорирование мониторинга? Ну допустим заметил какой-нибудь сисоп какой-то варнинг на дашбоарде. Дальше-то что? P>>>Ты не в курсе как работает мониторинг и опсы? P>·>В курсе. Теперь ты на мой вопрос ответь. P>Дальше в соответствии с инструкциями. Например, наши L2 после мониторинга обязаны локализовать проблему, связаться с разработчиками-менеджерами и предпринять кое какие шаги, если есть такая возможность, что бы купировать проблему.
Итак. Получается такая цепочка:
0. Ты обнаружил precondontion.
1. Код ворнинга
2. QA
3. Хедер
4. Система логгирования
5. Мониторинг
6. L2 замечает проблему
7. L2 расследует
8. разработчик-менеджер.
Вот теперь объясни зачем нужны шаги 1-7? Это затраты ресурсов и человеческих, и машинных, и на каждом шаге можно сломаться-потеряться и вся цепочка рухнет. Почему бы сразу не перейти к 8му шагу?
P>·>У тебя нет 2^100 комбинаций. P>Есть. Типичный реквест содержит куда больше информации.
И что? Мы говорим о конкретном warning, который появится в хедере. Который проверяет вполне конкретную информацию по конкретному алгоритму. Т.е. ровно одна комбинация.
>>В рассматриваемом случае у тебя есть ровно одна, ты же сам её написал. Вот она: Warning.assert(precondontion, 'unexpected input'). P>·>Если до тебя допёрло что можно написать именно этот Warning, значит ты с таким же успехом можешь создать джиру/послать емейл и добиться проверки|тестироваия|исправления этого данного precondontion. P>Мы снова говорим о том, что ты не понимаешь роль ассертов. Ассерт используется там, где джира-емейл-тестирование неприменимо. Это механизм того же рода, что и логи.
Я о роли ассертов и тестов не рассуждал и вообще ничего не говорил. В данном контексте это неважно.
>> Заметать это под коврик хедеров, это лишь оттягивать удовольствие и вводить кучу никому не нужных слоёв, рискуя прод-инцидентами. P>Вот-вот. Ассерты это те же логи, только, только условные. Логи знаешь, а ассерты — нет?
И причём тут хедер?
P>>>Как и несколько месяцев назад, ты как то не в курсе, что те же ассерты и тесты покрывают немного разные классы задач. Одни дискретные, другие — непрерывные. Для тебя, похоже, это пустой звук. P>·>Провал ассерта это проблема твоя, а не твоих консьюмеров. Тебя она и должна беспокоить. Зачем это слать кому-то в хедерах — расскажи. P>>>assert(deprecated) сработает вне зависимости от того, сколько у нас данных, 2^10 или 2^10^10. P>·>Верно. Но если этот assert бабахнет, это твоя проблема, ты и обязан фиксить. Поэтому это должно быть в твоих логах. С какого боку тут хедеры? P>И снова ты пишешь о том, что не в курсе проблемы которую решают ассерты.
Мне пофиг какие проблемы решают ассерты. Это к разговору не относится. Я пытаюсь из тебя вытянуть какие проблемы решает хедер.
P>Какой смысл продолжать?
Продолжать уводить разговор в сторону — никакого смысла, ясен пень, нет. Так что не продолжай, конечно.
P>>>А где я написал, что не надо мониторить логи? P>·>Ты невнимательно читаешь вопрос. Я спрашиваю, почему именно хедеры надо? (а логи лишь _например_). P>Мы рассматриваем конкретную фичу апи. Кроме того, l2 суппорт смотрит не только хидеры, а много чего еще.
Так почему именно хедер с ворнингом надо? Чем другие механизмы не устраивают-то?
P>·>Хедер — не единственный способ сообщить что-то кому-то. Объясни в чём уникальность хедера, что другие способы не могут работать? P>Тебе все рассказали. Это самый простой способ тригерить сообщения в мониторинг на той стороне.
Зачем триггерить мониторинг на той стороне?
P>>> У них нет доступа к твоим логами. P>·>Дай доступ. P> у вас там что, секюрити не изобрели? В логах чудовищное количество сенситив инфрмации. Если даешь доступ сотне-тысяче консумеров, это все равно что приговор себе подписать.
1. В логах не должно быть сенситив информации. По крайней мере не во всех. На крайний случай заведи лог специально для варнингов и расшарь.
2. Мы вроде о внутренних консьюмерах говорили. Иначе твои аргументы про мониторинг на той стороне идут лесом, т.к. сотню-тысячу консьюмеров ты банально не сможешь уговорить пользваться какими-то непонятными хедерами и мониторингами.
>>Настрой свой мониторинг и шли кому надо какие-нибудь сообщения в каком-либо виде — емейл, чаты, смски, джиры, етс, но не в хедерах каждого респонза. Терабайты съэкономишь. P>Тебе уже сказали, что все это уже есть. Снова нечитатель?
В том-то и дело, что много чего уже есть. Так зачем нужен ещё и хедер?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
S>Какие минусы в этом?
Вообще говоря, мне не нравится вообще слово idempotency_key. ИМХО более общее будет request_uuid — я обычно так делаю.
Я бы API сделал примерно так:
PUT /v1/orders&request_uuid=86706b8-ed80-443a-80f6-ea1fa8cc1b51
{
"from": "Москва, ул. Садовническая набережная 82с2",
"to": "Аэропорт Внуково"
}
И в результате бы возвращал на клиент id (возможно uuid) с которым существующая запись вставилась, возможно с еще какой вспомогательной информацией. Например может
Или действительно возможно генерил бы id.
Вообще, при проектировании API основными критериями я считаю краткость, удобство и универсальность. Нужно заботиться о клиенте чтоб ему твоим API было пользоваться максимально комфортно. Параметр request_uuid близок к необходимому, ибо обеспечение идемпотентности в современных условиях практически необходимо, альтернативные решения все хуже (альтернативными решениями было бы либо забить на идемпотентность),либо городить какой либо кабздец вида API с методами bеgin_transaction commit_transaction rollback_transaction, либо еще какой лисапед кривой придумывать, request_uuid же это решение по умолчанию для мутаций о котором я давно уже даже не задумываюсь.
К спорным моментом можно отнести генерить ли ключи на клиенте. Конечно можно переложить это на клиент, но при этом следует понимать, что далеко не факт что клиенту этот сгенерированный uuid реально как то нужен. И чтоб разгрузить клиент от излишней логики, как раз имеет смысл это не делать, а вернуть уже uuid списком или через SSE. Не хочет клиент уведомления получать — пусть не получает, пусть только коды возврата проверяет, а общий список получает через GET /orders.
А так, клиенту один хрен с большой долей вероятностью захочется подписываться на SSE которые генерят другие пользователи, соответственно у него будут обязательства отображать новые сущность с новыми uuid — так нахрена клиента еще нагружать генерацией? Пусть пишет как меньше кода, самый минимум который возможен, и будет всем счастье!
Re[52]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>·>Ок, maxkar, прошу уточнить. А то Pauel и сам не знает, просто как cargo cult повторяет. M>Да без проблем. Только я прекрасно вижу, что Pauel знает и понимает, что и зачем я предлагаю. Давайте в лицах. Pauel сделал API и предусмотрел в нем заголовок для предупреждений. Я в процессе чтения документации увидел этого заголовок и решил, что да — в целом идея хорошая. Добавил метрику. Добавление метрики — это дешево. У меня в любом случае будут метрики вокруг вызова внешних сервисов (время ответа, процент ошибок, распределение кодов ответа), еще один параметр проблемой не будет. И добавлю один график Warnings across team на dashboard команды (аггрегированый по всем сервисам). В один прекрасный день я получаю письмо от Pauel. Там написано что-то вроде "Мы сделали замечательный API /api/v22 и решили прекращаем поддержку существующего /api/v21 через 3 месяца. Соответствующее предупреждение W092 будет вовзрващаться при всех вызовах API /api/v21 со следующего понедельника.". Я на это письмо посмотрю и сборошу в "для информации". Ключевой момнет для меня там — я все равно увижу это в мониторинге. Я далеко не всегда хочу идти в Jira и сразу заводить тикет.
Офигеть. Добавить тикет в джире это примерно 10 сек времени. И там же можно прописать due date чтобы в планировщик работ попало куда надо.
M>Например, я жду ответа от внешнего поставщика услуг по актуальному вопросу.
Э, и? Как это мешает завести джиру?!
M>И не хочу тратить лишнее время на то, что не относится к текущей проблеме. А еще для одного из моих сервисов в Jira уже есть тикет на миграцию с deprecated API(s).
Добавь sub-task туда или тупо коммент (если, конечно, due date совпадают).
M> И вот для этого сервиса можно было бы обновить сразу два API. Но для этого мне надо знать, что есть зависимость. А у меня голова на данный момент забита другими проблемами.
Ну потом проанализируешь джиру и пропишешь связи между тасками.
M>Если что, на дашборд я не забуду посмотреть. Я туда хожу регулярно. Там можно много интересного увидеть. Например, что у нас регулярно нагрузка на сервис достигает 85% от того, что мы гоняли на тестах быстродействия. Стоило бы перетестировать под большую нагрузку. У одного из провайдеров ночью вырастает время ответа уже третью неделю. Надо-бы спросить их, что происхоидт.
Это просто мониторинг, и к обсуждаемому хедеру отношения не имеет. Наличие мониторинга не оправдывает добавление хедера.
M>И появился новый warning. Этим warning мы займемся через неделю, у нас тогда запланированы "внутренние" технические работы (которые не business value). Более того, dashboard — одна из первых вещей, которые я смотрю после выхода из отпуска. Еще до того, как начинаю разбирать тысячу писем, скопившихся за месяц (тысяча — не преувеличение).
Ну во-первых, эти емейлы должен читать не один человек, а команда.
Во-вторых, всё просто: пришел емейл, создал джиру, ответил на емейл, что мол, ясно, спасибо, джира создана, сообщим когда сделаем. Всё, будет на виду, в нужном фильтре тикетов с due date. Если емейл потеряется, то отправитель будет чейсить или ескалайтить.
В-третьих, следить за емейлами и джирой можно поручить более дешевому сотруднику. Ты вообще можешь этим не заниматься.
И не забывай, тебе придётся джиру создать в любом случае, вне зависимости есть у тебя хедер или нет. И чейсить и эскалайтить тоже надо будет, т.к. наличие хедера ни к чему обязать не может, и код сам не напишется.
Кстати, если команды работают близко, то они вообще друг-другу джиры могут создавать и видеть что в каком состоянии.
M>Вопрос не в том, что это можно решить административно. Вопрос в том, как это решить удобно. Причем удобно для широкого класса разработчиков. Кто-то будет реагировать на письмо. Другие — на предупреждения. У меня нет цели сделать все единообразно. Пусть каждый выбирает то, что лучше всего работает для его команды. Для меня jira — это так, хотелки. Их можно деприоритизировать. А вот метрики — это объективная реальность и показатель здоровья системы. Плюс подобные метрики асинхронны — система не требует "незамедлительного" внимания, переключения контекста и т.п.
В метрике, например, не будет информации о сроках. Что один API надо проапгрейдить обязательно через 3 месяца, а другой можно на следующий год отложить. И взаимосвязи работ нет. И вообще много чего нет, что может быть в банальном емейле.
M>Для контекста. Я предпочитаю культуру с высокой автономией команд. Команды имеют "общую" высокоуровневую цель, но при этом могут выбирать средства достижения с учетом своей предметной области и других факторов. На уровне компании мы хотим быстро развиваться и экспериментировать. Команды у нас взрослые. Они ответственно подходят к работоспособности своей системы. В результате этих факторов, у нас получается сложнее применять глобальные решения. Они неизбежно будут кому-то неудобны. Так что курс идет на автономию. И отсюда же дополнительные "механизмы безопасности" на случай человеческого фактора. На дороге в светлое будущее у нас безопасно не потому, что очень детальные правила дорожного движения. А потому, что с текущими средствами безопасности можно ехать быстро и не бояться разбиться.
Философия какая-то, неясно причём тут хедер.
M>Ну и исходная задача (я ее уже в общих чертах приводил). Есть сервис A. Он предоставляет /servicea/api/v1. В один прекрасный день команда реализует новый API /service/api/v2 и решает удалить /servicea/api/v1 через три месяца. Кроме того, у нас есть два других сервиса (разрабатываемых другими командами). Сервис Б последний раз деплоился полгода назад и с тех пор не менялся. Сервис В деплоится сейчас два раза в неделю. К сожалению, его команда на ближайший месяц занята своими задачами — удовлетрворяют новые требования законодательства. Так что в течение следующего месяца они так и продолжат использовать /servicea/api/v1. Задача — сделать такие механизмы, чтобы обе команды (Б и В) не забыли перейти на /servicea/api/v2 вовремя. Задача со звездочкой — сделать так, чтобы механизм был удобен и воспринимался естественно в рамках целей компании а не как очередной навязанный процесс.
Это чисто административная и организационная проблема. Хедер эту задачу не поможет решить. Абсолютно никак.
M>Вот вы что-то про тесты писали. Я совсем не понимаю, как они приблизят нас к решению задачи. Когда/почему будут выполняться тесты для сервиса Б? Как будет выглядеть использование deprecated api в процессе тестирования?
Про тесты писал Pauel, как обычная попытка подменить тему обсуждения.
M>Что должна делать команда В, которая осознанно использует deprecated API в течение некоторого времени?
Договориться с командой A о сроках вывода из эксплуатации.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Pauel, Вы писали:
НС>>В топике зашла речь именно про него. P>Это просто пример кастомного хидера.
Речь шла не про хидеры, а про "Нет в HTTP и API-специфичных вещей".
P> Такие хидеры ни разу не рокетсаенс, и поддерживаются тем же ResponseHeaders в OpenApi
При чем тут ResponseHeaders в OpenApi?
P>>>Зачем пропагейтить? Делегируешь процессинг другому компоненту, он от себя будет кидать, что бы ничего не пропагейтить. НС>>Ничего не понял. P>Ты не в курсе, что такое делегирование и весь код у тебя в контроллерах? Чужой компонент может обрабатывать реквесты от твоего имени, все, что тебе надо — дать конфиг.
Я не понимаю как это все касается темы обсуждения.
НС>>Не надо контролировать все, надо контролировать свой собственный сервис и свои собственные логи, даши и алерты. P>Про делегирование ты не в курсе. Как же ты чужой компонент контролируешь, ы?
Зачем контролировать чужой компонент?
P>>>Варнинг можно интерпретировать мониторингом как на этой стороне, так и на той. НС>>Можно не означает нужно. P>Если это часть апи, то нужно ожидать, что мониторинг на той стороне справится самостоятельно.
Зачем вообще нужен мониторинг на той стороне, если проще на этой?
P>>> И это может быть дешевле чем мастырить архитектуру поверх всего. НС>>Не знаю при чем тут архитектура поверх всего и что ты под ней понимаешь. Но больше на эту роль подходят кастомные хидеры. P>Ты сам привел пример, забыл?
Я окончательно перестал тебя понимать.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[48]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>А кто тебе это советует? Это был пример, а не совет.
Это был пример в абсолютно техническом разговоре. Пример проблем стандарта HTTP. А на поверку оказалось, что это был пример административных проблем.
P>Хорошая вещь — например тротлинг сопровождаешь ворнингом.
При чем тут троттлинг?
Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать. Например, появился новый API, на который нужно перейти.
Не надо мухлевать, вводя новые исходные данные и пристегивая к ним мои ответы.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[54]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>Ой! Какой ужас, терабайты! Давайте посчитаем, сколько они стоят. Например, aws ec2 transfer. Самый дорогой — это первые 10Тб, отправленные в интернет. Стоит это 0.09 USD/GB. Т.е. 90 USD/TB. Это где-то 1.5-2 человекочаса. Если вдруг терабайт заголовков позволяет сэкономить 2 часа (суммарно) на координации, переключениях контекста и прочем обслуживании, мы остаемся в плюсе! Данный доступ — это плохое решение. Вместо того, чтобы иметь одну систему мониторинга (для своих сервисов) команда теперь будет вынуждена ходить в несколько различных — свою и каждой зависимости. На ровном месте мы чуть-чуть экономим на заголовках и создаем проблемы администрирования и координации!
Я не понял где и в каком месте произойдёт экономия. Джиры, емейлы, логи, мониторинг и прочее никуда не уходит. Просто появляется ещё дублирование в хедере.
M>Кроме того. Есть еще один замечательный момент. Заголовок с содержимым выглядит примерно так: "X-API-Warnings: W084,W092,W103". Округляя, 100 байт. В килобайте — 10 заголовков. В терабайте 10^10. (мега, гига, тера — 3*3 порядка). Допустим, команда все три месяца ничего не делала и перешла на новый API в последний момент. Т.е. 10^10 ответов было отправлено за 3 месяца. Это дает 10^10 / 3 / 30 / 24 / 60 / 60 = 1286 сообщений в секунду. Что-то мне кажется не очень выгодным тратить время команды, поддерживающей такую нагрузку, на административные задачи и координацию. Я думаю, разработчики будут гораздо более полезны на технических задачах и задачах бизнеса.
Осталось тебе рассказать каким образом хедер будет осуществлять административные задачи и координацию.
M>Что еще. Если у нас терабайты дополнительных заголовков, то логи не работают. Потому что логов тоже терабайты. Ну ладно, по сети они передаются сжатыми. Но обработка и хранение? Я пока не встречал ни одного предложения по обработке логов, где 1ТБ стоил бы всего 90 USD. Так что остаются только метрики. Для этого нам нужно идентифицировать клиентов. Здравствуйте, заголовки.
Это какой сценарий-то? Если не идентифицировать клиентов, то ты не сможешь писать warning-хедер нужным клиентам и не писать ненужным. А warning который пишется всем без разбору не только бесполезен, но даже немножечко вреден.
M> И я уже упоминал сценарий, где несколько deployment unit являются частью одного сервиса и используют одни и те же credentials. Коллега тут предложил использовать "User-Agent". Ну т.е. заголовок. В каждом запросе (API Warnings ходят только там, где есть предупреждения). И по размеру обычно гораздо больше, чем те же коды предупреждений. И кто из нас экономит траффик?
User-Agent это как общее решение. А раз ты как-то ты удосужился узнать где именно это "только там", то и user-agent значит не обязателен.
M>Ну и потом, гоняться по разным Jira и системам за командами — то еще удовольствие.
Хедер вас от этого не избавит.
M>Ведь нужно не только поставить тикет. Нужно, чтобы его заметили нужные люди (я себе настраиваю так, чтобы digest новых тикетов отправлялся на почту каждый день, но далеко не все так делают). Нужно, чтобы не забыли. Особенно если сейчас они заняты другим. А вот постоянно горящая лампочка check engine api usage — хорошая напоминалка. И если команда пользователей делает лампочку сама, с большой вероятностью она окажется на приборной панели (на виду) а не где-нибудь под капотом (там, куда никто из команды не заходит).
Эту лампочку можно зажигать многими другими способами, более надёжными.
Раз вы управляете мониторингом других команд (как-то же вы заставили читать хедер?), то можно сразу сделать рычажок зажечь лампочку напрямую, одной кнопкой, без хедеров в каждом респонзе.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Ночной Смотрящий, Вы писали:
P>>А кто тебе это советует? Это был пример, а не совет.
НС>Это был пример в абсолютно техническом разговоре. Пример проблем стандарта HTTP. А на поверку оказалось, что это был пример административных проблем.
Про что было сразу сказано, стоило всего лишь прочесть вводную. Кроме того, ты осознаешь, что это был пример.
P>>Хорошая вещь — например тротлинг сопровождаешь ворнингом.
НС>При чем тут троттлинг?
Еще один пример.
НС>Не надо мухлевать, вводя новые исходные данные и пристегивая к ним мои ответы.
Мухлюешь ты сам, когда пристегиваешь "совет" когда с твоих же слов, сам понимаешь, что был просто пример.
Re[51]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>В топике зашла речь именно про него. P>>Это просто пример кастомного хидера.
НС>Речь шла не про хидеры, а про "Нет в HTTP и API-специфичных вещей".
, а именно "а кто их читать будет".
P>> Такие хидеры ни разу не рокетсаенс, и поддерживаются тем же ResponseHeaders в OpenApi
НС>При чем тут ResponseHeaders в OpenApi?
Как я вижу, вытут возбудились именно от кастомности хидера, основная претензия "а кто их читать будет", читай себя же http://rsdn.org/forum/design/8376379.1
P>>Ты не в курсе, что такое делегирование и весь код у тебя в контроллерах? Чужой компонент может обрабатывать реквесты от твоего имени, все, что тебе надо — дать конфиг.
НС>Я не понимаю как это все касается темы обсуждения.
Это еще пример, когда анализ changelog не поможет — надо смотреть зависимости второго уровня. Там часто прячутся просто чудовищные дыры или ломающие изменения.
P>>Про делегирование ты не в курсе. Как же ты чужой компонент контролируешь, ы?
НС>Зачем контролировать чужой компонент?
А он часть твоего сервиса, как я уже показал пример.
P>>Если это часть апи, то нужно ожидать, что мониторинг на той стороне справится самостоятельно.
НС>Зачем вообще нужен мониторинг на той стороне, если проще на этой?
Затем, что они шлют не то и надо бы им сказать. Например продолжают слать по старинке, а в силу фикса зависимости второго уровня надо бы пересмотреть вызывающий код.
НС>>>Не знаю при чем тут архитектура поверх всего и что ты под ней понимаешь. Но больше на эту роль подходят кастомные хидеры. P>>Ты сам привел пример, забыл?
НС>Я окончательно перестал тебя понимать.
Здравствуйте, ·, Вы писали:
P>>Предлагаешь взять до кучи роль топ-менеджера и потратить пять лет на выстраивание процесса коммуникации с консумерами что бы закончить фичу? ·>Без хедера фича не работает?
Нет, не работает. К каждой фиче приклеиваются нефункциональные требования — например, мониторинг на обоих сторонах должен обнаруживать проблемы
·>Итак. Получается такая цепочка: ·>0. Ты обнаружил precondontion. ·>1. Код ворнинга ·>2. QA ·>3. Хедер ·>4. Система логгирования ·>5. Мониторинг ·>6. L2 замечает проблему ·>7. L2 расследует ·>8. разработчик-менеджер.
·>Вот теперь объясни зачем нужны шаги 1-7? Это затраты ресурсов и человеческих, и машинных, и на каждом шаге можно сломаться-потеряться и вся цепочка рухнет. Почему бы сразу не перейти к 8му шагу?
Похоже, тебе религия мешает разобраться, зачем нужны ассерты.
Они нужны в момент, как и логи, во время запуска в тч на проде.
Например — выявить, если какаято из 2^100 комбинаций дала подозрительный результат.
P>>·>У тебя нет 2^100 комбинаций. P>>Есть. Типичный реквест содержит куда больше информации. ·>И что? Мы говорим о конкретном warning, который появится в хедере. Который проверяет вполне конкретную информацию по конкретному алгоритму. Т.е. ровно одна комбинация.
Он проверяет свойство результата, например, или свойство входа. У какой из 2^100 комбинаций эти свойства будут нарушены?
P>>Мы снова говорим о том, что ты не понимаешь роль ассертов. Ассерт используется там, где джира-емейл-тестирование неприменимо. Это механизм того же рода, что и логи. ·>Я о роли ассертов и тестов не рассуждал и вообще ничего не говорил. В данном контексте это неважно.
Наоборот, именно это и важно.
P>>Вот-вот. Ассерты это те же логи, только, только условные. Логи знаешь, а ассерты — нет? ·>И причём тут хедер?
При том, что надо быть дать знать той стороне, что свойства ихнего запроса пудозрительные.
P>>И снова ты пишешь о том, что не в курсе проблемы которую решают ассерты. ·>Мне пофиг какие проблемы решают ассерты. Это к разговору не относится. Я пытаюсь из тебя вытянуть какие проблемы решает хедер.
Ты вроде выяснил — административные, разделяет зоны ответственности."херли вы пользуетесь старой схемой, если год назад мы вам дали новую"
·>Так почему именно хедер с ворнингом надо? Чем другие механизмы не устраивают-то?
Самый простой и дешовый. Другие на порядки дороже.
P>>Тебе все рассказали. Это самый простой способ тригерить сообщения в мониторинг на той стороне. ·>Зачем триггерить мониторинг на той стороне?
Затем, что наши ассерты говорят о том, что у них чего то не то.
P>> у вас там что, секюрити не изобрели? В логах чудовищное количество сенситив инфрмации. Если даешь доступ сотне-тысяче консумеров, это все равно что приговор себе подписать. ·>1. В логах не должно быть сенситив информации. По крайней мере не во всех. На крайний случай заведи лог специально для варнингов и расшарь.
Ога, и так для тыщи консумеров.
·>2. Мы вроде о внутренних консьюмерах говорили.
В данном случае это скорее внешние консумеры. Коммуникация то отсутствует, разные подразделения, может оказаться так, что и доступа друг к другу не имеют вовсе. Т.е. разницы со внешними консумерами никакой. Пока менеджмент не договорится, должно быть решение.
P>>Тебе уже сказали, что все это уже есть. Снова нечитатель? ·>В том-то и дело, что много чего уже есть. Так зачем нужен ещё и хедер?
Здравствуйте, ·, Вы писали:
M>>Что должна делать команда В, которая осознанно использует deprecated API в течение некоторого времени? ·>Договориться с командой A о сроках вывода из эксплуатации.
Каким образом договориться с теми, кто тебя игнорирует? Поделись секретом.
Так часто бывает — только выбрасываешь депрекейтед апи, как тут же находится менеджер, который громогласно заявляет, что в следующем году они планировали на него переходить, а теперь у них тесты красные, верните АПИ, и тд и тд.
При этом
1. changelog есть с начала времен
2. аннотациями размечено, что апи депрекейтед
3. есть страница про end-of-life
4. есть нотификации про релизы и тд.
5. есть родмап
6. есть known issues, how to
7. есть development support, когда можно помочь с миграцией, с добавлением фич, траблшутингом и тд и тд
И тем не менее, вдруг появляется N команд которым позарез нужна пред-пред-предыдущая версия АПИ, потому что у них бюджет-сроки ого-го!
Сколько таких втихую используют старую версию трудно даже посчитать, только по реквестам. Потому имеет смысл доработать респонсы таким образом, что бы люди видели постоянно и непрерывно, что они занимаются хернёй.
Re[52]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
НС>>Речь шла не про хидеры, а про "Нет в HTTP и API-специфичных вещей". P>А можно ссылкой?
Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать. Например, появился новый API, на который нужно перейти.
P>>> Такие хидеры ни разу не рокетсаенс, и поддерживаются тем же ResponseHeaders в OpenApi НС>>При чем тут ResponseHeaders в OpenApi? P>Как я вижу, вытут возбудились именно от кастомности хидера
Нет.
P>>>Ты не в курсе, что такое делегирование и весь код у тебя в контроллерах? Чужой компонент может обрабатывать реквесты от твоего имени, все, что тебе надо — дать конфиг. НС>>Я не понимаю как это все касается темы обсуждения. P>Это еще пример, когда анализ changelog не поможет — надо смотреть зависимости второго уровня.
Все равно непонятно.
P>>>Про делегирование ты не в курсе. Как же ты чужой компонент контролируешь, ы? НС>>Зачем контролировать чужой компонент? P>А он часть твоего сервиса, как я уже показал пример.
Я не понимаю какое отношение к передаче чего то между сервисами имеют внутрисервисные компоненты. Разговаривали про коммуникацию между сервисами, логично было предположить что речь шла про зависимости между сервисами. И ту, внезапно, ты пишешь про какие то внутренние зависимости.
P>>>Если это часть апи, то нужно ожидать, что мониторинг на той стороне справится самостоятельно. НС>>Зачем вообще нужен мониторинг на той стороне, если проще на этой? P>Затем, что они шлют не то и надо бы им сказать.
И почему выбран именно вариант с пересылкой чего то в хидере в каждом респонсе, если есть масса других способов, не нагружающих продовый протокол?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[53]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Речь шла не про хидеры, а про "Нет в HTTP и API-специфичных вещей". P>>А можно ссылкой?
НС>
НС>Нет в HTTP и API-специфичных вещей. Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах (в значениях — коды, которые можно посмотреть в документации по конкретному сервису). Основной сценарий — извещать клиента о том, что его запросы перестают соответствовать требованиям и нужно бы что-то сделать. Например, появился новый API, на который нужно перейти.
P>>>>Ты не в курсе, что такое делегирование и весь код у тебя в контроллерах? Чужой компонент может обрабатывать реквесты от твоего имени, все, что тебе надо — дать конфиг. НС>>>Я не понимаю как это все касается темы обсуждения. P>>Это еще пример, когда анализ changelog не поможет — надо смотреть зависимости второго уровня.
НС>Все равно непонятно.
Что тут непонятного? Компонент — часть твоего сервиса, и сам обрабатывает http-трафик, откуда ясно, что ничего пропагейтить не надо. Теперь одна из зависимостей этого компонента вдруг чего то там поменяла. Как ты это обнаружишь, если не собираешься читать changlelog зависимостей 2го уровня?
НС>Я не понимаю какое отношение к передаче чего то между сервисами имеют внутрисервисные компоненты. Разговаривали про коммуникацию между сервисами, логично было предположить что речь шла про зависимости между сервисами. И ту, внезапно, ты пишешь про какие то внутренние зависимости.
Я пишу про зависимости второго уровня. Ты же собирался changelog читатать и предложил это как решение.
НС>>>Зачем вообще нужен мониторинг на той стороне, если проще на этой? P>>Затем, что они шлют не то и надо бы им сказать. НС>И почему выбран именно вариант с пересылкой чего то в хидере в каждом респонсе, если есть масса других способов, не нагружающих продовый протокол?
Потому, что это проще и дешевле. Нагрузка на транспорт ничтожная. А твое предложение — поднять, как вариант, редис, подразумевает, что и платить за этот редис и прочие сопутствующие вещи. "Такие вещи, как я уже сказал, обычно делаются при помощи CR и оператора (либо, если нужна супероперативность, с каким нибудь промежуточным хранилищем типа редиса или консула), "
Более того — запрос к редису всё равно придется делать. Т.е. вместо строчки варнинга, условно, 100 байт максимум, у тебя будет запрос в редис, как минимум. С т.з. разработки нам надо теперь протестировать, что наша апликачка не просто возвращает чего то там, а еще и правильно взаимодействует с редисом, и этот редис надо теперь таскать во все деплойменты.
Далее, редисом дело не ограничивается, это все надо по любому вывести в мониторинг.
Итого — если можно решить черз АПИ, стоит начать именно с этого.
Re[56]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Похоже, тебе религия мешает разобраться, зачем нужны ассерты.
Ассерты тут вообще непричём. Я пытаюсь разобраться зачем нужен этот хедер. Но ты всё время куда-то в сторону уводишь разговор.
P>Они нужны в момент, как и логи, во время запуска в тч на проде. P>Например — выявить, если какаято из 2^100 комбинаций дала подозрительный результат.
Выявлять комбинации ассерты не могут в принципе. Ассерт может лишь выявить комбинацию, прописанную в precondition. Или у тебя в коде 2^100 ассертов?!
P>>>·>У тебя нет 2^100 комбинаций. P>>>Есть. Типичный реквест содержит куда больше информации. P>·>И что? Мы говорим о конкретном warning, который появится в хедере. Который проверяет вполне конкретную информацию по конкретному алгоритму. Т.е. ровно одна комбинация. P>Он проверяет свойство результата, например, или свойство входа. У какой из 2^100 комбинаций эти свойства будут нарушены?
У той, которая прописана в precondition.
P>>>Мы снова говорим о том, что ты не понимаешь роль ассертов. Ассерт используется там, где джира-емейл-тестирование неприменимо. Это механизм того же рода, что и логи. P>·>Я о роли ассертов и тестов не рассуждал и вообще ничего не говорил. В данном контексте это неважно. P>Наоборот, именно это и важно.
Важно для чего? Вопрос был — почему ассерт должен добавлять именно хедер?
P>>>Вот-вот. Ассерты это те же логи, только, только условные. Логи знаешь, а ассерты — нет? P>·>И причём тут хедер? P>При том, что надо быть дать знать той стороне, что свойства ихнего запроса пудозрительные.
Почему это надо сделать именно хедером?
P>>>И снова ты пишешь о том, что не в курсе проблемы которую решают ассерты. P>·>Мне пофиг какие проблемы решают ассерты. Это к разговору не относится. Я пытаюсь из тебя вытянуть какие проблемы решает хедер. P>Ты вроде выяснил — административные, разделяет зоны ответственности."херли вы пользуетесь старой схемой, если год назад мы вам дали новую"
Мы вроде выяснили, что хедер никак не может решать административные проблемы. Игнорировать хедеры гораздо проще, чем, например, емейлы и т.п.
P>·>Так почему именно хедер с ворнингом надо? Чем другие механизмы не устраивают-то? P>Самый простой и дешовый. Другие на порядки дороже.
За счёт чего? Как выяснили выше, хедер добавляет 7 лишних шагов, приводя к тому же результату. Лишние шаги лишь добавляют к стоимости. Неясно на чём они экономят. В конце цепочки всё равно будет емейл разработчику-менеджеру.
P>>>Тебе все рассказали. Это самый простой способ тригерить сообщения в мониторинг на той стороне. P>·>Зачем триггерить мониторинг на той стороне? P>Затем, что наши ассерты говорят о том, что у них чего то не то.
Пусть ваши ассерты хоть свежие анекдоты рассказывают. Так с какой целью вам нужно триггерить мониторинг на той стороне?
P>>> у вас там что, секюрити не изобрели? В логах чудовищное количество сенситив инфрмации. Если даешь доступ сотне-тысяче консумеров, это все равно что приговор себе подписать. P>·>1. В логах не должно быть сенситив информации. По крайней мере не во всех. На крайний случай заведи лог специально для варнингов и расшарь. P>Ога, и так для тыщи консумеров.
Ты вначале расскажи, как ты будешь контролировать что делает мониторинг у тыщи консьюмеров.
P>·>2. Мы вроде о внутренних консьюмерах говорили. P>В данном случае это скорее внешние консумеры. Коммуникация то отсутствует, разные подразделения, может оказаться так, что и доступа друг к другу не имеют вовсе. Т.е. разницы со внешними консумерами никакой. Пока менеджмент не договорится, должно быть решение.
Значит и их мониторинг вам неподконтролен. И какие-то из 1-7 шагов будут благополучно потеряны и забыты практически наверняка.
P>>>Тебе уже сказали, что все это уже есть. Снова нечитатель? P>·>В том-то и дело, что много чего уже есть. Так зачем нужен ещё и хедер? P>Что бы мониторинг на той стороне сработал.
Где гарантия, что он сработает? Где гарантия, что он не будет проигнорирован? Почему не подходят многие другие способы коммуникации?
Здравствуйте, Pauel, Вы писали:
M>>>Что должна делать команда В, которая осознанно использует deprecated API в течение некоторого времени? P>·>Договориться с командой A о сроках вывода из эксплуатации. P>Каким образом договориться с теми, кто тебя игнорирует? Поделись секретом.
Escalate.
P>Так часто бывает — только выбрасываешь депрекейтед апи, как тут же находится менеджер, который громогласно заявляет, что в следующем году они планировали на него переходить, а теперь у них тесты красные, верните АПИ, и тд и тд. P>И тем не менее, вдруг появляется N команд которым позарез нужна пред-пред-предыдущая версия АПИ, потому что у них бюджет-сроки ого-го!
Допустим. И хедер, значит вдруг все бюджет со сроками поменяет?
P>Сколько таких втихую используют старую версию трудно даже посчитать, только по реквестам.
И тут у вас Хедер на Белом коне, всю херню повергнет и менеджеров в бегство обратит. Я правильно понял?
P>Потому имеет смысл доработать респонсы таким образом, что бы люди видели постоянно и непрерывно, что они занимаются хернёй.
Открою для тебя секрет — не у всех людей есть хобби рассматривать хедеры респонзов.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[55]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>·>Договориться с командой A о сроках вывода из эксплуатации. P>>Каким образом договориться с теми, кто тебя игнорирует? Поделись секретом. ·>Escalate.
Когда ворнинг попал в АПИ, то это значит, что всё уже было много раз. Может даже архитектор пришел и сказал — делаем так, потому что мне приказали.
P>>И тем не менее, вдруг появляется N команд которым позарез нужна пред-пред-предыдущая версия АПИ, потому что у них бюджет-сроки ого-го! ·>Допустим. И хедер, значит вдруг все бюджет со сроками поменяет?
Хидер это часть апи. И самое меньшее, что можно ожидать, сообщения в тамошнем мониторинге. И когда будут претензии, они будут, т.к. есть сложности с коммуникацией, то будет ответ — "а чой та вы свой мониторинг игнорируете?"
P>>Сколько таких втихую используют старую версию трудно даже посчитать, только по реквестам. ·>И тут у вас Хедер на Белом коне, всю херню повергнет и менеджеров в бегство обратит. Я правильно понял?
Тебе снова повторить про l2 суппорт, мониторинг на той стороне, специализированый клиент?
Кроме того, если ты вкоммитал поддержку апи, то дальше это твои и твоего подразделения проблемы, что вы там чего то игнорируете.
P>>Потому имеет смысл доработать респонсы таким образом, что бы люди видели постоянно и непрерывно, что они занимаются хернёй. ·>Открою для тебя секрет — не у всех людей есть хобби рассматривать хедеры респонзов.
У людей — нет, а вот у клиента, который поддерживает это апи, и l2 суппорта, будет все необходимое. Первый под это заточен, а у вторых работа такая.
Если игнорируют и девелопервы, и l2 суппорт, опять же, это проблемы вашего подразделения, что вы не смотрите в апи, которое вызываете.
Re[57]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Похоже, тебе религия мешает разобраться, зачем нужны ассерты. ·>Ассерты тут вообще непричём. Я пытаюсь разобраться зачем нужен этот хедер. Но ты всё время куда-то в сторону уводишь разговор.
Тебе уже много раз рассказали.
P>>Они нужны в момент, как и логи, во время запуска в тч на проде. P>>Например — выявить, если какаято из 2^100 комбинаций дала подозрительный результат. ·>Выявлять комбинации ассерты не могут в принципе. Ассерт может лишь выявить комбинацию, прописанную в precondition. Или у тебя в коде 2^100 ассертов?!
Могут, еще как. Это их основное предназначение. Сам же пишешь — выявить комбинацию прописаную в условии. Только не precondition, а postcondintion, и даже инвариант. И не сама комбинация прописывает, а её признаки. Условие ровно одно — свойства входа или результата. Например — контрольная сумма. Гыгы. Не сходится — с реквестом вероятно чтото не то. Логируем, выставляем варнинг и возвращаем респонс.
P>>Он проверяет свойство результата, например, или свойство входа. У какой из 2^100 комбинаций эти свойства будут нарушены? ·>У той, которая прописана в precondition.
В прекондишн прописано только условие. На этапе разработки ты эту комбинацию не знаешь.
P>>Наоборот, именно это и важно. ·>Важно для чего? Вопрос был — почему ассерт должен добавлять именно хедер?
Надо же как то задетектить некорректный вызов. Есть простой вариант — deprecated вызов. Если все сходится к этому — это очень даже легко. Есть и более сложные, например, процессинг выдал варнинги, которых быть не должно, и в хидере x-варнинг будет ссылка на урл этих варнингов.
P>>При том, что надо быть дать знать той стороне, что свойства ихнего запроса пудозрительные. ·>Почему это надо сделать именно хедером?
Например, потому что это самый простой и дешевый способ разграничить ответственность. Вкомитал вызов согласно этому АПИ — теперь отвечай сам за корректность запросов.
P>>Ты вроде выяснил — административные, разделяет зоны ответственности."херли вы пользуетесь старой схемой, если год назад мы вам дали новую" ·>Мы вроде выяснили, что хедер никак не может решать административные проблемы. Игнорировать хедеры гораздо проще, чем, например, емейлы и т.п.
Ага, в ответ на "escalate" прибегает архитектор, и говорит "делай хидер с варнингом, мне так приказали сверху, теперь всё апи будет таким."
·>За счёт чего? Как выяснили выше, хедер добавляет 7 лишних шагов, приводя к тому же результату. Лишние шаги лишь добавляют к стоимости. Неясно на чём они экономят. В конце цепочки всё равно будет емейл разработчику-менеджеру.
Ты так и не рассказал, как будет без хидера
P>>Затем, что наши ассерты говорят о том, что у них чего то не то. ·>Пусть ваши ассерты хоть свежие анекдоты рассказывают. Так с какой целью вам нужно триггерить мониторинг на той стороне?
Что бы они приняли действия на своей стороне по исправлению проблемы.
P>>Ога, и так для тыщи консумеров. ·>Ты вначале расскажи, как ты будешь контролировать что делает мониторинг у тыщи консьюмеров.
В том то и дело, что мне и не надо это делать. Как только они вкомитали использование этого апи, теперь это их забота. Я могу гайдлайны подкинуть, типа "добавьте правило в мониторинг". Но контролировать свою сторону будут они сами.
P>>В данном случае это скорее внешние консумеры. Коммуникация то отсутствует, разные подразделения, может оказаться так, что и доступа друг к другу не имеют вовсе. Т.е. разницы со внешними консумерами никакой. Пока менеджмент не договорится, должно быть решение. ·>Значит и их мониторинг вам неподконтролен. И какие-то из 1-7 шагов будут благополучно потеряны и забыты практически наверняка.
Забавно, что ты так и не показал, что будет в твоем случае. В основном эти 1-7 шагов благополучно работают, и именно потому, что легко автоматизируются и не требуют давать взятку менеджеру по security.
P>>Что бы мониторинг на той стороне сработал. ·>Где гарантия, что он сработает? Где гарантия, что он не будет проигнорирован? Почему не подходят многие другие способы коммуникации?
Эти гарантии пусть они сами обеспечивают. Почему не подходят другие способы коммуникации — вот бы узнать, почему ихние менеджеры игнорируют емейлы.
Вот пример — в марте один заказал большую фичу, запили, в июне написал ему сообщение, что де фича готова, пользуйтесь и тд и тд.
И в начале октября он начал задавать вопросы, о чем это я
Зато при траблшутниге, если их L2 суппорт придет ко мне, мне достаточно кидануть им одну ссылку, что бы они были в курсе, как починить.
·>Прикольно, оказывается в http есть хедер Warning. И, кто бы мог подумать, deprectated.
Для браузера в этом смысла не много, он всё равно ничего исправить не сможет. А вот в конкретном приложении на такой хидер можно навесить дополнительные капабилити, например, счетчик варнингов и тротлинг по мере роста, логирование на вызывающей стороне, И это всё без изменения кода сервисов.
Здравствуйте, Pauel, Вы писали:
НС>>Это был пример в абсолютно техническом разговоре. Пример проблем стандарта HTTP. А на поверку оказалось, что это был пример административных проблем. P>Про что было сразу сказано, стоило всего лишь прочесть вводную.
Где про это было сказано?
P>>>Хорошая вещь — например тротлинг сопровождаешь ворнингом. НС>>При чем тут троттлинг? P>Еще один пример.
Пример чего?
НС>>Не надо мухлевать, вводя новые исходные данные и пристегивая к ним мои ответы. P>Мухлюешь ты сам, когда пристегиваешь "совет" когда с твоих же слов, сам понимаешь, что был просто пример.
Ничего не понял. Какой совет, куда я его пристегнул?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[51]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Это был пример в абсолютно техническом разговоре. Пример проблем стандарта HTTP. А на поверку оказалось, что это был пример административных проблем. P>>Про что было сразу сказано, стоило всего лишь прочесть вводную.
НС>Где про это было сказано?
Собственно, после этих утверждений никаких сомнений быть не может
НС>>>При чем тут троттлинг? P>>Еще один пример.
НС>Пример чего?
Еще пример, что бы яснее было. Как только появляется фича в апи, в т.ч. хидер x-варнинг, у нас искаропки есть капабилити благодаря мониторингу, апи гатевею, итд итд.
НС>>>Не надо мухлевать, вводя новые исходные данные и пристегивая к ним мои ответы. P>>Мухлюешь ты сам, когда пристегиваешь "совет" когда с твоих же слов, сам понимаешь, что был просто пример.
НС>Ничего не понял. Какой совет, куда я его пристегнул?
мы видим здесь, что тебе мерещится совет.
И тут же пишешь "Это был пример в абсолютно техническом разговоре. " То есть, ты в курсе, что это был не совет, а пример.
Ну и если отмотать на начало, то самое, что ты сам указал, видим " Например, я обычно делаю заголовок X-Api-Warning стандартным в ответах..."
Вроде бы понятно, что здесь написано "Например", а не "мой совет — делать так"
Re[56]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>Каким образом договориться с теми, кто тебя игнорирует? Поделись секретом. P>·>Escalate. P>Когда ворнинг попал в АПИ, то это значит, что всё уже было много раз. Может даже архитектор пришел и сказал — делаем так, потому что мне приказали.
Что магического в варнинге такого, что его не игнорируют, а всё остальное игнорируют?
P>>>И тем не менее, вдруг появляется N команд которым позарез нужна пред-пред-предыдущая версия АПИ, потому что у них бюджет-сроки ого-го! P>·>Допустим. И хедер, значит вдруг все бюджет со сроками поменяет? P>Хидер это часть апи. И самое меньшее, что можно ожидать, сообщения в тамошнем мониторинге. И когда будут претензии, они будут, т.к. есть сложности с коммуникацией, то будет ответ — "а чой та вы свой мониторинг игнорируете?"
Чем игнорирование мониторинга принципиально отличается от игнорирования, например, емейлов?
Единственный ответ напрашивается: у вас так принято, у вас вокруг этого уже есть построенная инфраструктура и культура коммуникации. Ну ради бога. Хоть хедеры шлите, хоть в бубен бейте и дымовые сигналы подавайте. Но рекомендовать такое — не надо, это не самое эффективное решение.
P>>>Сколько таких втихую используют старую версию трудно даже посчитать, только по реквестам. P>·>И тут у вас Хедер на Белом коне, всю херню повергнет и менеджеров в бегство обратит. Я правильно понял? P>Тебе снова повторить про l2 суппорт, мониторинг на той стороне, специализированый клиент?
Повторять не надо. Нужно объяснить, почему прямой емейл не работает, а емейл посланный от l2 через несколько слоёв — работает?
P>Кроме того, если ты вкоммитал поддержку апи, то дальше это твои и твоего подразделения проблемы, что вы там чего то игнорируете.
У нас обычно взаимодействующие системы обмениваются Point of Contact — для AppDevs (для вопросов разработки) и для ProdSupport (для вопросов экспуатации). Это просто email-рассылки. Ибо это проблема организационная и административная.
P>>>Потому имеет смысл доработать респонсы таким образом, что бы люди видели постоянно и непрерывно, что они занимаются хернёй. P>·>Открою для тебя секрет — не у всех людей есть хобби рассматривать хедеры респонзов. P>У людей — нет, а вот у клиента, который поддерживает это апи, и l2 суппорта, будет все необходимое. Первый под это заточен, а у вторых работа такая.
l2 суппорт это не люди что-ли?! В данном случае API может лишь переслать сообщения между людьми, и ничего более. Вот и неясно чем smtp хуже, чем http.
P>Если игнорируют и девелопервы, и l2 суппорт, опять же, это проблемы вашего подразделения, что вы не смотрите в апи, которое вызываете.
Значит должны общаться люди, а не приложения. Вот и неясно, чем же вы обосновываете необходимость общения людей через _Application_ Programming Interface.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[57]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Когда ворнинг попал в АПИ, то это значит, что всё уже было много раз. Может даже архитектор пришел и сказал — делаем так, потому что мне приказали. ·>Что магического в варнинге такого, что его не игнорируют, а всё остальное игнорируют?
Никакая это не магия — это часть АПИ. Потому искаропки доступны капабилити апи гатевей, мониторинга и тд, даже если письма никто не читает.
P>>Хидер это часть апи. И самое меньшее, что можно ожидать, сообщения в тамошнем мониторинге. И когда будут претензии, они будут, т.к. есть сложности с коммуникацией, то будет ответ — "а чой та вы свой мониторинг игнорируете?" ·>Чем игнорирование мониторинга принципиально отличается от игнорирования, например, емейлов?
Игнорируют в основном не специально, а в силу перегрузки. Емейл — крайне перегруженый канал в корпорациях. Мониторинг изначально строится так, что бы можно было легко отслеживать проблемы в работающих сервисах.
Емейл может затеряться, changelog может содержать не всю информацию или не содержать вовсе, депенденсы 2го уровня могут измениться в ряде случаев — ситуаций слишком много.
А вот мониторинг и апи гатевей это одни из надежных механизмов, на которые и стоит полагаться.
·>Единственный ответ напрашивается: у вас так принято, у вас вокруг этого уже есть построенная инфраструктура и культура коммуникации. Ну ради бога. Хоть хедеры шлите, хоть в бубен бейте и дымовые сигналы подавайте. Но рекомендовать такое — не надо, это не самое эффективное решение.
Ты эффективного пока не показал. Кроме того, здесь буквально примеры, а не советы.
P>>Тебе снова повторить про l2 суппорт, мониторинг на той стороне, специализированый клиент? ·>Повторять не надо. Нужно объяснить, почему прямой емейл не работает, а емейл посланный от l2 через несколько слоёв — работает?
L2 суппорт может и по телефону набрать, когда есть на то необходимость. Они не связаны инструкциями, как L1, потому могут много чего. Не отвечает один менеджер — найдут другого, не отвечает и этот — смогут изыскать QA, девелопера и тд.
Потому и работает, что нет привязки к какому либо каналу информации вроде перегруженного емейла.
·>У нас обычно взаимодействующие системы обмениваются Point of Contact — для AppDevs (для вопросов разработки) и для ProdSupport (для вопросов экспуатации). Это просто email-рассылки. Ибо это проблема организационная и административная.
Этого мало. Для начала, ктото должен читать это всё, предпринимать действия и тд и тд.
P>>У людей — нет, а вот у клиента, который поддерживает это апи, и l2 суппорта, будет все необходимое. Первый под это заточен, а у вторых работа такая. ·>l2 суппорт это не люди что-ли?! В данном случае API может лишь переслать сообщения между людьми, и ничего более. Вот и неясно чем smtp хуже, чем http.
Потому, как почта почти всегда перегружена, и её большей частью читают не в режиме реального времени, а когда найдется время. И то читают не всё.
Если выбираем вариант с АПИ, то мы полагаемся на тот факт, что у вызывающей стороны есть команда эксплуатации, и что они будут делом заняты, а не бамбук курить.
Как они связаны с менеджерами — обычно целой кучей способов, включая телефонный звонок.
P>>Если игнорируют и девелопервы, и l2 суппорт, опять же, это проблемы вашего подразделения, что вы не смотрите в апи, которое вызываете. ·>Значит должны общаться люди, а не приложения. Вот и неясно, чем же вы обосновываете необходимость общения людей через _Application_ Programming Interface.
Эту необходимость обосновывает менеджмент когда не может навести порядок, а я просто пересказываю. Нету обоснований — говорю, что не в курсе почему, но работает так то и так то.
Re[58]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>Похоже, тебе религия мешает разобраться, зачем нужны ассерты. P>·>Ассерты тут вообще непричём. Я пытаюсь разобраться зачем нужен этот хедер. Но ты всё время куда-то в сторону уводишь разговор. P>Тебе уже много раз рассказали.
Рассказано текущее положение дел у вас, а не обоснование чем такое решение лучше, чем альтернативы.
P>>>Они нужны в момент, как и логи, во время запуска в тч на проде. P>>>Например — выявить, если какаято из 2^100 комбинаций дала подозрительный результат. P>·>Выявлять комбинации ассерты не могут в принципе. Ассерт может лишь выявить комбинацию, прописанную в precondition. Или у тебя в коде 2^100 ассертов?! P>Могут, еще как. Это их основное предназначение. Сам же пишешь — выявить комбинацию прописаную в условии. Только не precondition, а postcondintion, и даже инвариант. И не сама комбинация прописывает, а её признаки. Условие ровно одно — свойства входа или результата.
Под precondition я имею в виду идентификатор из твоего кода: Warning.assert(precondontion, 'unexpected input'). Тебя опять куда-то унесло в оффтопик.
P>Например — контрольная сумма. Гыгы. Не сходится — с реквестом вероятно чтото не то. Логируем, выставляем варнинг и возвращаем респонс.
Такую херню надо просто реджектить без вопросов. Если вы не реджектите, то ясно понятно почему у вас такая беда с тестированием и контролем качества. Системы как бы работают, но никто толком не понимает как и почему.
P>>>Он проверяет свойство результата, например, или свойство входа. У какой из 2^100 комбинаций эти свойства будут нарушены? P>·>У той, которая прописана в precondition. P>В прекондишн прописано только условие. На этапе разработки ты эту комбинацию не знаешь.
Если ты эту комбинацию не знаешь, ты не сможешь написать Warning.assert(precondontion, 'unexpected input').
P>>>Наоборот, именно это и важно. P>·>Важно для чего? Вопрос был — почему ассерт должен добавлять именно хедер? P>Надо же как то задетектить некорректный вызов. Есть простой вариант — deprecated вызов. Если все сходится к этому — это очень даже легко. Есть и более сложные, например, процессинг выдал варнинги, которых быть не должно, и в хидере x-варнинг будет ссылка на урл этих варнингов.
Перечитай вопрос внимательно. Почему именно хедер? Например, пусть ваш мониторинг аггрится на ERROR в логах и шлёт емейлы кому положено, напрямую. Зачем эти промежуточные слои через rest, чужой мониторинг, чужой L2 и т.п.?
P>>>При том, что надо быть дать знать той стороне, что свойства ихнего запроса пудозрительные. P>·>Почему это надо сделать именно хедером? P>Например, потому что это самый простой и дешевый способ разграничить ответственность. Вкомитал вызов согласно этому АПИ — теперь отвечай сам за корректность запросов.
Некорректные запросы надо просто реджектить. Давай другой пример.
P>>>Ты вроде выяснил — административные, разделяет зоны ответственности."херли вы пользуетесь старой схемой, если год назад мы вам дали новую" P>·>Мы вроде выяснили, что хедер никак не может решать административные проблемы. Игнорировать хедеры гораздо проще, чем, например, емейлы и т.п. P>Ага, в ответ на "escalate" прибегает архитектор, и говорит "делай хидер с варнингом, мне так приказали сверху, теперь всё апи будет таким."
Т.е. у вас так принято, культ карго. Так бы сразу и сказал.
P>·>За счёт чего? Как выяснили выше, хедер добавляет 7 лишних шагов, приводя к тому же результату. Лишние шаги лишь добавляют к стоимости. Неясно на чём они экономят. В конце цепочки всё равно будет емейл разработчику-менеджеру. P>Ты так и не рассказал, как будет без хидера
Сказал. После 0го шага идёт сразу 8й.
P>>>Затем, что наши ассерты говорят о том, что у них чего то не то. P>·>Пусть ваши ассерты хоть свежие анекдоты рассказывают. Так с какой целью вам нужно триггерить мониторинг на той стороне? P>Что бы они приняли действия на своей стороне по исправлению проблемы.
Как это их обязует принимать действия? Почему они не могут предпринять те же действия, например, при получении емейла от вас?
P>>>Ога, и так для тыщи консумеров. P>·>Ты вначале расскажи, как ты будешь контролировать что делает мониторинг у тыщи консьюмеров. P>В том то и дело, что мне и не надо это делать. Как только они вкомитали использование этого апи, теперь это их забота. Я могу гайдлайны подкинуть, типа "добавьте правило в мониторинг". Но контролировать свою сторону будут они сами.
Так чтение емейлов тоже их забота. В чём разница?
P>>>В данном случае это скорее внешние консумеры. Коммуникация то отсутствует, разные подразделения, может оказаться так, что и доступа друг к другу не имеют вовсе. Т.е. разницы со внешними консумерами никакой. Пока менеджмент не договорится, должно быть решение. P>·>Значит и их мониторинг вам неподконтролен. И какие-то из 1-7 шагов будут благополучно потеряны и забыты практически наверняка. P>Забавно, что ты так и не показал, что будет в твоем случае. В основном эти 1-7 шагов благополучно работают, и именно потому, что легко автоматизируются и не требуют давать взятку менеджеру по security.
Да тоже самое. Оптимум — после 0го шага сразу 8й. Ну или 7й, может быть. Шаги 1-6 не нужны вообще.
P>>>Что бы мониторинг на той стороне сработал. P>·>Где гарантия, что он сработает? Где гарантия, что он не будет проигнорирован? Почему не подходят многие другие способы коммуникации? P>Эти гарантии пусть они сами обеспечивают. Почему не подходят другие способы коммуникации — вот бы узнать, почему ихние менеджеры игнорируют емейлы.
Если они могут обеспечить, что ихние менеджеры не игнорируют емейлы от L2, то они смогут обеспечить, чтобы ихние менеджеры не игнорировали емейлы от вас. А если нет, то и хедеры не помогут. Вывод — хедер — лишняя сущность.
Вообще говоря, если эта проблема дошла до L2, т.е. прод-суппорт, это уже большой организационный фейл. Такие вещи должны утрясываться между AD.
P>Вот пример — в марте один заказал большую фичу, запили, в июне написал ему сообщение, что де фича готова, пользуйтесь и тд и тд. P>И в начале октября он начал задавать вопросы, о чем это я P>Зато при траблшутниге, если их L2 суппорт придет ко мне, мне достаточно кидануть им одну ссылку, что бы они были в курсе, как починить.
Придёт так же в октябре. В чём разница-то?
P>·>Прикольно, оказывается в http есть хедер Warning. И, кто бы мог подумать, deprectated. P>Для браузера в этом смысла не много, он всё равно ничего исправить не сможет. А вот в конкретном приложении на такой хидер можно навесить дополнительные капабилити, например, счетчик варнингов и тротлинг по мере роста, логирование на вызывающей стороне, И это всё без изменения кода сервисов.
Для этого не нужен хедер отправлять консьюмерам. Т.к. это всё навешивается у провайдера, а не у консьюмеров. Опять на ходу тему меняешь.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[55]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Если не идентифицировать клиентов, то ты не сможешь писать warning-хедер нужным клиентам и не писать ненужным.
А зачем мне идентифицировать клиентов для простановки заголовка? Какая разница, Петя вызывает deprecated API или Вася? Warning будет отправлен ровно тем (и всем тем) клиентам, которые этот deprecated API используют. А тем, кто его не использует — отправлены не будут. Здесь все зависит в первую очередь от самого API. Может иногда от того, что содержится в запросе. А вот от имени пользователя, клиентской библиотеки и того, где и как клиент крутится — не зависит.
Re[56]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>·>Если не идентифицировать клиентов, то ты не сможешь писать warning-хедер нужным клиентам и не писать ненужным. M>А зачем мне идентифицировать клиентов для простановки заголовка? Какая разница, Петя вызывает deprecated API или Вася? Warning будет отправлен ровно тем (и всем тем) клиентам, которые этот deprecated API используют. А тем, кто его не использует — отправлены не будут. Здесь все зависит в первую очередь от самого API. Может иногда от того, что содержится в запросе. А вот от имени пользователя, клиентской библиотеки и того, где и как клиент крутится — не зависит.
Ты же как-то узнаёшь, что используется именно deprecated api... Получается т.е. ты идентифицируешь deprecated клиентов по урлу или как-то иначе, а не user-agent... суть та же.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[59]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>·>Ассерты тут вообще непричём. Я пытаюсь разобраться зачем нужен этот хедер. Но ты всё время куда-то в сторону уводишь разговор. P>>Тебе уже много раз рассказали. ·>Рассказано текущее положение дел у вас, а не обоснование чем такое решение лучше, чем альтернативы.
Ты альтернативу так и не показал, кроме "у нас есть рассылки" Рассылки сами все проблемы порешают?
P>>Могут, еще как. Это их основное предназначение. Сам же пишешь — выявить комбинацию прописаную в условии. Только не precondition, а postcondintion, и даже инвариант. И не сама комбинация прописывает, а её признаки. Условие ровно одно — свойства входа или результата. ·>Под precondition я имею в виду идентификатор из твоего кода: Warning.assert(precondontion, 'unexpected input'). Тебя опять куда-то унесло в оффтопик.
Ну вот. А где здесь та самая комбинация и как её узнать на момент тестирования?
P>>Например — контрольная сумма. Гыгы. Не сходится — с реквестом вероятно чтото не то. Логируем, выставляем варнинг и возвращаем респонс. ·>Такую херню надо просто реджектить без вопросов.
Теоретически. А вот практически этот вариант не всегда реализуем, т.к. всегда будут какие нибудь варнинги.
P>>В прекондишн прописано только условие. На этапе разработки ты эту комбинацию не знаешь. ·>Если ты эту комбинацию не знаешь, ты не сможешь написать Warning.assert(precondontion, 'unexpected input').
Минутка ликбеза:
Вот у нас есть код, сумма — это что бы условие задачи упростить, синтетический пример — говорю заранее, т.к. ты щас начнешь придираться к словам.
function sum(a, b) {
// код этой функции для тебя не виден, включи воображение
// то есть, тот самый чОрный ящик
if(a == randomInt(1000000000)) return 100; // симулируем баг с нестабильным поведением
if(b == randomInt(1000000000)) return 200; // симулируем баг с нестабильным поведением
return a + b;
}
assert выдаст в лог, что посткондишн не сходится, и напечает тебе и а, и b.
Например assert(() => a+b == result, a, b);
А теперь твой ход — покажи, как ты подобную багу будешь искать тестами.
·>Перечитай вопрос внимательно. Почему именно хедер? Например, пусть ваш мониторинг аггрится на ERROR в логах и шлёт емейлы кому положено, напрямую. Зачем эти промежуточные слои через rest, чужой мониторинг, чужой L2 и т.п.?
Еще раз — емейл это крайне перегруженый канал. Слишком велик шанс что письмо тупо пропустят или прочитают слишком поздно.
P>>Например, потому что это самый простой и дешевый способ разграничить ответственность. Вкомитал вызов согласно этому АПИ — теперь отвечай сам за корректность запросов. ·>Некорректные запросы надо просто реджектить. Давай другой пример.
Пример тебе не нравится — это уже твои проблемы.
P>>Ага, в ответ на "escalate" прибегает архитектор, и говорит "делай хидер с варнингом, мне так приказали сверху, теперь всё апи будет таким." ·>Т.е. у вас так принято, культ карго. Так бы сразу и сказал.
Рашение административных проблем как правило занимает много времени, бывает даже годы, пока выработается и стабилизируется конкретный процесс.
А решение нужно прямо сейчас.
P>>Ты так и не рассказал, как будет без хидера ·>Сказал. После 0го шага идёт сразу 8й.
Это детские отписки. Поскольку ты закладываешься на емейл, слишком велик шанс что прочитают с запозданием. И на этот случай у тебя решения как не было, так и нет.
P>>Что бы они приняли действия на своей стороне по исправлению проблемы. ·>Как это их обязует принимать действия? Почему они не могут предпринять те же действия, например, при получении емейла от вас?
Ты, похоже, не читаешь. Емейл слишком ненадежный канал. При условии, что люди относятся к обязанностям добросовестно, емейл не дает никаких гарантий — срочная работа на выезде, воркшоп, командировка, отпуск, итд итд. Упс — прочитали, но неделю спустя. Еще момент — человек просто устал и пропустил тот самый емейл.
А вот на звоночек в мониторинге реагируют очень быстро, и L2 суппорт в состоянии купировать большинство проблем.
P>>В том то и дело, что мне и не надо это делать. Как только они вкомитали использование этого апи, теперь это их забота. Я могу гайдлайны подкинуть, типа "добавьте правило в мониторинг". Но контролировать свою сторону будут они сами. ·>Так чтение емейлов тоже их забота. В чём разница?
Ты усиленно игнорируешь всё, что я пишу про емейлы. Какой в этом смысл?
·>Да тоже самое. Оптимум — после 0го шага сразу 8й. Ну или 7й, может быть. Шаги 1-6 не нужны вообще.
Ну вот был воркшоп, чтение емейлов перенесли на завтра. Упс. Что делать?
·>Если они могут обеспечить, что ихние менеджеры не игнорируют емейлы от L2, то они смогут обеспечить, чтобы ихние менеджеры не игнорировали емейлы от вас. А если нет, то и хедеры не помогут. Вывод — хедер — лишняя сущность.
А почему ты решил, что коммуникация L2 и менеджеров идет по емейлам? Я вроде пишу почти что противоположное.
P>>Зато при траблшутниге, если их L2 суппорт придет ко мне, мне достаточно кидануть им одну ссылку, что бы они были в курсе, как починить. ·>Придёт так же в октябре. В чём разница-то?
При траблшутинге они заинтересованы решать всё быстро тк они несут убыток, и все вопросы решаются буквально голосом. Соответственно, мне не надо напоминать "а видели ли вы емейлы от нас полгода назад?"
Вместо этого "давайте глянем ваши логи... Видите — варнинг такой, следовательно, вам надо обновить вашу конфигурацию"
И дальше они справляются без меня. Моя цель в том и состоит, что бы предоставлять инструмент решения проблем, а не влазить в каждое из решений.
Искать, где чьи логи, это одна из проблем. Проще отфутболить тому, на чьей стороне косяк, пость он видит проблему в своих логах и своем мониторинге.
Тогда ихние L2 смогут разобраться самостоятельно, и будут эскалировать не абы куда, а именно тем людям кто в данный момент может лучше разрулить.
P>>Для браузера в этом смысла не много, он всё равно ничего исправить не сможет. А вот в конкретном приложении на такой хидер можно навесить дополнительные капабилити, например, счетчик варнингов и тротлинг по мере роста, логирование на вызывающей стороне, И это всё без изменения кода сервисов. ·>Для этого не нужен хедер отправлять консьюмерам. Т.к. это всё навешивается у провайдера, а не у консьюмеров. Опять на ходу тему меняешь.
Тебе не нужно — ну не отправляй. Разве я тебя заставляю?
Здравствуйте, Pauel, Вы писали:
P>>>Тебе уже много раз рассказали. P>·>Рассказано текущее положение дел у вас, а не обоснование чем такое решение лучше, чем альтернативы. P>Ты альтернативу так и не показал, кроме "у нас есть рассылки" Рассылки сами все проблемы порешают?
Они решают проблемы как минимум не хуже, чем хедеры. А по некоторым параметрам — значительно лучше.
P>·>Под precondition я имею в виду идентификатор из твоего кода: Warning.assert(precondontion, 'unexpected input'). Тебя опять куда-то унесло в оффтопик. P>Ну вот. А где здесь та самая комбинация и как её узнать на момент тестирования?
Как минимум — ровно тем же способом, которым ты её узнал во время добавления кода для твоего хедера.
P>>>Например — контрольная сумма. Гыгы. Не сходится — с реквестом вероятно чтото не то. Логируем, выставляем варнинг и возвращаем респонс. P>·>Такую херню надо просто реджектить без вопросов. P>Теоретически. А вот практически этот вариант не всегда реализуем, т.к. всегда будут какие нибудь варнинги.
Почему-то у большинства нет такой практики... ибо плохая практика. Я вот не сталкивался с публичными API от каких-нибудь известных контор типа FAANG. А ты?
P>А теперь твой ход — покажи, как ты подобную багу будешь искать тестами.
Причём тут тестирование? Мы вроде о warning headers говорим?
Впрочем отвечу, intermittent failures мы искали постоянным прогоном тестов в тестовых окружениях. С random, конечно, проблем не припомню, но всякие race conditions, эффекты асинхронности, зависимость от текущего времени, переход летнее-зимнее время — ловили. Никаких warning хедеров ясен пень. assert не проходит — это фатальное исключение и падение теста.
Более того, хедер может работать в принципе только в одном частном случае, когда на один запрос ожидается ровно один ответ, что, впрочем, типично для REST. Как только появляется какой-нибудь stream, websocket или типа того, то это вообще никуда не годится. А иметь два разных механизма — это полный бардак.
P>·>Перечитай вопрос внимательно. Почему именно хедер? Например, пусть ваш мониторинг аггрится на ERROR в логах и шлёт емейлы кому положено, напрямую. Зачем эти промежуточные слои через rest, чужой мониторинг, чужой L2 и т.п.? P>Еще раз — емейл это крайне перегруженый канал. Слишком велик шанс что письмо тупо пропустят или прочитают слишком поздно.
Это не какой-то закон природы, а особенности вашей организации. Можно специальные адреса выделять для таких коммуникаций. Поручать определённым командам следить за анонсами. Ведь там не только изменения в API, а прочие другие события. Временные запланированные отключения, обновления сертификатов, адресов endpoints, каких-то настроек и т.п. Много важной информации может быть которую нельзя пропускать для обеспечения надёжного функционирования систем.
P>>>Например, потому что это самый простой и дешевый способ разграничить ответственность. Вкомитал вызов согласно этому АПИ — теперь отвечай сам за корректность запросов. P>·>Некорректные запросы надо просто реджектить. Давай другой пример. P>Пример тебе не нравится — это уже твои проблемы.
То что в хедер можно пихать всякую дичь никак не обосновывает необходимость хедера. Скорее наоборот.
P>>>Ага, в ответ на "escalate" прибегает архитектор, и говорит "делай хидер с варнингом, мне так приказали сверху, теперь всё апи будет таким." P>·>Т.е. у вас так принято, культ карго. Так бы сразу и сказал. P>Рашение административных проблем как правило занимает много времени, бывает даже годы, пока выработается и стабилизируется конкретный процесс. P>А решение нужно прямо сейчас.
Ух ты. А вы хедер послали — и все административные проблемы решились прямо сейчас. Прям чудо. Пошли, плиз, этот хедер в президентам разных стран, мир во всём мире настанет.
P>>>Ты так и не рассказал, как будет без хидера P>·>Сказал. После 0го шага идёт сразу 8й. P>Это детские отписки. Поскольку ты закладываешься на емейл, слишком велик шанс что прочитают с запозданием. И на этот случай у тебя решения как не было, так и нет.
Если проблема очень ограничена во времени, могу и в чат, и позвонить, и даже ногами дойти.
А хедер у вас лично CEO читает в реальном времени, и тут же указания раздаёт. Так что-ли?
P>>>Что бы они приняли действия на своей стороне по исправлению проблемы. P>·>Как это их обязует принимать действия? Почему они не могут предпринять те же действия, например, при получении емейла от вас? P>Ты, похоже, не читаешь. Емейл слишком ненадежный канал. При условии, что люди относятся к обязанностям добросовестно, емейл не дает никаких гарантий — срочная работа на выезде, воркшоп, командировка, отпуск, итд итд. Упс — прочитали, но неделю спустя. Еще момент — человек просто устал и пропустил тот самый емейл. P>А вот на звоночек в мониторинге реагируют очень быстро, и L2 суппорт в состоянии купировать большинство проблем.
L2 у нас и на емейлы реагирует. Работа у них такая. Бизнес и клиенты о своих проблемах емейлы шлют, в хедеры они не умеют.
P>>>В том то и дело, что мне и не надо это делать. Как только они вкомитали использование этого апи, теперь это их забота. Я могу гайдлайны подкинуть, типа "добавьте правило в мониторинг". Но контролировать свою сторону будут они сами. P>·>Так чтение емейлов тоже их забота. В чём разница? P>Ты усиленно игнорируешь всё, что я пишу про емейлы. Какой в этом смысл?
Ты проецируешь ваш бардак с коммуникационными каналами на всех. Я просто пытаюсь донести мысль, что ваша проблема с емейлами — это ваша проблема. Легко решаемая.
P>·>Да тоже самое. Оптимум — после 0го шага сразу 8й. Ну или 7й, может быть. Шаги 1-6 не нужны вообще. P>Ну вот был воркшоп, чтение емейлов перенесли на завтра. Упс. Что делать?
С таким же успехом перенесут и анализ хедеров. Что делать?
P>·>Если они могут обеспечить, что ихние менеджеры не игнорируют емейлы от L2, то они смогут обеспечить, чтобы ихние менеджеры не игнорировали емейлы от вас. А если нет, то и хедеры не помогут. Вывод — хедер — лишняя сущность. P>А почему ты решил, что коммуникация L2 и менеджеров идет по емейлам? Я вроде пишу почти что противоположное.
По хедерам что-ли идёт? Или к чему это всё возражение?
P>>>Зато при траблшутниге, если их L2 суппорт придет ко мне, мне достаточно кидануть им одну ссылку, что бы они были в курсе, как починить. P>·>Придёт так же в октябре. В чём разница-то? P>При траблшутинге они заинтересованы решать всё быстро тк они несут убыток, и все вопросы решаются буквально голосом. Соответственно, мне не надо напоминать "а видели ли вы емейлы от нас полгода назад?"
Ужас. Если доходит до траблшутинга, то дело уже плохо.
P>Вместо этого "давайте глянем ваши логи... Видите — варнинг такой, следовательно, вам надо обновить вашу конфигурацию"
Т.е. ваши хедеры проблему не решили, а допустили до прода. А проблему, в итоге, решает не хедер, а голос. Полный фейл.
P>И дальше они справляются без меня. Моя цель в том и состоит, что бы предоставлять инструмент решения проблем, а не влазить в каждое из решений.
С таким же успехом можно показать что угодно, и логи, и старые емейлы, и вики, и changelogs и т.п., у кого бы они ни были.
И вообще, сложно себе представить, чтобы я должен был разбираться как мне кому-то показывать "ваши логи", и это у тысяч косьюмеров.
P>Искать, где чьи логи, это одна из проблем. Проще отфутболить тому, на чьей стороне косяк, пость он видит проблему в своих логах и своем мониторинге.
Мне проще быстро скопипастить свои логи, т.к. я знаю где что и как искать. Разбираться в чужих логах? Как? Да и доступа у меня может не быть, и никакого контроля.
P>Тогда ихние L2 смогут разобраться самостоятельно, и будут эскалировать не абы куда, а именно тем людям кто в данный момент может лучше разрулить.
Т.е. они по хедерам смогут разобраться?! Скорее всего потребуют changelog или типа того, для описания сути изменений.
P>·>Для этого не нужен хедер отправлять консьюмерам. Т.к. это всё навешивается у провайдера, а не у консьюмеров. Опять на ходу тему меняешь. P>Тебе не нужно — ну не отправляй. Разве я тебя заставляю?
Никому не нужно. Если вам так хочется, то кто ж запретит. Ещё можете в бубен ударять, с таким же результатом. Всё равно будете голосом проблемы в проде решать.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[57]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Ты же как-то узнаёшь, что используется именно deprecated api...
В смысле "узнаю"? Ну да, я сам лично написал, что на моем сервере /api/v21 — deprecated. И если это API вызвали, оно используется.
·>Получается т.е. ты идентифицируешь deprecated клиентов по урлу или как-то иначе
Я вообще не идентифицирую клиентов. У меня даже понятия "deprecated клиент" нет. И я не знаю, чем и как клиент вызывает мой API — curl, ручной код, какая-то сгенерированная библиотека. Я идентифицирую deprecated API по той информации (данным запроса), которые посылаются всеми клиентами. Warning имеет семантику "Чувак, кто бы ты ни был! Пожалуйста, больше не делай так, как сделал сейчас. Это уже не модно. Пока что то, что ты сделал, работает. Но через какое-то время перестанет. И это будет твоя проблема!". Мне не нужно связывать запрос с чем-то еще для маршрутизации сообщений по альтернативному каналу. Использовал deprecated API — получил предупреждение прямо в заголовках ответа. Использовал modern API — не получил предупреждений. Если вдруг клиент использует оба API одновременно, то предупреждение он получит только на тех, которые deprecated. Потому что deprecated — свойство API а не клиента.
Re[61]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Ты альтернативу так и не показал, кроме "у нас есть рассылки" Рассылки сами все проблемы порешают? ·>Они решают проблемы как минимум не хуже, чем хедеры. А по некоторым параметрам — значительно лучше.
Ты так и не показал весь цикл решения проблем. Собственно, ты только повторяешь мантру "лучше иначе", "емейлы решают все проблемы"
P>>Ну вот. А где здесь та самая комбинация и как её узнать на момент тестирования? ·>Как минимум — ровно тем же способом, которым ты её узнал во время добавления кода для твоего хедера.
А я её и не знаю на момент добавления такого кода. В этом и цель — сделать так, что бы в логах появилась нужная мне инфа в тех случаях, которые недоступны в тестах.
P>>Теоретически. А вот практически этот вариант не всегда реализуем, т.к. всегда будут какие нибудь варнинги. ·>Почему-то у большинства нет такой практики... ибо плохая практика. Я вот не сталкивался с публичными API от каких-нибудь известных контор типа FAANG. А ты?
А что, все сводится к фаанг?
P>>А теперь твой ход — покажи, как ты подобную багу будешь искать тестами. ·>Причём тут тестирование? Мы вроде о warning headers говорим?
Не надо вилять — покажи как ты будешь ту самую комбинацию искать тестами. Ты же утверждаешь, что де все известно на момент написания кода. Вот и покажи это.
ты в очередной раз увиливаешь. assert это про варнинги, в т.ч. Сработал ассерт — можно/нужно рендерить варнинг.
·>Впрочем отвечу, intermittent failures мы искали постоянным прогоном тестов в тестовых окружениях.
И это не гарантирует нахождение ошибки, всего лишь повышает вероятность обнаружения.
> С random, конечно, проблем не припомню, но всякие race conditions, эффекты асинхронности, зависимость от текущего времени, переход летнее-зимнее время — ловили. Никаких warning хедеров ясен пень. assert не проходит — это фатальное исключение и падение теста.
Ассерт это далеко не всегда фатальное исключение. Иногда это просто странный кейс.
·>Более того, хедер может работать в принципе только в одном частном случае, когда на один запрос ожидается ровно один ответ, что, впрочем, типично для REST. Как только появляется какой-нибудь stream, websocket или типа того, то это вообще никуда не годится. А иметь два разных механизма — это полный бардак.
Это вариант нормы, на самом деле. Если уж у нас могут быть разные протоколы, то имеет смысл выделить варнинг в поле в энвелопе.
P>>Еще раз — емейл это крайне перегруженый канал. Слишком велик шанс что письмо тупо пропустят или прочитают слишком поздно. ·>Это не какой-то закон природы, а особенности вашей организации. Можно специальные адреса выделять для таких коммуникаций. Поручать определённым командам следить за анонсами. Ведь там не только изменения в API, а прочие другие события. Временные запланированные отключения, обновления сертификатов, адресов endpoints, каких-то настроек и т.п. Много важной информации может быть которую нельзя пропускать для обеспечения надёжного функционирования систем.
Ну да — городить огород. "слежение за анонсами" как правило трудно применить к конкретному коду — разработчики уже заняты чем то другим, а может и уволились, а команда эксплуатации не имеет глубоких знаний по внутренностям продукта.
P>>Пример тебе не нравится — это уже твои проблемы. ·>То что в хедер можно пихать всякую дичь никак не обосновывает необходимость хедера. Скорее наоборот.
Мы пока так и не узнали, какую альтернативу ты предлагаешь, кроме как спамить емейлами.
P>>Рашение административных проблем как правило занимает много времени, бывает даже годы, пока выработается и стабилизируется конкретный процесс. P>>А решение нужно прямо сейчас. ·>Ух ты. А вы хедер послали — и все административные проблемы решились прямо сейчас. Прям чудо. Пошли, плиз, этот хедер в президентам разных стран, мир во всём мире настанет.
Административные проблемы как были, так и остались. Зато хидер работает всегда, вне зависимости, читаешь ты емейлы или нет.
P>>Это детские отписки. Поскольку ты закладываешься на емейл, слишком велик шанс что прочитают с запозданием. И на этот случай у тебя решения как не было, так и нет. ·>Если проблема очень ограничена во времени, могу и в чат, и позвонить, и даже ногами дойти.
Как ты узнаешь, что мелкое изменение на твоей стороне будет супер-критичным для 1й из 100 команд?
Каким образом та команда узнает, что вон в той рассылке, что они пропустили неделю назад из за воркшопа, для них было чтото супер-критичное?
Даже если они увидели — они то не в курсе, на что ваш фикс вообще повлиять может.
·>А хедер у вас лично CEO читает в реальном времени, и тут же указания раздаёт. Так что-ли?
Ты адекватен? Я же тебе сказал, что это на раз прикручивается к мониторингу. Ты уже ударился в юродствование. Какой в этом смысл?
P>>А вот на звоночек в мониторинге реагируют очень быстро, и L2 суппорт в состоянии купировать большинство проблем. ·>L2 у нас и на емейлы реагирует. Работа у них такая. Бизнес и клиенты о своих проблемах емейлы шлют, в хедеры они не умеют.
У них та же проблема — емейлы слишком перегруженый канал. И это всегда устаревшая или искаженная инфа. А вот то, что происходит прямо сейчас всегда будет намного актуальнее.
P>>Ты усиленно игнорируешь всё, что я пишу про емейлы. Какой в этом смысл? ·>Ты проецируешь ваш бардак с коммуникационными каналами на всех. Я просто пытаюсь донести мысль, что ваша проблема с емейлами — это ваша проблема. Легко решаемая.
В той или иной степени эта проблема есть у большинства корпораций. Она административной природы и решить её одномоментно не выйдет. А раз так, то все завязаные на емейлы методы будут регулярно давать сбой.
P>>Ну вот был воркшоп, чтение емейлов перенесли на завтра. Упс. Что делать? ·>С таким же успехом перенесут и анализ хедеров. Что делать?
Мониторинг никогда никуда не переносится, за ним следят 24/7
P>>А почему ты решил, что коммуникация L2 и менеджеров идет по емейлам? Я вроде пишу почти что противоположное. ·>По хедерам что-ли идёт? Или к чему это всё возражение?
К тому, что ты игнорируешь проблемы емейлов. У тебя это магическая волшебная палочка.
P>>При траблшутинге они заинтересованы решать всё быстро тк они несут убыток, и все вопросы решаются буквально голосом. Соответственно, мне не надо напоминать "а видели ли вы емейлы от нас полгода назад?" ·>Ужас. Если доходит до траблшутинга, то дело уже плохо.
Я помню — ты умеешь писать без багов, и все проблемы находишь тестами.
P>>Вместо этого "давайте глянем ваши логи... Видите — варнинг такой, следовательно, вам надо обновить вашу конфигурацию" ·>Т.е. ваши хедеры проблему не решили, а допустили до прода. А проблему, в итоге, решает не хедер, а голос. Полный фейл.
Ты похоже забыл, о чем речь — проблема изначально на вызывающей стороне которая возможно была задеплоена год назад.
Давать всем отлуп после деплоя нового сервиса идея так себе — всё, что работало, должно продолжить работать.
P>>Искать, где чьи логи, это одна из проблем. Проще отфутболить тому, на чьей стороне косяк, пость он видит проблему в своих логах и своем мониторинге. ·>Мне проще быстро скопипастить свои логи, т.к. я знаю где что и как искать. Разбираться в чужих логах? Как? Да и доступа у меня может не быть, и никакого контроля.
Какие свои логи? У вас что, девелоперы имеют доступ к логам на проде? Девелопер имеет доступ к логам только через L2 в момент траблшутинга.
И постучится тебе не ваш L2, а тот, с клиентской стороны. А если им это не надо, то нет смысла приседать.
P>>Тогда ихние L2 смогут разобраться самостоятельно, и будут эскалировать не абы куда, а именно тем людям кто в данный момент может лучше разрулить. ·>Т.е. они по хедерам смогут разобраться?! Скорее всего потребуют changelog или типа того, для описания сути изменений.
Разумеется. Раз уж подобный хидер это внутренний стандарт, то L2 точно в курсе дел. Вообще, в хидеры помещается много инфы именно для помощи L2.
Re[58]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, maxkar, Вы писали:
M>·>Ты же как-то узнаёшь, что используется именно deprecated api... M>В смысле "узнаю"? Ну да, я сам лично написал, что на моем сервере /api/v21 — deprecated. И если это API вызвали, оно используется.
Т.е. идентифицируешь клиента по суффиксу в урле. в чём возражение-то?
M>·>Получается т.е. ты идентифицируешь deprecated клиентов по урлу или как-то иначе M>Я вообще не идентифицирую клиентов. У меня даже понятия "deprecated клиент" нет. И я не знаю, чем и как клиент вызывает мой API — curl, ручной код, какая-то сгенерированная библиотека. Я идентифицирую deprecated API по той информации (данным запроса), которые посылаются всеми клиентами.
Ну я наверно терминологию неудачно выбрал. Под идентификацией клиента я подразумевал как различать приходящие API запросы и классифицировать их на "хорошие" и "плохие".
M>Warning имеет семантику "Чувак, кто бы ты ни был! Пожалуйста, больше не делай так, как сделал сейчас. Это уже не модно. Пока что то, что ты сделал, работает. Но через какое-то время перестанет. И это будет твоя проблема!". Мне не нужно связывать запрос с чем-то еще для маршрутизации сообщений по альтернативному каналу. Использовал deprecated API — получил предупреждение прямо в заголовках ответа. Использовал modern API — не получил предупреждений. Если вдруг клиент использует оба API одновременно, то предупреждение он получит только на тех, которые deprecated. Потому что deprecated — свойство API а не клиента.
Так в этом-то и беда. Отправка warning ничего нового не даёт. И тебе всё равно придётся связаться с девелоперами и узнать когда они таки перестанут использовать deprecated, если требуется обеспечить надёжное функционирование всей системы. А если обеспечение надёжности не твоя забота, то и узнавать ничего не нужно, и варнинги не нужны. Отрубаешь deprecated и они сами придут и спросят.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[62]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>·>Они решают проблемы как минимум не хуже, чем хедеры. А по некоторым параметрам — значительно лучше. P>Ты так и не показал весь цикл решения проблем. Собственно, ты только повторяешь мантру "лучше иначе", "емейлы решают все проблемы"
Показал на основе твоих показаний. Я подытожил, что в твоём цикле 8 шагов. Я объяснил, что большинство из этих шагов просто лишние, их можно просто выбросить.
P>>>Ну вот. А где здесь та самая комбинация и как её узнать на момент тестирования? P>·>Как минимум — ровно тем же способом, которым ты её узнал во время добавления кода для твоего хедера. P>А я её и не знаю на момент добавления такого кода. В этом и цель — сделать так, что бы
Что же твой код делает? Монетку подбрасывает?
P> в логах появилась нужная мне инфа в тех случаях, которые недоступны в тестах.
Вот именно. Если ты плохо понимаешь поведение твоего кода, то добавляешь _логи_, чтобы их потом анализировать и изучать поведение _твоего_ кода. И это твоя проблема и забота. Зачем это передавать куда-то по хедерам наружу?
P>>>Теоретически. А вот практически этот вариант не всегда реализуем, т.к. всегда будут какие нибудь варнинги. P>·>Почему-то у большинства нет такой практики... ибо плохая практика. Я вот не сталкивался с публичными API от каких-нибудь известных контор типа FAANG. А ты? P>А что, все сводится к фаанг?
Ну не фаанг. Давай ссылку на любую уважаемую тобой известную контору с таким API.
P>>>А теперь твой ход — покажи, как ты подобную багу будешь искать тестами. P>·>Причём тут тестирование? Мы вроде о warning headers говорим? P>Не надо вилять — покажи как ты будешь ту самую комбинацию искать тестами. Ты же утверждаешь, что де все известно на момент написания кода. Вот и покажи это.
Ты вначале покажи как ты будешь искать "ту самую" комбинацию хедерами.
P>ты в очередной раз увиливаешь. assert это про варнинги, в т.ч. Сработал ассерт — можно/нужно рендерить варнинг. if(!precondition) LOGGER.warn("Hm... Please check that!!"); это ассерт или лог?
P>·>Впрочем отвечу, intermittent failures мы искали постоянным прогоном тестов в тестовых окружениях. P>И это не гарантирует нахождение ошибки, всего лишь повышает вероятность обнаружения.
А что _гарантирует_ нахождение ошибки? Неужели хедер?!
>> С random, конечно, проблем не припомню, но всякие race conditions, эффекты асинхронности, зависимость от текущего времени, переход летнее-зимнее время — ловили. Никаких warning хедеров ясен пень. assert не проходит — это фатальное исключение и падение теста. P>Ассерт это далеко не всегда фатальное исключение. Иногда это просто странный кейс.
По крайней мере в c++/java/c#/python — всегда. Даже не припомню где это не так.
P>·>Более того, хедер может работать в принципе только в одном частном случае, когда на один запрос ожидается ровно один ответ, что, впрочем, типично для REST. Как только появляется какой-нибудь stream, websocket или типа того, то это вообще никуда не годится. А иметь два разных механизма — это полный бардак. P>Это вариант нормы, на самом деле. Если уж у нас могут быть разные протоколы, то имеет смысл выделить варнинг в поле
Нет, не имеет.
P> в энвелопе.
Причём тут где? Проблема в том, что не совсем неясно как сопоставить варнинг в исходящем сообщении с тем, что же собственно не понравилось в действиях консьюмера, т.к чёткой пары реквест-респонз просто может не быть.
Может быть "плохой" и совокупность нескольких запросов, и, даже, отсутствия неких нужных запросов. В какие хедеры пихать такие варнинги совсем неясно.
P>>>Еще раз — емейл это крайне перегруженый канал. Слишком велик шанс что письмо тупо пропустят или прочитают слишком поздно. P>·>Это не какой-то закон природы, а особенности вашей организации. Можно специальные адреса выделять для таких коммуникаций. Поручать определённым командам следить за анонсами. Ведь там не только изменения в API, а прочие другие события. Временные запланированные отключения, обновления сертификатов, адресов endpoints, каких-то настроек и т.п. Много важной информации может быть которую нельзя пропускать для обеспечения надёжного функционирования систем. P>Ну да — городить огород. "слежение за анонсами" как правило трудно применить к конкретному коду — разработчики уже заняты чем то другим, а может и уволились,
Т.е. то что вы пишете корявые анонсы гарантирует, что вы сделаете идеальные хедеры. Так что-ли?
P>а команда эксплуатации не имеет глубоких знаний по внутренностям продукта.
Ага. Увидела команда эксплуатации "X-Warning: unexpected input" хедер и так всё сразу ясно стало.
P>>>Пример тебе не нравится — это уже твои проблемы. P>·>То что в хедер можно пихать всякую дичь никак не обосновывает необходимость хедера. Скорее наоборот. P>Мы пока так и не узнали, какую альтернативу ты предлагаешь, кроме как спамить емейлами.
Не спамить хедерами.
P>>>Рашение административных проблем как правило занимает много времени, бывает даже годы, пока выработается и стабилизируется конкретный процесс. P>>>А решение нужно прямо сейчас. P>·>Ух ты. А вы хедер послали — и все административные проблемы решились прямо сейчас. Прям чудо. Пошли, плиз, этот хедер в президентам разных стран, мир во всём мире настанет. P>Административные проблемы как были, так и остались. Зато хидер работает всегда, вне зависимости, читаешь ты емейлы или нет.
Емейлы тоже работают всегда, вне зависимости читаешь ты их или нет.
P>>>Это детские отписки. Поскольку ты закладываешься на емейл, слишком велик шанс что прочитают с запозданием. И на этот случай у тебя решения как не было, так и нет. P>·>Если проблема очень ограничена во времени, могу и в чат, и позвонить, и даже ногами дойти. P>Как ты узнаешь, что мелкое изменение на твоей стороне будет супер-критичным для 1й из 100 команд?
По нашим логам/мониторингу/етс. Это наша обязанность делать impact analysis.
P>Каким образом та команда узнает, что вон в той рассылке, что они пропустили неделю назад из за воркшопа, для них было чтото супер-критичное? P>Даже если они увидели — они то не в курсе, на что ваш фикс вообще повлиять может.
Наша обязанность. Если мы "пропустили", то это наш факап и наш мониторинг должен сработать и мы должны фиксить срочно.
P>·>А хедер у вас лично CEO читает в реальном времени, и тут же указания раздаёт. Так что-ли? P>Ты адекватен? Я же тебе сказал, что это на раз прикручивается к мониторингу. Ты уже ударился в юродствование. Какой в этом смысл?
Непонятно в чём заслуга хедеров-то? Чем с технической т.з. мониторинг хедеров отличается от мониторинга логов или даже емейлов?
P>>>А вот на звоночек в мониторинге реагируют очень быстро, и L2 суппорт в состоянии купировать большинство проблем. P>·>L2 у нас и на емейлы реагирует. Работа у них такая. Бизнес и клиенты о своих проблемах емейлы шлют, в хедеры они не умеют. P>У них та же проблема — емейлы слишком перегруженый канал. И это всегда устаревшая или искаженная инфа.
Это закон природы такой что-ли? Можно разные адреса заводить, можно тикеты в джире. В конце концов мониторинг может технически и по smpt ходить и на дашборд варнинги выкидывать.
P>А вот то, что происходит прямо сейчас всегда будет намного актуальнее.
Если что-то происходит в проде, то это уже эпик фейл.
P>>>Ты усиленно игнорируешь всё, что я пишу про емейлы. Какой в этом смысл? P>·>Ты проецируешь ваш бардак с коммуникационными каналами на всех. Я просто пытаюсь донести мысль, что ваша проблема с емейлами — это ваша проблема. Легко решаемая. P>В той или иной степени эта проблема есть у большинства корпораций. Она административной природы и решить её одномоментно не выйдет. А раз так, то все завязаные на емейлы методы будут регулярно давать сбой.
Да, об этом я и говорю. Проблема административная, и техническими средствами не решается. Хедер — техническое средство.
P>>>Ну вот был воркшоп, чтение емейлов перенесли на завтра. Упс. Что делать? P>·>С таким же успехом перенесут и анализ хедеров. Что делать? P>Мониторинг никогда никуда не переносится, за ним следят 24/7
А что мешает следить за емейлами 24/7? Более того, следить за системой мониторинга надо квалифицированных спецов сажать. А за аутлук можно хоть школьника посадить.
P>>>А почему ты решил, что коммуникация L2 и менеджеров идет по емейлам? Я вроде пишу почти что противоположное. P>·>По хедерам что-ли идёт? Или к чему это всё возражение? P>К тому, что ты игнорируешь проблемы емейлов. У тебя это магическая волшебная палочка.
ты игнорируешь проблемы хедеров. У тебя это магическая волшебная палочка.
Технически емейл от хедера в данном отличается лишь протоколом, smtp vs http. У хедеров ровно те же административные проблемы.
И емейл это не единственная альтернатива, я называл и другие.
P>>>При траблшутинге они заинтересованы решать всё быстро тк они несут убыток, и все вопросы решаются буквально голосом. Соответственно, мне не надо напоминать "а видели ли вы емейлы от нас полгода назад?" P>·>Ужас. Если доходит до траблшутинга, то дело уже плохо. P>Я помню — ты умеешь писать без багов, и все проблемы находишь тестами.
Да, ты — круче! Все проблемы находишь хедером.
P>>>Вместо этого "давайте глянем ваши логи... Видите — варнинг такой, следовательно, вам надо обновить вашу конфигурацию" P>·>Т.е. ваши хедеры проблему не решили, а допустили до прода. А проблему, в итоге, решает не хедер, а голос. Полный фейл. P>Ты похоже забыл, о чем речь — проблема изначально на вызывающей стороне которая возможно была задеплоена год назад.
Я не забыл, это ты запутался с своей софистике. Речь была "решать всё быстро тк они несут убыток". Несут убыток — это значит проблема в проде, что-то отвалилось. Или у вас ваш варнинг-хедер платный?
P>>>Искать, где чьи логи, это одна из проблем. Проще отфутболить тому, на чьей стороне косяк, пость он видит проблему в своих логах и своем мониторинге. P>·>Мне проще быстро скопипастить свои логи, т.к. я знаю где что и как искать. Разбираться в чужих логах? Как? Да и доступа у меня может не быть, и никакого контроля. P> Какие свои логи?
Я имею в виду логи на нашей стороне. К логам консьюмера часто доступа нет вообще, никакого. И как им что-то указать в их логах — я даже не представляю. Где они, в каком формате, кто имеет доступ? Да хз! Они вообще их могут сломать или потерять. А нам пофиг, у нас свои логи есть и мы им всё можем на блюдечке с каёмочкий показать и цветами нужные места разукрасить.
P> У вас что, девелоперы имеют доступ к логам на проде?
Это уже L3. Обычно логи консьюмерам выдаст команда L2.
P>Девелопер имеет доступ к логам только через L2 в момент траблшутинга. P>И постучится тебе не ваш L2, а тот, с клиентской стороны. А если им это не надо, то нет смысла приседать.
Клиенты стучатся к L1-L2. И если совсем всё плохо, то L2 стучится ко мне, если я на L3.
P>>>Тогда ихние L2 смогут разобраться самостоятельно, и будут эскалировать не абы куда, а именно тем людям кто в данный момент может лучше разрулить. P>·>Т.е. они по хедерам смогут разобраться?! Скорее всего потребуют changelog или типа того, для описания сути изменений. P>Разумеется. Раз уж подобный хидер это внутренний стандарт, то L2 точно в курсе дел. Вообще, в хидеры помещается много инфы именно для помощи L2.
Ты ловко жонглируешь условиями. Ты уж определись. То у тебя внутренний стандарт, то у тебя тысячи внешних консьюмеров.
Впрочем, опять не аргумент. Ничто не мешает емейл-рассылку или джиру или ещё чего сделать внутренним стандартом. В чём преимущество хедера-то?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[63]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>·>Они решают проблемы как минимум не хуже, чем хедеры. А по некоторым параметрам — значительно лучше. P>>Ты так и не показал весь цикл решения проблем. Собственно, ты только повторяешь мантру "лучше иначе", "емейлы решают все проблемы" ·>Показал на основе твоих показаний. Я подытожил, что в твоём цикле 8 шагов. Я объяснил, что большинство из этих шагов просто лишние, их можно просто выбросить.
Ты заменил их на емейлы, которые ненадежны по своей природе. То есть, надо ждать регулярных фейлов.
P>>А я её и не знаю на момент добавления такого кода. В этом и цель — сделать так, что бы ·>Что же твой код делает? Монетку подбрасывает?
Это уже не важно. Главное, что ассерты и тесты это немного разные классы задач, которые всего лишь пересекаются.
P>> в логах появилась нужная мне инфа в тех случаях, которые недоступны в тестах. ·>Вот именно. Если ты плохо понимаешь поведение твоего кода, то добавляешь _логи_, чтобы их потом анализировать и изучать поведение _твоего_ кода. И это твоя проблема и забота.
Неверно. Речь о проблемах во входных данных. Ровно как с компилятором — подкидываешь ему код, а он кидает тебе результат + варнинги.
Варнинги это информация о качестве результата, нужна вызывающей стороне в первую очередь.
> Зачем это передавать куда-то по хедерам наружу?
Затем, что во время процессинга возникли варнинги и вызывающей стороне хорошо бы быть в курсе дел.
P>>Не надо вилять — покажи как ты будешь ту самую комбинацию искать тестами. Ты же утверждаешь, что де все известно на момент написания кода. Вот и покажи это. ·>Ты вначале покажи как ты будешь искать "ту самую" комбинацию хедерами.
Не стоит валять дурака — здесь была речь о том, что ты не в курсе ассертов. И я показал как это искать ассертами.
P>>ты в очередной раз увиливаешь. assert это про варнинги, в т.ч. Сработал ассерт — можно/нужно рендерить варнинг. ·>if(!precondition) LOGGER.warn("Hm... Please check that!!"); это ассерт или лог?
Ассерт это это if + log.
P>>И это не гарантирует нахождение ошибки, всего лишь повышает вероятность обнаружения. ·>А что _гарантирует_ нахождение ошибки? Неужели хедер?!
Ассерты при правильном применении детектят определенные классы проблем, которые не обнаруживаются тестами.
P>>Ассерт это далеко не всегда фатальное исключение. Иногда это просто странный кейс. ·>По крайней мере в c++/java/c#/python — всегда. Даже не припомню где это не так.
Ты извини, но это снова про твой кругозор.
·>Может быть "плохой" и совокупность нескольких запросов, и, даже, отсутствия неких нужных запросов. В какие хедеры пихать такие варнинги совсем неясно.
Да тебе похоже ясно только как емейлы слать, которые не то читают, не то нет
P>>Ну да — городить огород. "слежение за анонсами" как правило трудно применить к конкретному коду — разработчики уже заняты чем то другим, а может и уволились, ·>Т.е. то что вы пишете корявые анонсы гарантирует, что вы сделаете идеальные хедеры. Так что-ли?
Цитирую себя:
"разработчики уже заняты чем то другим, а может и уволились"
Т.е. все ложится на команду эксплуатации. Им что, следить за всеми анонсами всех сервисов? Эдак придется штат раз в десять раздуть.
P>>а команда эксплуатации не имеет глубоких знаний по внутренностям продукта. ·>Ага. Увидела команда эксплуатации "X-Warning: unexpected input" хедер и так всё сразу ясно стало.
Ну вот в компиляторе ты часто видишь подобные варнинги?
P>>Мы пока так и не узнали, какую альтернативу ты предлагаешь, кроме как спамить емейлами. ·>Не спамить хедерами.
Не ясно, что конкретно ты предлагаешь, какой флоу и что делать, если емейл опоздал, затерялся, итд
P>>Административные проблемы как были, так и остались. Зато хидер работает всегда, вне зависимости, читаешь ты емейлы или нет. ·>Емейлы тоже работают всегда, вне зависимости читаешь ты их или нет.
В том то и дело, что емейлы работают только если
1 если их читают все кому нужно
2 вовремя
3 и после чтения емейла точно известны последствия конкретно в твоем продукте
Если п1 еще можно как то гарантировать, то 2 случается не так уж часто, а 3 это вообще какая то магия.
P>>Как ты узнаешь, что мелкое изменение на твоей стороне будет супер-критичным для 1й из 100 команд? ·>По нашим логам/мониторингу/етс. Это наша обязанность делать impact analysis.
Правильно понимаю, для этого вы анализируете код всех 100...1000 консумеров доступа к которому у вас нет?
Ну вот консумер ждет единственную страницу, а вы ему кидаете только первую страницу. Раньше то была одна, но теперь вы взяли другой квери-процессор и результатов стало больше.
Каким образом анализируя ваши логи/мониторинг вы узнаете, что у него случится denial of service ?
P>>Даже если они увидели — они то не в курсе, на что ваш фикс вообще повлиять может. ·>Наша обязанность. Если мы "пропустили", то это наш факап и наш мониторинг должен сработать и мы должны фиксить срочно.
Что фиксить? Проблема на вызывающей стороне, у них ожидания не соответствуют вашему апи. Начнешь перепиливать апи, что бы угодить всем?
P>>Ты адекватен? Я же тебе сказал, что это на раз прикручивается к мониторингу. Ты уже ударился в юродствование. Какой в этом смысл? ·>Непонятно в чём заслуга хедеров-то? Чем с технической т.з. мониторинг хедеров отличается от мониторинга логов или даже емейлов?
Технически — ничем. Главное, что бы ихний мониторинг сработал. Варнинг — это дополнительная фича АПИ, когда мы передаем информацию о качестве результата.
Если у нас нет такого поля в пейлоаде, что чаще всего и будет, то единственный вариант для хттп это хидер.
·>Это закон природы такой что-ли? Можно разные адреса заводить, можно тикеты в джире. В конце концов мониторинг может технически и по smpt ходить и на дашборд варнинги выкидывать.
Предлагаешь на миллион запросов создавать миллион тикетов в джыре? Или писать AI который будет фильтровать, тот ли это баг или не тот?
P>>А вот то, что происходит прямо сейчас всегда будет намного актуальнее. ·>Если что-то происходит в проде, то это уже эпик фейл.
ну да, ты то без багов пишешь, я помню — у тебя баги на прод не попадают.
P>>В той или иной степени эта проблема есть у большинства корпораций. Она административной природы и решить её одномоментно не выйдет. А раз так, то все завязаные на емейлы методы будут регулярно давать сбой. ·>Да, об этом я и говорю. Проблема административная, и техническими средствами не решается. Хедер — техническое средство.
Успокойся — все административные проблемы так или иначе решаются техническими средствами. Например, ты скажешь использовать рассылку. Упс — рассылка это техническое средство.
Единственное, что делает менеджмент, это принятие решений, как именно будет решаться та, или иная проблема. Скажет решать емейлами — будет решаться емейлами.
Скажет, что чрез транспорт реквеста — будет решаться через хидеры.
И вот у решения с хидерами есть куча преимуществ перед емейлом — а именно, человеческий фактор исключается почти полностью. Остаётся только кейс злонамеренного игнорирования.
P>>Мониторинг никогда никуда не переносится, за ним следят 24/7 ·>А что мешает следить за емейлами 24/7? Более того, следить за системой мониторинга надо квалифицированных спецов сажать. А за аутлук можно хоть школьника посадить.
Я ж тебе пример привел — продуктовую команду разогнали, и остался только L2, который один на все сервисы. Ну прочитали они, что какой то компонент пофиксал баг в парсере адреса. Дальше что, как им понять, на какие из 100...1000 проектов на проде это повлияет?
·>Технически емейл от хедера в данном отличается лишь протоколом, smtp vs http. У хедеров ровно те же административные проблемы.
Не только. хедер лежит вместе с респонзом, request-id и прочими вещами, не надо никаких приседаний, что бы начать инвестигейт.
·>Я не забыл, это ты запутался с своей софистике. Речь была "решать всё быстро тк они несут убыток". Несут убыток — это значит проблема в проде, что-то отвалилось. Или у вас ваш варнинг-хедер платный?
Проблема на их части продакшна, что очевидно. Вот и нужно максимально быстро сигнализировать именно на той части.
·>Я имею в виду логи на нашей стороне. К логам консьюмера часто доступа нет вообще, никакого. И как им что-то указать в их логах — я даже не представляю.
Вот-вот. Ты то хвастался, что impact analysis делаешь, а однако никаких средств у тебя на то нет
> Где они, в каком формате, кто имеет доступ? Да хз! Они вообще их могут сломать или потерять. А нам пофиг, у нас свои логи есть и мы им всё можем на блюдечке с каёмочкий показать и цветами нужные места разукрасить.
Твои логи никто не отменял, и changelog никто не отменял.
·>Впрочем, опять не аргумент. Ничто не мешает емейл-рассылку или джиру или ещё чего сделать внутренним стандартом. В чём преимущество хедера-то?
Емейл как стандарт работает плохо — майлбоксы у ключевых людей как правило переполнены. Джира получше, только создавать тикет надо не в твоей джире, а на той стороне, куда у тебя доступа нет
Здравствуйте, Pauel, Вы писали:
P>>>Ты так и не показал весь цикл решения проблем. Собственно, ты только повторяешь мантру "лучше иначе", "емейлы решают все проблемы" P>·>Показал на основе твоих показаний. Я подытожил, что в твоём цикле 8 шагов. Я объяснил, что большинство из этих шагов просто лишние, их можно просто выбросить. P>Ты заменил их на емейлы, которые ненадежны по своей природе. То есть, надо ждать регулярных фейлов.
Я не заменил, а предложил использовать тот же коммуникационный механизм, который у тебя уже существует на 7-8 шагах. Емейл — это лишь наиболее частый случай.
P>>>А я её и не знаю на момент добавления такого кода. В этом и цель — сделать так, что бы P>·>Что же твой код делает? Монетку подбрасывает? P>Это уже не важно. Главное, что ассерты и тесты это немного разные классы задач, которые всего лишь пересекаются.
Важно для того чтобы "в логах появилась нужная мне инфа".
P>>> в логах появилась нужная мне инфа в тех случаях, которые недоступны в тестах. P>·>Вот именно. Если ты плохо понимаешь поведение твоего кода, то добавляешь _логи_, чтобы их потом анализировать и изучать поведение _твоего_ кода. И это твоя проблема и забота. P>Неверно. Речь о проблемах во входных данных. Ровно как с компилятором — подкидываешь ему код, а он кидает тебе результат + варнинги.
Это плохая аналогия. Ибо с компилятором нет административной проблемы, которую мы обсуждаем. Ни мониторинга нет, ни логов, ни L2. И компилятор — это не API, а UI. С компилятором взаимодействует не Appllication, а человек.
>> Зачем это передавать куда-то по хедерам наружу? P>Затем, что во время процессинга возникли варнинги и вызывающей стороне хорошо бы быть в курсе дел.
Ну максимум для дебага, девелопинга. Что в проде никак не применимо.
P>>>Не надо вилять — покажи как ты будешь ту самую комбинацию искать тестами. Ты же утверждаешь, что де все известно на момент написания кода. Вот и покажи это. P>·>Ты вначале покажи как ты будешь искать "ту самую" комбинацию хедерами. P>Не стоит валять дурака — здесь была речь о том, что ты не в курсе ассертов. И я показал как это искать ассертами.
Я не просил рассказывать ничего про ассерты. И в чём я в курсе или нет, ты не знаешь. Разговор идёт про хедер.
P>>>ты в очередной раз увиливаешь. assert это про варнинги, в т.ч. Сработал ассерт — можно/нужно рендерить варнинг. P>·>if(!precondition) LOGGER.warn("Hm... Please check that!!"); это ассерт или лог? P>Ассерт это это if + log.
Хм, интересное определение. а если if + LOG.info или if + LOG.trace — это тоже ассерт? А вот такой код: if(condition){LOG.info("X"); doX();} else {LOG.warn("Y"); doY();}? Это лог или уже ассерт?!
P>>>И это не гарантирует нахождение ошибки, всего лишь повышает вероятность обнаружения. P>·>А что _гарантирует_ нахождение ошибки? Неужели хедер?! P>Ассерты при правильном применении детектят определенные классы проблем, которые не обнаруживаются тестами.
Круто, конечно. Но я тебя спрашивал о хедере.
P>>>Ассерт это далеко не всегда фатальное исключение. Иногда это просто странный кейс. P>·>По крайней мере в c++/java/c#/python — всегда. Даже не припомню где это не так. P>Ты извини, но это снова про твой кругозор.
Это не мой кругозор, а очередное твоё уникальное понимание терминологии. Вот общепринятое понятие:
an assertion failure – the program considers itself to be broken and typically deliberately crashes or throws an assertion failure exception.
P>·>Может быть "плохой" и совокупность нескольких запросов, и, даже, отсутствия неких нужных запросов. В какие хедеры пихать такие варнинги совсем неясно. P>Да тебе похоже ясно только как емейлы слать, которые не то читают, не то нет
Не только емейлы, а только не хедеры. Перечитай что ещё обсуждалось, если с памятью проблемы.
P>>>Ну да — городить огород. "слежение за анонсами" как правило трудно применить к конкретному коду — разработчики уже заняты чем то другим, а может и уволились, P>·>Т.е. то что вы пишете корявые анонсы гарантирует, что вы сделаете идеальные хедеры. Так что-ли? P>Цитирую себя: P>"разработчики уже заняты чем то другим, а может и уволились"
И что? Кто полезет в код, чтобы разобраться что означает данный хедер и его значение? Тоже команда эксплуатации?!
P>Т.е. все ложится на команду эксплуатации. Им что, следить за всеми анонсами всех сервисов? Эдак придется штат раз в десять раздуть.
За анонсами, ясен пень, следить надо. Примеров других анонсов, не относящихся к deprectated я уже приводил несколько.
P>>>а команда эксплуатации не имеет глубоких знаний по внутренностям продукта. P>·>Ага. Увидела команда эксплуатации "X-Warning: unexpected input" хедер и так всё сразу ясно стало. P> Ну вот в компиляторе ты часто видишь подобные варнинги?
Я в компиляторе хедеров не видел вообще. А подобный варнинг основан на твоих словах, так что если он тебя чем-то не устраивает, копайся в своём мониторинге твоих слов. Да и maxkar приводил пример "W321, W123". Всё кристально ясно же, да?
P>>>Мы пока так и не узнали, какую альтернативу ты предлагаешь, кроме как спамить емейлами. P>·>Не спамить хедерами. P>Не ясно, что конкретно ты предлагаешь, какой флоу и что делать, если емейл опоздал, затерялся, итд
Емейл — это сообщение. Попробуй поизучать вопросы как организовывать надёжную коммуникацию в системах обмена сообщениями.
P>>>Административные проблемы как были, так и остались. Зато хидер работает всегда, вне зависимости, читаешь ты емейлы или нет. P>·>Емейлы тоже работают всегда, вне зависимости читаешь ты их или нет. P>В том то и дело, что емейлы работают только если P>1 если их читают все кому нужно P>2 вовремя P>3 и после чтения емейла точно известны последствия конкретно в твоем продукте
В том то и дело, что хедеры работают только если
1 если их читают все кому нужно
2 вовремя
3 и после чтения хедера точно известны последствия конкретно в твоем продукте
P>Если п1 еще можно как то гарантировать, то 2 случается не так уж часто, а 3 это вообще какая то магия.
А с хедерами п1 даже невозможно гарантировать.
P>>>Как ты узнаешь, что мелкое изменение на твоей стороне будет супер-критичным для 1й из 100 команд? P>·>По нашим логам/мониторингу/етс. Это наша обязанность делать impact analysis. P> Правильно понимаю, для этого вы анализируете код всех 100...1000 консумеров доступа к которому у вас нет?
Мы анализируем свои логи и видим какие к нам приходят запросы. Если мы хотим что-то поменять в логике обработки этих запросов, мы исследуем импакт для всех вариаций реальных запросов.
P>Ну вот консумер ждет единственную страницу, а вы ему кидаете только первую страницу. Раньше то была одна, но теперь вы взяли другой квери-процессор и результатов стало больше. P>Каким образом анализируя ваши логи/мониторинг вы узнаете, что у него случится denial of service ?
Я не понял сценарий. Расскажи детальнее, может с каким-нибудь внятным примером.
P>>>Даже если они увидели — они то не в курсе, на что ваш фикс вообще повлиять может. P>·>Наша обязанность. Если мы "пропустили", то это наш факап и наш мониторинг должен сработать и мы должны фиксить срочно. P>Что фиксить? Проблема на вызывающей стороне, у них ожидания не соответствуют вашему апи. Начнешь перепиливать апи, что бы угодить всем?
твой хедер можно послать только на основе запроса. Если мы упустили какой-то precondition по структуре запроса и стали возвращать неожиданный результат, то это наша проблема, нам и фиксить.
P>>>Ты адекватен? Я же тебе сказал, что это на раз прикручивается к мониторингу. Ты уже ударился в юродствование. Какой в этом смысл? P>·>Непонятно в чём заслуга хедеров-то? Чем с технической т.з. мониторинг хедеров отличается от мониторинга логов или даже емейлов? P>Технически — ничем. Главное, что бы ихний мониторинг сработал. Варнинг — это дополнительная фича АПИ, когда мы передаем информацию о качестве результата.
Нет. Мы выяснили, что главное, чтобы не мониторинг сработал (это лишь средство), а чтобы они предприняли некие действия и изменили их код (а вот это цель).
P>·>Это закон природы такой что-ли? Можно разные адреса заводить, можно тикеты в джире. В конце концов мониторинг может технически и по smpt ходить и на дашборд варнинги выкидывать. P>Предлагаешь на миллион запросов создавать миллион тикетов в джыре? Или писать AI который будет фильтровать, тот ли это баг или не тот?
Так в этом и суть, что не надо посылать миллион. Надо послать ровно один. А вот хедеров посылается миллион.
P>>>А вот то, что происходит прямо сейчас всегда будет намного актуальнее. P>·>Если что-то происходит в проде, то это уже эпик фейл. P>ну да, ты то без багов пишешь, я помню — у тебя баги на прод не попадают.
Да, попадают. И да, это эпик фейл.
P>>>В той или иной степени эта проблема есть у большинства корпораций. Она административной природы и решить её одномоментно не выйдет. А раз так, то все завязаные на емейлы методы будут регулярно давать сбой. P>·>Да, об этом я и говорю. Проблема административная, и техническими средствами не решается. Хедер — техническое средство. P>Успокойся — все административные проблемы так или иначе решаются техническими средствами. Например, ты скажешь использовать рассылку. Упс — рассылка это техническое средство.
Верно. Но технические средства нужно выбирать адекватно. Выбирать между одним емейлом (джирой, етс) и хедером в миллионах респонзов — надо на основе технических параметров. А вы выбрали лишь потому что у вас так принято, а с емейлами справиться не смогли, из-за административных проблем.
P>Единственное, что делает менеджмент, это принятие решений, как именно будет решаться та, или иная проблема. Скажет решать емейлами — будет решаться емейлами. P>Скажет, что чрез транспорт реквеста — будет решаться через хидеры.
Т.е. у вас менеджемент решает технические вопросы? Мде. Тогда ясно.
P>И вот у решения с хидерами есть куча преимуществ перед емейлом — а именно, человеческий фактор исключается почти полностью. Остаётся только кейс злонамеренного игнорирования.
Он не исключается. 7-8 шаги те же самые.
P>>>Мониторинг никогда никуда не переносится, за ним следят 24/7 P>·>А что мешает следить за емейлами 24/7? Более того, следить за системой мониторинга надо квалифицированных спецов сажать. А за аутлук можно хоть школьника посадить. P>Я ж тебе пример привел — продуктовую команду разогнали, и остался только L2, который один на все сервисы. Ну прочитали они, что какой то компонент пофиксал баг в парсере адреса. Дальше что, как им понять, на какие из 100...1000 проектов на проде это повлияет?
Если они не понимают, что они релизят, то они должны отказать релизить.
P>·>Технически емейл от хедера в данном отличается лишь протоколом, smtp vs http. У хедеров ровно те же административные проблемы. P>Не только. хедер лежит вместе с респонзом, request-id и прочими вещами, не надо никаких приседаний, что бы начать инвестигейт.
В емейл можно положить и это, и гораздо больше.
P>·>Я не забыл, это ты запутался с своей софистике. Речь была "решать всё быстро тк они несут убыток". Несут убыток — это значит проблема в проде, что-то отвалилось. Или у вас ваш варнинг-хедер платный? P>Проблема на их части продакшна, что очевидно. Вот и нужно максимально быстро сигнализировать именно на той части.
Т.е. благодаря хедеру вы принесли убытки своему клиенту. Молодцы, чё.
P>·>Я имею в виду логи на нашей стороне. К логам консьюмера часто доступа нет вообще, никакого. И как им что-то указать в их логах — я даже не представляю. P>Вот-вот. Ты то хвастался, что impact analysis делаешь, а однако никаких средств у тебя на то нет
Читаешь невнимательно. На нашей стороне — есть.
>> Где они, в каком формате, кто имеет доступ? Да хз! Они вообще их могут сломать или потерять. А нам пофиг, у нас свои логи есть и мы им всё можем на блюдечке с каёмочкий показать и цветами нужные места разукрасить. P>Твои логи никто не отменял, и changelog никто не отменял.
Я это и написал. Ты читать разучился?
Мне не надо отправлять никакие хедеры на ту сторону, чтобы иметь свои логи.
P>·>Впрочем, опять не аргумент. Ничто не мешает емейл-рассылку или джиру или ещё чего сделать внутренним стандартом. В чём преимущество хедера-то? P>Емейл как стандарт работает плохо — майлбоксы у ключевых людей как правило переполнены. Но хедеры они читают!!
P>Джира получше, только создавать тикет надо не в твоей джире, а на той стороне, куда у тебя доступа нет
Это опять же административная проблема, и фиксится за минуту.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[65]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Ты заменил их на емейлы, которые ненадежны по своей природе. То есть, надо ждать регулярных фейлов. ·>Я не заменил, а предложил использовать тот же коммуникационный механизм, который у тебя уже существует на 7-8 шагах. Емейл — это лишь наиболее частый случай.
Кому ты емейлы слать будешь? На той стороне вполне себе возможна ситуация что N консумеров-клиентов-подразделений и чуть не все пользуются одними и теми же идентификаторами client,product,и тд.
С чего ты взял, что у них там идеальный порядок?
Итого — кому емейл слать, в чью джиру репортать?
А вот через транспорт однозначно известно, что происходит — нажали кнопку "показать трейсы" и сразу нашли, что вон тот сервис принадлежит команде ххх. И на той стороне всё находится мгновенно, достаточно прикрутить мониторинг.
P>>·>Что же твой код делает? Монетку подбрасывает? P>>Это уже не важно. Главное, что ассерты и тесты это немного разные классы задач, которые всего лишь пересекаются. ·>Важно для того чтобы "в логах появилась нужная мне инфа".
Абсолютно не важно. Ассертам без разницы, что делает вызывающий код, они вызываются всегда, в том их бенефит.
P>>Неверно. Речь о проблемах во входных данных. Ровно как с компилятором — подкидываешь ему код, а он кидает тебе результат + варнинги. ·>Это плохая аналогия. Ибо с компилятором нет административной проблемы, которую мы обсуждаем.
Ну ок.
Вот пришел тебе в логах x-сaller: client=client-v-1245;product=2455a29;api-key=xxx-yyy-zzz + x-request-id:234234523k4j5kjh534 + x-forwarded тоже залогирован
Предложи надежное решение, что бы оперативно сообщить той самой команде о проблеме, желательно минуя человечечский фактор.
Разумеется, порядка на той стороне ждать не нужно — у тебя из той сети/подсети идут запросы миллионами, и id клиента/продукта просто копипастили, ибо "а так работает", api-key выдан один раз на всю контору, ибо так чудовищно дешевле.
P>>Не стоит валять дурака — здесь была речь о том, что ты не в курсе ассертов. И я показал как это искать ассертами. ·>Я не просил рассказывать ничего про ассерты. И в чём я в курсе или нет, ты не знаешь. Разговор идёт про хедер.
Ты спросил — откуда возьмется варнинг. Я тебе сказал — из ассертов. Потом ты начал валять дурака и делать вид, что не в курсе ассертов. Хотя, может ты и не валял ничего, а просто не в курсе ассертов — сколько мы с тобой ни говорим, у тебя с ассертами какие то сложности.
·>Хм, интересное определение. а если if + LOG.info или if + LOG.trace — это тоже ассерт?
Тоже. Ассерт это шорткат для таких вещей. Ассертами это делается как вариант вот так
И разумеется всё это можно включать-выключать.
>А вот такой код: if(condition){LOG.info("X"); doX();} else {LOG.warn("Y"); doY();}? Это лог или уже ассерт?!
Это условный вызов doX и doY + логирование.
P>>Ассерты при правильном применении детектят определенные классы проблем, которые не обнаруживаются тестами. ·>Круто, конечно. Но я тебя спрашивал о хедере.
Ты спрашивал в т.ч. откуда появится соответствующее сообщение в хидере.
·>Это не мой кругозор, а очередное твоё уникальное понимание терминологии. Вот общепринятое понятие: ·>
an assertion failure – the program considers itself to be broken and typically deliberately crashes or throws an assertion failure exception.
Какое незамутнённое враньё Глянем фрагмент чуть больше, тот самый, который ты старательно вырезал:
Assertions can help a programmer read the code, help a compiler compile it , or help the program detect its own defects.
For the latter, some programs check assertions by actually evaluating the predicate as they run. Then, if it is not in fact true – an assertion failure – the program considers itself to be broken and typically deliberately crashes or throws an assertion failure exception.
То есть — если предназначение ассерта это детект собственных ошибок, то надо крешит или бросать исключение.
И по твоей же ссылке указано, что это далеко не единственное предназанчение ассертов. Вобщем, даже с такой ссылкой ты всё равно отказываешься узнать, а что же за зверь такой, эти ассерты.
Например, где то в дебрях БЛ мы помечаем Deprecate.assert(condition, message) — на тот случай, если код таки будет вызван из старого апи. В этом случае варнинг появится не просто при вызове старого апи, а только если это старое апи тригерит кое какую функциональность.
P>>Да тебе похоже ясно только как емейлы слать, которые не то читают, не то нет ·>Не только емейлы, а только не хедеры. Перечитай что ещё обсуждалось, если с памятью проблемы.
На счет твоего понимания емейлов есть сомнения, т.к ты не объяснил, куда именно ты будешь слать емейлы и какой предлагается флоу, end-2-end.
P>>"разработчики уже заняты чем то другим, а может и уволились" ·>И что? Кто полезет в код, чтобы разобраться что означает данный хедер и его значение? Тоже команда эксплуатации?!
А это и не надо делать. Хидер это старндартная капабилити в апи. Готовый клиент при наличии этого хидера сам залогирует всё, что необходимо.
гатевей тоже сможет сделать такое, и залогировать.
То есть, в код даже смотреть не надо, а сообщение оперативно получат именно те, кто ответственны за эксплуатацию конкретного сервиса на той стороне
P>>Т.е. все ложится на команду эксплуатации. Им что, следить за всеми анонсами всех сервисов? Эдак придется штат раз в десять раздуть. ·>За анонсами, ясен пень, следить надо. Примеров других анонсов, не относящихся к deprectated я уже приводил несколько.
Я слабо представляю, что бы команда эксплуатации следила за всеми такими анонсами. У них обычно дел по самые нидерланды.
P>>Не ясно, что конкретно ты предлагаешь, какой флоу и что делать, если емейл опоздал, затерялся, итд ·>Емейл — это сообщение. Попробуй поизучать вопросы как организовывать надёжную коммуникацию в системах обмена сообщениями.
Ты никак не можешь рассказать про весь цикл коммуникации, ограничиваешься общими утверждениями. Какой в этом смысл?
У нас простая задача — у нас случилось нечто, и надо оперативно дать знать той самой команде на той стороне. И проблема в том, что на той стороне под конкретным client/product id может сидеть сколько угодно сервисов/продуктов/команд и тд.
·>В том то и дело, что хедеры работают только если ·>1 если их читают все кому нужно
автоматизируется ·>2 вовремя
автоматизируется ·>3 и после чтения хедера точно известны последствия конкретно в твоем продукте
сообщение получат именно те люди, которые в курсе таких дел.
P>>Если п1 еще можно как то гарантировать, то 2 случается не так уж часто, а 3 это вообще какая то магия. ·>А с хедерами п1 даже невозможно гарантировать.
Наоборот.
·>Мы анализируем свои логи и видим какие к нам приходят запросы. Если мы хотим что-то поменять в логике обработки этих запросов, мы исследуем импакт для всех вариаций реальных запросов.
А степень последствий для вызывающего кода какие? Останов сервиса, убытки, итд, вот это как вы анализируете?
P>>Каким образом анализируя ваши логи/мониторинг вы узнаете, что у него случится denial of service ? ·>Я не понял сценарий. Расскажи детальнее, может с каким-нибудь внятным примером.
Элементарно — ошибка то на их стороне, которая приводит к dos. Раз ты в респонсе не сообщаешь нужной инфы, то выйти из dos они могут только в том случае, когда спустя слои переписок всё дойдет до конкретного L2, и тот перестартует сервис.
P>>Что фиксить? Проблема на вызывающей стороне, у них ожидания не соответствуют вашему апи. Начнешь перепиливать апи, что бы угодить всем? ·>твой хедер можно послать только на основе запроса. Если мы упустили какой-то precondition по структуре запроса и стали возвращать неожиданный результат, то это наша проблема, нам и фиксить.
Ну то есть, если тебя ктото продолжит называть по девичьей фамилии, ты заведешь второй паспорт, так что ли?
На нашей стороне все в порядке — небольшая функция в старом апи депрекейтнулась, и вызывается в дебрях БЛ. Заранее узнать, будет ли такой вызов, или нет, не представляется возможным.
P>>Технически — ничем. Главное, что бы ихний мониторинг сработал. Варнинг — это дополнительная фича АПИ, когда мы передаем информацию о качестве результата. ·>Нет. Мы выяснили, что главное, чтобы не мониторинг сработал (это лишь средство), а чтобы они предприняли некие действия и изменили их код (а вот это цель).
В том то и дело, что выяснить ответсвенное лицо бывает крайне сложно, например, потому что client-id, product-id, api-key одни и те же на всех.
P>>Предлагаешь на миллион запросов создавать миллион тикетов в джыре? Или писать AI который будет фильтровать, тот ли это баг или не тот? ·>Так в этом и суть, что не надо посылать миллион. Надо послать ровно один. А вот хедеров посылается миллион.
В какой из 1000 команды ты создашь джыра тикет? С т.з. твоего сервиса это один клиент/консумер/итд. C их т.з. таких целая тыща.
P>>ну да, ты то без багов пишешь, я помню — у тебя баги на прод не попадают. ·>Да, попадают. И да, это эпик фейл.
Слава богу. А то в прошлый раз ты на полном серьезе утверждал, что такого у вас быть не может.
·>Верно. Но технические средства нужно выбирать адекватно. Выбирать между одним емейлом (джирой, етс) и хедером в миллионах респонзов — надо на основе технических параметров. А вы выбрали лишь потому что у вас так принято, а с емейлами справиться не смогли, из-за административных проблем.
Неверное предположение. Что бы справиться с емейлами, нужно наладить коммуникацию со всеми из консумеров, что намного сложнее чем с одним. И надо понавводить целую кучу требований, ограничения именно для той стороны, и добиться что бы они этому следовали. Без этого емейлы работать не будут.
P>>Единственное, что делает менеджмент, это принятие решений, как именно будет решаться та, или иная проблема. Скажет решать емейлами — будет решаться емейлами. P>>Скажет, что чрез транспорт реквеста — будет решаться через хидеры. ·>Т.е. у вас менеджемент решает технические вопросы? Мде. Тогда ясно.
Менеджер принимает решение. Например, архитектор — это менеджерская позиция. А у вас что, архитектор это разновидность девелоперов?
P>>·>Технически емейл от хедера в данном отличается лишь протоколом, smtp vs http. У хедеров ровно те же административные проблемы. P>>Не только. хедер лежит вместе с респонзом, request-id и прочими вещами, не надо никаких приседаний, что бы начать инвестигейт. ·>В емейл можно положить и это, и гораздо больше.
И как он дойдет до ответсвенного лица? Полагаю так — шлете CEO, он форвардит подчиненным, те — своим подчиненным, и так пока не дойдет до того самого L2.
P>>Проблема на их части продакшна, что очевидно. Вот и нужно максимально быстро сигнализировать именно на той части. ·>Т.е. благодаря хедеру вы принесли убытки своему клиенту. Молодцы, чё.
Наоборот.
P>>Вот-вот. Ты то хвастался, что impact analysis делаешь, а однако никаких средств у тебя на то нет ·>Читаешь невнимательно. На нашей стороне — есть.
А надо бы и на той стороне глянуть. Какой юзкейс БЛ завязан на конкретный реквест ты не в курсе, а это самое важное.
P>>Емейл как стандарт работает плохо — майлбоксы у ключевых людей как правило переполнены. ·> Но хедеры они читают!!
Хидеры читают технические средства, а дальше все проблемы видны на мониторинге. Ты или юродствуешь, или вообще не в курсе, про что пишешь.
P>>Джира получше, только создавать тикет надо не в твоей джире, а на той стороне, куда у тебя доступа нет ·>Это опять же административная проблема, и фиксится за минуту.
Ну расскажи, в какой джире надо создать тикет, и когда именно, если все запросы исходят будто бы от одного сервиса на той стороне, а на самом деле там сотни команд/продуктов/сервисов со своими трекерами.
Здравствуйте, Pauel, Вы писали:
P>>>Ты заменил их на емейлы, которые ненадежны по своей природе. То есть, надо ждать регулярных фейлов. P>·>Я не заменил, а предложил использовать тот же коммуникационный механизм, который у тебя уже существует на 7-8 шагах. Емейл — это лишь наиболее частый случай. P>Кому ты емейлы слать будешь? На той стороне вполне себе возможна ситуация что N консумеров-клиентов-подразделений и чуть не все пользуются одними и теми же идентификаторами client,product,и тд.
Тому кто живёт на шаге 7 или 8.
P>С чего ты взял, что у них там идеальный порядок?
Вот именно. Значит шаги 1-7 тоже могут быть сломаны.
P>А вот через транспорт однозначно известно, что происходит — нажали кнопку "показать трейсы" и сразу нашли, что вон тот сервис принадлежит команде ххх. И на той стороне всё находится мгновенно, достаточно прикрутить мониторинг.
Не понял что за трейсы. Как я понял, вы не имеете (ну по крайней мере не должны) иметь доступ к логам той стороны.
P>>>Неверно. Речь о проблемах во входных данных. Ровно как с компилятором — подкидываешь ему код, а он кидает тебе результат + варнинги. P>·>Это плохая аналогия. Ибо с компилятором нет административной проблемы, которую мы обсуждаем. P>Ну ок. P>Вот пришел тебе в логах x-сaller: client=client-v-1245;product=2455a29;api-key=xxx-yyy-zzz + x-request-id:234234523k4j5kjh534 + x-forwarded тоже залогирован P>Предложи надежное решение, что бы оперативно сообщить той самой команде о проблеме, желательно минуя человечечский фактор.
В шагах 1-7 полно человеческого фактора.
P>Разумеется, порядка на той стороне ждать не нужно — у тебя из той сети/подсети идут запросы миллионами, и id клиента/продукта просто копипастили, ибо "а так работает", api-key выдан один раз на всю контору, ибо так чудовищно дешевле.
Отправить на ту сторону request-id и пусть разбираются кому он принадлежит. Это не твоя проблема значит.
P>>>Не стоит валять дурака — здесь была речь о том, что ты не в курсе ассертов. И я показал как это искать ассертами. P>·>Я не просил рассказывать ничего про ассерты. И в чём я в курсе или нет, ты не знаешь. Разговор идёт про хедер. P>Ты спросил — откуда возьмется варнинг. Я тебе сказал — из ассертов. Потом ты начал валять дурака и делать вид, что не в курсе ассертов. Хотя, может ты и не валял ничего, а просто не в курсе ассертов — сколько мы с тобой ни говорим, у тебя с ассертами какие то сложности.
Иди выше по контексту. Ты спросил: как долго будешь искать, какая же комбинация "та самая"?. Я ответил, что именно та комбинация, которая у тебя выдаёт варнинг, т.е. комбинация уже найдена. Ты начал что-то про ассерты рассказывать, неясно зачем.
P>·>Хм, интересное определение. а если if + LOG.info или if + LOG.trace — это тоже ассерт? P>Тоже. Ассерт это шорткат для таких вещей. Ассертами это делается как вариант вот так P>И разумеется всё это можно включать-выключать.
Ок, пусть так. Совершенно неважно как вы это у себя в коде называете. Суть в том, что это просто некое логическое условие.
>>А вот такой код: if(condition){LOG.info("X"); doX();} else {LOG.warn("Y"); doY();}? Это лог или уже ассерт?! P>Это условный вызов doX и doY + логирование.
Мда. Сложно как всё у вас.
P>>>Ассерты при правильном применении детектят определенные классы проблем, которые не обнаруживаются тестами. P>·>Круто, конечно. Но я тебя спрашивал о хедере. P>Ты спрашивал в т.ч. откуда появится соответствующее сообщение в хидере.
Ну вот ты и ответил на свой вопрос об искомой комбинации в тестах.
P>То есть — если предназначение ассерта это детект собственных ошибок, то надо крешит или бросать исключение. P>И по твоей же ссылке указано, что это далеко не единственное предназанчение ассертов. Вобщем, даже с такой ссылкой ты всё равно отказываешься узнать, а что же за зверь такой, эти ассерты.
А там есть два других предназначения: help a programmer read the code (по сути коммент) и help a compiler compile it (это просто видимо плюсовый static_assert). Какое предназначение я так подло скрыл, по-твоему? Статью ты не читал же. Вот ещё цитаты оттуда же:
Assertions are distinct from routine error-handling.
Using assertions as a general-purpose error handling mechanism is unwise: assertions do not allow for recovery from errors
Главная идея в статье вики в том, что ассертами покрывается сам код, а не ошибки во входных данных. И если ассерты падают, то это значит, что требуется поиск баги в самом коде, а не у консьюмеров твоего кода.
Вот и совершенно неясно что было в голове у человека, который придумал что результаты ассертов можно отдавать наружу. Прям классикой пахнуло. on error resume next.
Уж лучше validation, input check, argument check, precondition, warning, complain, report, fault, defect и т.п. Но причём тут ассерты, вообще неясно.
P>Например, где то в дебрях БЛ мы помечаем Deprecate.assert(condition, message) — на тот случай, если код таки будет вызван из старого апи. В этом случае варнинг появится не просто при вызове старого апи, а только если это старое апи тригерит кое какую функциональность.
Это логгирование обыкновевнное. Поэтому да, ты прав, я не в курсе _таких_ ассертов. Да и вряд ли кто-то кроме вас в курсе.
P>>>Да тебе похоже ясно только как емейлы слать, которые не то читают, не то нет P>·>Не только емейлы, а только не хедеры. Перечитай что ещё обсуждалось, если с памятью проблемы. P>На счет твоего понимания емейлов есть сомнения, т.к ты не объяснил, куда именно ты будешь слать емейлы и какой предлагается флоу, end-2-end.
Туда кто занимается шагом 7 или 8.
P>>>"разработчики уже заняты чем то другим, а может и уволились" P>·>И что? Кто полезет в код, чтобы разобраться что означает данный хедер и его значение? Тоже команда эксплуатации?! P>А это и не надо делать. Хидер это старндартная капабилити в апи. Готовый клиент при наличии этого хидера сам залогирует всё, что необходимо. P>гатевей тоже сможет сделать такое, и залогировать. P>То есть, в код даже смотреть не надо, а сообщение оперативно получат именно те, кто ответственны за эксплуатацию конкретного сервиса на той стороне
Что конкретно залогирует? У тебя в примере было 'unexpected input'. Как по этому _точно_ узнать тот самый precondontion, который это залогировал?
P>>>Т.е. все ложится на команду эксплуатации. Им что, следить за всеми анонсами всех сервисов? Эдак придется штат раз в десять раздуть. P>·>За анонсами, ясен пень, следить надо. Примеров других анонсов, не относящихся к deprectated я уже приводил несколько. P>Я слабо представляю, что бы команда эксплуатации следила за всеми такими анонсами. У них обычно дел по самые нидерланды.
В такой системе как у вас — с весёлыми релизами, тестами в проде и ассертами-хедерами — не удивительно.
P>>>Не ясно, что конкретно ты предлагаешь, какой флоу и что делать, если емейл опоздал, затерялся, итд P>·>Емейл — это сообщение. Попробуй поизучать вопросы как организовывать надёжную коммуникацию в системах обмена сообщениями. P>Ты никак не можешь рассказать про весь цикл коммуникации, ограничиваешься общими утверждениями. Какой в этом смысл? P>У нас простая задача — у нас случилось нечто, и надо оперативно дать знать той самой команде на той стороне. И проблема в том, что на той стороне под конкретным client/product id может сидеть сколько угодно сервисов/продуктов/команд и тд.
Твой подход был вроде такой, что они к вам приходят с проблемой, что у них что-то не работает. Тогда просто по их request-id вы можете поглядеть свои логи и указать какие проблемы были в их запросах и рассказать что и как им надо поменять. Т.е. отправлять хедеры бессмысленно; отправляли вы эти хедеры, отправляли, а у них всё равно проблемы в проде.
Мой подход создать таску (через емейл, джиру, whatever) для L2. Пусть они сами разбираются как найти нужную команду и дать им шанс их что-то там поменять до указанного срока, пока вы не зарелизили свои изменения.
P>·>В том то и дело, что хедеры работают только если P>·>1 если их читают все кому нужно P>автоматизируется
У всех тысяч консьюмеров? Не верю.
P>·>2 вовремя P>автоматизируется
Как 7-8 шаг автоматизируется?
P>·>3 и после чтения хедера точно известны последствия конкретно в твоем продукте P>сообщение получат именно те люди, которые в курсе таких дел.
Какое "сообщение"?
P>·>Мы анализируем свои логи и видим какие к нам приходят запросы. Если мы хотим что-то поменять в логике обработки этих запросов, мы исследуем импакт для всех вариаций реальных запросов. P> А степень последствий для вызывающего кода какие? Останов сервиса, убытки, итд, вот это как вы анализируете?
Это не в зоне нашего контроля, и код мы это не видим и видеть не можем. Поэтому и придумали API и SLA.
P>>>Каким образом анализируя ваши логи/мониторинг вы узнаете, что у него случится denial of service ? P>·>Я не понял сценарий. Расскажи детальнее, может с каким-нибудь внятным примером. P>Элементарно — ошибка то на их стороне, которая приводит к dos. Раз ты в респонсе не сообщаешь нужной инфы, то выйти из dos они могут только в том случае, когда спустя слои переписок всё дойдет до конкретного L2, и тот перестартует сервис.
Не понял как отправка хедера может повлиять на их код. Мы в принципе не можем ни видеть, ни контролировать обработку респонзов.
P>>>Что фиксить? Проблема на вызывающей стороне, у них ожидания не соответствуют вашему апи. Начнешь перепиливать апи, что бы угодить всем? P>·>твой хедер можно послать только на основе запроса. Если мы упустили какой-то precondition по структуре запроса и стали возвращать неожиданный результат, то это наша проблема, нам и фиксить. P>Ну то есть, если тебя ктото продолжит называть по девичьей фамилии, ты заведешь второй паспорт, так что ли?
Чё?
P>На нашей стороне все в порядке — небольшая функция в старом апи депрекейтнулась, и вызывается в дебрях БЛ. Заранее узнать, будет ли такой вызов, или нет, не представляется возможным.
Ну уж если ЯП и код совсем гно, и понять при каких условиях вызывается какая-то функция ну никак невозможно по анализу кода... С тестами швах, что воспроизвести сценарий не получается... То можно просто добавить в функцию log.warning. Потом анализировать логи и выяснить какая комбинация параметров запроса.
Очень стойкое ощущение, что у вас всё очень плохо и вменяемого понимания что у вас происходит в коде у вас нет. Но вместо того, чтобы самим решать свои проблемы, вы шлёте их через хедер консьюмерам в надежде, что они за вас вашу работу сделают, ведь они же деньги теряют. А вы вот экономите.
P>>>Технически — ничем. Главное, что бы ихний мониторинг сработал. Варнинг — это дополнительная фича АПИ, когда мы передаем информацию о качестве результата. P>·>Нет. Мы выяснили, что главное, чтобы не мониторинг сработал (это лишь средство), а чтобы они предприняли некие действия и изменили их код (а вот это цель). P>В том то и дело, что выяснить ответсвенное лицо бывает крайне сложно, например, потому что client-id, product-id, api-key одни и те же на всех.
Ну бардак чё. Надо чинить.
P>>>Предлагаешь на миллион запросов создавать миллион тикетов в джыре? Или писать AI который будет фильтровать, тот ли это баг или не тот? P>·>Так в этом и суть, что не надо посылать миллион. Надо послать ровно один. А вот хедеров посылается миллион. P>В какой из 1000 команды ты создашь джыра тикет? С т.з. твоего сервиса это один клиент/консумер/итд. C их т.з. таких целая тыща.
Трейсить по request-id. Не бином ньютона. Студенты индусы с таким справляются.
P>>>ну да, ты то без багов пишешь, я помню — у тебя баги на прод не попадают. P>·>Да, попадают. И да, это эпик фейл. P>Слава богу. А то в прошлый раз ты на полном серьезе утверждал, что такого у вас быть не может.
Ты врёшь. Я заявлял, что у нас не бывает, что тесты работающие в препроде вдруг внезапно валятся в проде.
Видишь ли. Баги бывают разные. Те которые у нас доходят до прода основаны на незнании или на непонимании требований. Т.е. кодируем и тестируем мы одно, а когда выкатываем клиенту, они, оказывается, хотели чего-то другого. Ну или банальные баги с техническими проблемами, типа многопоточки, асинхронщины, переполнения, неверных алгоритмов и т.п. Мы не догадались сделать какой-то тест, проверить какой-то сценарий и что-то выкатили в прод. А потом оказалось, что именно этот _неизвестный заранее_ сценарий провалился и сработал не так, как нужно клиенту.
У тебя же совсем другая ситуация. Ты уже знаешь конкретный сценарий, раз ты добавил какие-то условия в код, чтобы что-то писалось в хедер. Т.е. это уже известая тебе конкретная комбинация из 2^10^10 возможных. Но вместо того, чтобы досконально изучить как именно ведёт себя вся система в этом сценарии, удостовериться, что всё работает end2end, подтвердить ожидания у клиентов, ты что-то пихаешь в хедер, чтобы потом к тебе прибежали с прод-проблемами, т.к. убытки несут. И это лишь потому, что ты не знаешь кому какой емейл послать. Просто халатность.
P>·>Верно. Но технические средства нужно выбирать адекватно. Выбирать между одним емейлом (джирой, етс) и хедером в миллионах респонзов — надо на основе технических параметров. А вы выбрали лишь потому что у вас так принято, а с емейлами справиться не смогли, из-за административных проблем. P>Неверное предположение. Что бы справиться с емейлами, нужно наладить коммуникацию со всеми из консумеров, что намного сложнее чем с одним. И надо понавводить целую кучу требований, ограничения именно для той стороны, и добиться что бы они этому следовали. Без этого емейлы работать не будут.
Так хедеры у вас тоже не работают, т.к. у клиентов простой, деньги теряют.
Отличие в том, что емейлы можно заставить работать, а хедеры — невозможно.
P>>>Единственное, что делает менеджмент, это принятие решений, как именно будет решаться та, или иная проблема. Скажет решать емейлами — будет решаться емейлами. P>>>Скажет, что чрез транспорт реквеста — будет решаться через хидеры. P>·>Т.е. у вас менеджемент решает технические вопросы? Мде. Тогда ясно. P>Менеджер принимает решение. Например, архитектор — это менеджерская позиция. А у вас что, архитектор это разновидность девелоперов?
Это разновидность software engineer. Врочем да, соглашусь, что и управленческие решения принимает.
P>>>Не только. хедер лежит вместе с респонзом, request-id и прочими вещами, не надо никаких приседаний, что бы начать инвестигейт. P>·>В емейл можно положить и это, и гораздо больше. P>И как он дойдет до ответсвенного лица? Полагаю так — шлете CEO, он форвардит подчиненным, те — своим подчиненным, и так пока не дойдет до того самого L2.
Шаг 7, шлём L2. Где в том списке CEO, я не видел.
P>>>Проблема на их части продакшна, что очевидно. Вот и нужно максимально быстро сигнализировать именно на той части. P>·>Т.е. благодаря хедеру вы принесли убытки своему клиенту. Молодцы, чё. P>Наоборот.
Что наоборот? Не молодцы?
P>>>Вот-вот. Ты то хвастался, что impact analysis делаешь, а однако никаких средств у тебя на то нет P>·>Читаешь невнимательно. На нашей стороне — есть. P>А надо бы и на той стороне глянуть. Какой юзкейс БЛ завязан на конкретный реквест ты не в курсе, а это самое важное.
Сам заявил, что к логам той стороны (какой из тысячи, кстати) доступа нет и быть не должно. Кода тоже нет обычно. Что глянуть-то ты предлагаешь? Можно лишь через L2 или через разработчиков на той стороне.
P>>>Емейл как стандарт работает плохо — майлбоксы у ключевых людей как правило переполнены. P>·> Но хедеры они читают!! P>Хидеры читают технические средства, а дальше все проблемы видны на мониторинге. Ты или юродствуешь, или вообще не в курсе, про что пишешь.
Ну видно на мониторинге, а толку-то, если никто не смотрит... Ключевые люди не отреагировали же, т.к. к вам с прода бегут.
P>>>Джира получше, только создавать тикет надо не в твоей джире, а на той стороне, куда у тебя доступа нет P>·>Это опять же административная проблема, и фиксится за минуту. P>Ну расскажи, в какой джире надо создать тикет, и когда именно, если все запросы исходят будто бы от одного сервиса на той стороне, а на самом деле там сотни команд/продуктов/сервисов со своими трекерами.
Если совсем всё плохо в организации, то в любой, для начала. А там уже выяснять кто за что отвечает по цепочке, передавая ответственность за решение проблемы.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
P>>С чего ты взял, что у них там идеальный порядок? ·>Вот именно. Значит шаги 1-7 тоже могут быть сломаны.
Смотрим вместе:
0. Ты обнаружил precondontion.
1. Код ворнинга — это ваша зона ответственности, варнинги должны быть покрыты тестами и пройти код ревью.
2. QA — снова ваша зона ответсвенности, qa дают добро на выход в прод
3. Хедер — пишется автоматически, ваша зона ответственности, покрыто тестами
4. Система логгирования — их зона ответственности
5. Мониторинг — это правило для деплоймента, добавляется ровно 1 степ на фильтрацию логов
6. L2 замечает проблему
7. L2 расследует
8. разработчик-менеджер — не абы кто из рассылки, а именно тот, кто отвечает за конкретный продукт
Твой вариант — 0..4 тож самое, только в хидеры ничего не пихаете. Вместо 4..5 у тебя
1. взять человека, который будет заниматься роутингом по request-id при получении соответствующего письма
2. ожидать, что на той стороне люди будут форвардить друг другу письма, тикеты итд
далее 6,7,8 один в один.
Итого — цепочка примерно та же, только ручной роутинг-форвардинг вносит хаос.
> Уж лучше validation, input check, argument check, precondition, warning, complain, report, fault, defect и т.п. Но причём тут ассерты, вообще неясно.
Забавно, что ты перечислил целую кучу разновидностей ассертов
Разница только в том, что
1. есть ли продолжение или нет
2. стратегия обработки разные
И что очевидно, ассерты это не error handling, а способ обнаружить проблему.Понадобится после этого error handling, или нет, это уже дело десятое.
Про комбинации я уже устал писать, вероятно ты ожидаешь ассерт вида assert(x == combination), очевидно, что такие ассерты смысла не имеют т.к. тесты сработают лучше.
Ассерты нужно применять тогда, когда мы знаем только свойства, под которые может подойти сколько угодно комбинаций и заранее ни одна из них неизвестна.
Здравствуйте, Pauel, Вы писали:
P>>>С чего ты взял, что у них там идеальный порядок? P>·>Вот именно. Значит шаги 1-7 тоже могут быть сломаны.
P>Смотрим вместе: P>0. Ты обнаружил precondontion. P>1. Код ворнинга — это ваша зона ответственности, варнинги должны быть покрыты тестами и пройти код ревью. P>2. QA — снова ваша зона ответсвенности, qa дают добро на выход в прод P>3. Хедер — пишется автоматически, ваша зона ответственности, покрыто тестами P>4. Система логгирования — их зона ответственности P>5. Мониторинг — это правило для деплоймента, добавляется ровно 1 степ на фильтрацию логов P>6. L2 замечает проблему P>7. L2 расследует P>8. разработчик-менеджер — не абы кто из рассылки, а именно тот, кто отвечает за конкретный продукт
P>Твой вариант — 0..4 тож самое, только в хидеры ничего не пихаете.
Нет. Необходим только 0 (и вообще это не шаг как таковой, а так, начало всего процесса). После этого (в тяжелых случаях) можно добавить логгирование в наш код для инвестигирования проблемы, но в большинстве случаев существующих логов вполне достаточно. Для наших логов QA не нужен, т.к. они наши и их качество — наша внутренняя проблема. Вы же хедер публикуете наружу клиентам, через API. Значит QA необходим, т.к. client-driven тестирование вещь, мягко говоря, не лучшая идея.
P> Вместо 4..5 у тебя P>1. взять человека, который по request-id будет заниматься роутингом по request-id
Искать по request-id что, откуда, куда, зачем пришло всё равно постоянно приходится. С варнингами и без. С этим справляется любой у кого есть доступ к логам.
P>2. ожидать, что на той стороне люди будут форвардить друг другу письма, тикеты итд
Это то что у тебя на шагах 6-7-8.
P>далее 6,7,8 один в один.
6 не нужно, т.к. проблему ты сообщаешь явно и, в идеале, добиваешься подтверждения у получателя, что проблему начали расследовать.
P>Итого — цепочка примерно та же, только ручной роутинг-форвардинг вносит хаос.
Нет.
>> Уж лучше validation, input check, argument check, precondition, warning, complain, report, fault, defect и т.п. Но причём тут ассерты, вообще неясно. P>Забавно, что ты перечислил целую кучу разновидностей ассертов
Это только в твоей уникальной терминологии.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
P>>Твой вариант — 0..4 тож самое, только в хидеры ничего не пихаете. ·>Нет. Необходим только 0 (и вообще это не шаг как таковой, а так, начало всего процесса). После этого (в тяжелых случаях) можно добавить логгирование в наш код для инвестигирования проблемы, но в большинстве случаев существующих логов вполне достаточно. Для наших логов QA не нужен, т.к. они наши и их качество — наша внутренняя проблема. Вы же хедер публикуете наружу клиентам, через API. Значит QA необходим, т.к. client-driven тестирование вещь, мягко говоря, не лучшая идея.
Вы выкатили в прод, значительной часть логов не появляется вовсе. Вот тебе и "QA не нужен".
P>> Вместо 4..5 у тебя P>>1. взять человека, который по request-id будет заниматься роутингом по request-id ·>Искать по request-id что, откуда, куда, зачем пришло всё равно постоянно приходится. С варнингами и без. С этим справляется любой у кого есть доступ к логам.
У тебя всё на емейл завязано. Вы кинули куда то емейл — там должен сидеть человек, чья работа будет заключаться в первичном сборе сведений, и только потом он должен форвардить реквест той или иной команде...
Отфорвардил. И что? А там менеджер ушел в отпуск, и к L2 это не попадёт.- Или ты предлагаешь емейлы слать на всех причастных? Эдак вообще ничего не будет обработано.
P>>2. ожидать, что на той стороне люди будут форвардить друг другу письма, тикеты итд ·>Это то что у тебя на шагах 6-7-8.
Совсем не то.
P>>далее 6,7,8 один в один. ·>6 не нужно, т.к. проблему ты сообщаешь явно и, в идеале, добиваешься подтверждения у получателя, что проблему начали расследовать.
Снова какая то магия, ну или неявные предположения, как работает та или иная контора.
Re[70]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>Здравствуйте, ·, Вы писали:
P>>>Твой вариант — 0..4 тож самое, только в хидеры ничего не пихаете. P>·>Нет. Необходим только 0 (и вообще это не шаг как таковой, а так, начало всего процесса). После этого (в тяжелых случаях) можно добавить логгирование в наш код для инвестигирования проблемы, но в большинстве случаев существующих логов вполне достаточно. Для наших логов QA не нужен, т.к. они наши и их качество — наша внутренняя проблема. Вы же хедер публикуете наружу клиентам, через API. Значит QA необходим, т.к. client-driven тестирование вещь, мягко говоря, не лучшая идея. P>Вы выкатили в прод, значительной часть логов не появляется вовсе. Вот тебе и "QA не нужен".
Для наших логов QA не нужен. Для хедеров отправляемых наружу — нужен. Логи такого типа это дело разработчиков и никого больше не касается.
P>>>1. взять человека, который по request-id будет заниматься роутингом по request-id P>·>Искать по request-id что, откуда, куда, зачем пришло всё равно постоянно приходится. С варнингами и без. С этим справляется любой у кого есть доступ к логам. P>У тебя всё на емейл завязано. Вы кинули куда то емейл — там должен сидеть человек, чья работа будет заключаться в первичном сборе сведений, и только потом он должен форвардить реквест той или иной команде...
Ровно то, что у тебя происходит на шаге 6 и 7.
P>Отфорвардил. И что? А там менеджер ушел в отпуск, и к L2 это не попадёт.- Или ты предлагаешь емейлы слать на всех причастных? Эдак вообще ничего не будет обработано.
Чейсить и эскалайтить. Ровно то что должно происходить у тебя на шагах 6 и далее.
Проблема в том, что у тебя в твоей схеме обрыв в коммуникации. До того как вам прибегут с прода злые клиенты ты не знаешь что происходит начиная с 4го шага.
P>>>2. ожидать, что на той стороне люди будут форвардить друг другу письма, тикеты итд P>·>Это то что у тебя на шагах 6-7-8. P>Совсем не то.
А что?
P>>>далее 6,7,8 один в один. P>·>6 не нужно, т.к. проблему ты сообщаешь явно и, в идеале, добиваешься подтверждения у получателя, что проблему начали расследовать. P>Снова какая то магия, ну или неявные предположения, как работает та или иная контора.
Расскажи как работает ваша контора.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[71]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Вы выкатили в прод, значительной часть логов не появляется вовсе. Вот тебе и "QA не нужен". ·>Для наших логов QA не нужен. Для хедеров отправляемых наружу — нужен. Логи такого типа это дело разработчиков и никого больше не касается.
На ваши логи завязана такая капабилити, как уведомление той стороны о проблемах(SLA). Следовательно, нужен QA который скажет, что логи соответствуют вашим внутренним ожиданиям(предоставить гарантии SLA).
P>>У тебя всё на емейл завязано. Вы кинули куда то емейл — там должен сидеть человек, чья работа будет заключаться в первичном сборе сведений, и только потом он должен форвардить реквест той или иной команде... ·>Ровно то, что у тебя происходит на шаге 6 и 7.
6 и 7 это работа L2 конкретной команды. А у тебя эту команду еще разыскать надо методом форварда емейлов и анализом трейсов.
P>>Отфорвардил. И что? А там менеджер ушел в отпуск, и к L2 это не попадёт.- Или ты предлагаешь емейлы слать на всех причастных? Эдак вообще ничего не будет обработано. ·>Чейсить и эскалайтить. Ровно то что должно происходить у тебя на шагах 6 и далее. ·>Проблема в том, что у тебя в твоей схеме обрыв в коммуникации. До того как вам прибегут с прода злые клиенты ты не знаешь что происходит начиная с 4го шага.
Если они прибегают, то мы спрашиваем у них request id и мы можем показать весь процессинг на нашей стороне.
P>>Совсем не то. ·>А что?
При условии добросовестной реализации или использования нашего клиента можно ожидать
1. корректные логи
2. мониторинг прикрученый к этим логам
Отсюда ясно, что информирован будет L2 непосредственно того самого сервиса.
А в твоём случае этого L2 еще найти надо будет перекидыванием тикетов и форвардом емейлов.
P>>Снова какая то магия, ну или неявные предположения, как работает та или иная контора. ·>Расскажи как работает ваша контора.
Зачем? ты делаешь слишком много предположений. В норме нужно предоставлять не только сам ответ, но и диагностику. Обслуживание сервисов стоит чудовищно дорого из за ручного труда. Если подкидываешь с ответом еще и диагностику, то значительную часть таких издержек можно автоматизировать.
Здравствуйте, Pauel, Вы писали:
P>>>Вы выкатили в прод, значительной часть логов не появляется вовсе. Вот тебе и "QA не нужен". P>·>Для наших логов QA не нужен. Для хедеров отправляемых наружу — нужен. Логи такого типа это дело разработчиков и никого больше не касается. P>На ваши логи завязана такая капабилити, как уведомление той стороны о проблемах(SLA). Следовательно, нужен QA который скажет, что логи соответствуют вашим внутренним ожиданиям(предоставить гарантии SLA).
Не очень что ты конкретно имеешь в виду, что именно завязано? Скажем, в рассматриваемом примере deprecated api, нам не нужны логи, мы и так уже знаем, что некий наш API мы решили сделать deprecated.
Формально мы по логам можем ответить на вопрос, мол, сколько в данный момент запросов мы получаем на deprecated api, но это не слишком полезное знание. Ибо наличие/отсутствие реальных запросов ни о чём не говорит. Важно получить подверждение от всех клиентов, что они переписали свои приложения на новый API, успешно всё задеплоили и не собираются делать rollback. Вот только такое явное подтверждение может дать более менее сильную гарантию, что нам не побегут с прода несущие убытки злые клиенты. Наличие варнингов, хедеров, мониторинга — ни о чём. Ибо, повторюсь, проблема административная, требующая коммуникации, _двухсторонней_, между людьми, а не между приложениями.
P>>>У тебя всё на емейл завязано. Вы кинули куда то емейл — там должен сидеть человек, чья работа будет заключаться в первичном сборе сведений, и только потом он должен форвардить реквест той или иной команде... P>·>Ровно то, что у тебя происходит на шаге 6 и 7. P>6 и 7 это работа L2 конкретной команды. А у тебя эту команду еще разыскать надо методом форварда емейлов и анализом трейсов.
У тебя ровно то же: А вот через транспорт однозначно известно, что происходит — нажали кнопку "показать трейсы" и сразу нашли, что вон тот сервис принадлежит команде ххх.
Или ты в прыжке переобуваешься?
P>>>Отфорвардил. И что? А там менеджер ушел в отпуск, и к L2 это не попадёт.- Или ты предлагаешь емейлы слать на всех причастных? Эдак вообще ничего не будет обработано. P>·>Чейсить и эскалайтить. Ровно то что должно происходить у тебя на шагах 6 и далее. P>·>Проблема в том, что у тебя в твоей схеме обрыв в коммуникации. До того как вам прибегут с прода злые клиенты ты не знаешь что происходит начиная с 4го шага. P>Если они прибегают, то мы спрашиваем у них request id и мы можем показать весь процессинг на нашей стороне.
Вот именно. Т.е. хедер не особо то и нужен.
P>>>Совсем не то. P>·>А что? P>При условии добросовестной реализации или использования нашего клиента можно ожидать
Это слишком невероятное условие. Практически наверняка невыполнимое для тысяч консьюмеров.
P>Отсюда ясно, что информирован будет L2 непосредственно того самого сервиса.
Проблема не в том, кто информирован, а в том, что коммуникация односторонняя. А следовательно non-guarateed message delivery.
P>А в твоём случае этого L2 еще найти надо будет перекидыванием тикетов и форвардом емейлов.
Или трейсом по request-id. Техническая реализация не так важна.
P>>>Снова какая то магия, ну или неявные предположения, как работает та или иная контора. P>·>Расскажи как работает ваша контора. P> Зачем? ты делаешь слишком много предположений. В норме нужно предоставлять не только сам ответ, но и диагностику. Обслуживание сервисов стоит чудовищно дорого из за ручного труда. Если подкидываешь с ответом еще и диагностику, то значительную часть таких издержек можно автоматизировать.
Верно. Но совершенно необязательно диагностику прокидывать по тому же каналу.
Более того, это не всегда технически возможно использовать тот же канал. Ты так и не предложил как это делать в отличных от REST request-response случаях Т.е. решение, как минимум, не универсальное, а значит всё равно понадобится другое решение.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[73]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>·>Ровно то, что у тебя происходит на шаге 6 и 7. P>>6 и 7 это работа L2 конкретной команды. А у тебя эту команду еще разыскать надо методом форварда емейлов и анализом трейсов. ·>У тебя ровно то же: А вот через транспорт однозначно известно, что происходит — нажали кнопку "показать трейсы" и сразу нашли, что вон тот сервис принадлежит команде ххх. ·>Или ты в прыжке переобуваешься?
В моем случае это делает L2 той самой команды, что обслуживает конкретный сервис. А в твоём случае её еще найти надо, через те же самые трейсы, тк у тебя этот сервис изначально неизвестен. Что предложишь, форвардить мессагу всем L2 и попросить, что бы они разыскали каждый своё? Или нанять человека, кторый будет диспетчером работать?
P>>·>Проблема в том, что у тебя в твоей схеме обрыв в коммуникации. До того как вам прибегут с прода злые клиенты ты не знаешь что происходит начиная с 4го шага. P>>Если они прибегают, то мы спрашиваем у них request id и мы можем показать весь процессинг на нашей стороне. ·>Вот именно. Т.е. хедер не особо то и нужен.
Ты что, ногой читаешь или затылком?
У нас хидер нужден для другого кейса — мы им сообщаем что у них проблема.
P>>При условии добросовестной реализации или использования нашего клиента можно ожидать ·>Это слишком невероятное условие. Практически наверняка невыполнимое для тысяч консьюмеров.
Это минимальное условие, которое можно себе позволить.
P>>Отсюда ясно, что информирован будет L2 непосредственно того самого сервиса. ·>Проблема не в том, кто информирован, а в том, что коммуникация односторонняя. А следовательно non-guarateed message delivery.
С email выходит еще хуже. Например, регулярно случается кейс "ой, шота рассылки перестали ходить"
P>>А в твоём случае этого L2 еще найти надо будет перекидыванием тикетов и форвардом емейлов. ·>Или трейсом по request-id. Техническая реализация не так важна.
Всё равно нужно искать ту самую команду, а уже потом внутри нее разбираться с произошедшим. То есть — два шага.
·>Верно. Но совершенно необязательно диагностику прокидывать по тому же каналу. ·>Более того, это не всегда технически возможно использовать тот же канал. Ты так и не предложил как это делать в отличных от REST request-response случаях Т.е. решение, как минимум, не универсальное, а значит всё равно понадобится другое решение.
Ровно то же, только рендерить будем не в хидер, а в энвелоп "диагностика: { варнинг: "<описание или ссылка или еще что>" }"
Re[67]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Кому ты емейлы слать будешь? На той стороне вполне себе возможна ситуация что N консумеров-клиентов-подразделений и чуть не все пользуются одними и теми же идентификаторами client,product,и тд. ·>Тому кто живёт на шаге 7 или 8.
Налицо какое-то неверное представление об устройстве вселенной.
Емейла того, кто живёт на шаге 7 или 8 у вас нет. И быть не может.
Всё, что вы знаете — это что application с id 22124c40-b22d-4269-b30c-2d0d3ffe5594 успешно логинится в ваш API и вызывает какой-то deprecated метод.
Ок, допустим, вы пошли куда-то в вашу систему регистраций, и выяснили, что приложение 22124c40-b22d-4269-b30c-2d0d3ffe5594 принадлежит клиенту Acme Inc, зарегистрировано в системе в 2016 году.
Дальше что? На какой адрес вы собрались писать письмо? На john.doe@acme.inc, который был указан при регистрации клиента в 2004?
Поздравляю, delivery failed: no such recipient. Джон уже много лет в Акме не работает. Более того, никто из тех, кто его застал, в Акме тоже не работает. Никто там понятия не имеет, на что там подписался Джон, кому ещё он дал ключи приложения, и как это всё применяется.
Наверное, вы, как ответственный сотрудник, пойдёте к к Director of Customer Success, и попросите у него имя Account Manager, который назначен на Acme, inc. В предположении, что у Acme вообще есть SAM или TAM, а не базовый контракт на поддержку.
Найденный вами account manager даст вам адрес актуального контакта из Acme Inc.
Скорее всего, это будет кто-то типа BizDev Manager — девочка, вся работа которой сводится к актуализации контрактов и передаче свежих реквизитов вашей компании в accounts payable.
Ни про какие API она не знает — ну, то есть она знает, что Acme, Inc у вашей конторы потребляет некий сервис. Но ни о версиях, ни о заголовках, ни об айпи адресах она с вами говорить не сможет — это вообще другая вселенная.
После серии писем вы сможете затащить её на zoom call, где глядя ей в глаза, с максимальной убедительностью будете говорить: "Поймите, Сьюзан, через три месяца мы отключаем этот сервис, и что-то на вашей стороне сломается". В следующий раз Сьюзан приведёт коллегу Меган, из legal, которая будет вам объяснять, что отключать сервис никак нельзя по условиям контракта. Что неустойка, которую они с вас слупят, превысит вашу выручку за пять лет и всё такое. Когда вы всё же прорвётесь через этот шторм из юридических терминов, и объясните, что вы просто переводите сервис на новую версию API, Меган скажет "ну, тогда раздел про непредоставление услуги неприменим, и с моей точки зрения всё ок", а вы останетесь один на один со Сьюзан, объяснять, что "нет, это не означает, что нет никакой проблемы".
Потом Сьюзан несколько недель будет искать в Acme, Inc того, кто занимается интеграциями. За эти несколько недель вы получите бездну информации о структуре бизнеса Acme, Inc., о хитросплетении обязанностей и границ ответственности — потому что Сьюзан вам будет таскать на звонки всех подряд, начиная с отдела разработки (нет, они не занимаются интеграциями с внешними сервисами; эти ребята пилят корпоративную систему фин.учёта и ни про какие API не знают), отдела развития (эти вообще модельки на питоне гоняют для анализа профилей активности кастомеров), IT отдела (неа), технического отдела (неа), и так далее.
Каждый раз на согласование митинга будет уходит много времени — все эти люди очень заняты и постоянно уходят в отпуска, из которых вы их ждёте.
А когда найдёт Джима, то тот уверенно вам сообщит, что беспокоиться не о чем, т.к. Acme уже перешла на новую версию вашего API ещё в феврале. На ваши робкие попытки вставить слова про то, что в логах до сих пор идут обращения от их приложения к старому API будут разбиваться о его уверенное "этого не может быть".
Ещё через месяц вы уже знаете не только структуру подразделений Акме, но и топологию их внутренней сети (жалкое зрелище), подробности personal life многих сотрудников (этим занималась Бекки, но она ушла в декрет, список серверов она должна была передать Полу, но не передала, потому что он переспал с Кейт, чего делать не должен был, хотя ребёнок у Бекки не от Пола), и много чего ещё.
Чего вы не знаете — так что за подсистема в Acme долбит ваш устаревший API с неослабевающей интенсивностью, и кто за неё отвечает.
Ваше предложение "тупо отключить его нахрен и всё — тогда-то и посмотрим, кто прибежит жаловаться" встречает резкое непонимание со стороны вашего руководства: "Вам разве Меган не объясняла, сколько будет стоить отказ в обслуживании? Что значит не можете найти — найдите, разберитесь, и помогите им перейти на новую версию".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[74]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>·>У тебя ровно то же: А вот через транспорт однозначно известно, что происходит — нажали кнопку "показать трейсы" и сразу нашли, что вон тот сервис принадлежит команде ххх. P>·>Или ты в прыжке переобуваешься? P>В моем случае это делает L2 той самой команды, что обслуживает конкретный сервис. А в твоём случае её еще найти надо, через те же самые трейсы, тк у тебя этот сервис изначально неизвестен. Что предложишь, форвардить мессагу всем L2 и попросить, что бы они разыскали каждый своё? Или нанять человека, кторый будет диспетчером работать?
Я предполагаю такой механизм уже должен существовать. Неужели у вас нет способа найти другую команду по request-id? Ведь коммуникация может понадобиться совершенно по какой-то другой причине. Без всяких варнингов. Ведь может быть они делают всё правильно, а у вас что-то не получается. Неужели хедер это единственный способ коммуникации?
P>>>·>Проблема в том, что у тебя в твоей схеме обрыв в коммуникации. До того как вам прибегут с прода злые клиенты ты не знаешь что происходит начиная с 4го шага. P>>>Если они прибегают, то мы спрашиваем у них request id и мы можем показать весь процессинг на нашей стороне. P>·>Вот именно. Т.е. хедер не особо то и нужен. P>У нас хидер нужден для другого кейса — мы им сообщаем что у них проблема.
Почему тогда они прибегают с прода?
P>>>При условии добросовестной реализации или использования нашего клиента можно ожидать P>·>Это слишком невероятное условие. Практически наверняка невыполнимое для тысяч консьюмеров. P>Это минимальное условие, которое можно себе позволить.
Звучит невероятно.
P>>>Отсюда ясно, что информирован будет L2 непосредственно того самого сервиса. P>·>Проблема не в том, кто информирован, а в том, что коммуникация односторонняя. А следовательно non-guarateed message delivery. P>С email выходит еще хуже. Например, регулярно случается кейс "ой, шота рассылки перестали ходить"
chase&escalate. Ведь email это двухсторонний канал. А хедер — односторонний. В этом основная беда.
P>>>А в твоём случае этого L2 еще найти надо будет перекидыванием тикетов и форвардом емейлов. P>·>Или трейсом по request-id. Техническая реализация не так важна. P>Всё равно нужно искать ту самую команду, а уже потом внутри нее разбираться с произошедшим. То есть — два шага.
Ты ж вроде заявлял, что у вас есть трейсы. С 0го шага вбиваешь request-id и трейсишь до той самой команды. И сразу на 6-7 шаг — на адрес их L2 или AD шлёшь мыло-джиру-whatever.
P>·>Верно. Но совершенно необязательно диагностику прокидывать по тому же каналу. P>·>Более того, это не всегда технически возможно использовать тот же канал. Ты так и не предложил как это делать в отличных от REST request-response случаях Т.е. решение, как минимум, не универсальное, а значит всё равно понадобится другое решение. P>Ровно то же, только рендерить будем не в хидер, а в энвелоп "диагностика: { варнинг: "<описание или ссылка или еще что>" }"
Ты так и не рассказал в энвелоп чего. Далеко не всегда есть конкретный response для данного request.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[68]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
P>>>Кому ты емейлы слать будешь? На той стороне вполне себе возможна ситуация что N консумеров-клиентов-подразделений и чуть не все пользуются одними и теми же идентификаторами client,product,и тд. S>·>Тому кто живёт на шаге 7 или 8. S>Налицо какое-то неверное представление об устройстве вселенной.
Я лишь следую тому что мне Pauel рассказывает.
S>А когда найдёт Джима, то тот уверенно вам сообщит, что беспокоиться не о чем, т.к. Acme уже перешла на новую версию вашего API ещё в феврале. На ваши робкие попытки вставить слова про то, что в логах до сих пор идут обращения от их приложения к старому API будут разбиваться о его уверенное "этого не может быть".
А предложенная альтернатива какая? Посылать им хедеры? Тогда будет уверенное: "что за хедеры? Мы не видели ничего". У Pauel было "давайте глянем ваши логи... Видите — варнинг такой, следовательно, вам надо обновить вашу конфигурацию". Как это реализуется вообще? Тебе придётся изучить не только структуру подразделений Акме, но и устройство сети, установленное ПО, версии и настройки ПО, систему конроля пермишеннов, ибо у Джима нужной роли не хватает, и ссылочка из его букмарков почему-то не работает, а там где он смотрит, ничего такого не видит.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Sinclair, Вы писали:
S>Ваше предложение "тупо отключить его нахрен и всё — тогда-то и посмотрим, кто прибежит жаловаться" встречает резкое непонимание со стороны вашего руководства: "Вам разве Меган не объясняла, сколько будет стоить отказ в обслуживании? Что значит не можете найти — найдите, разберитесь, и помогите им перейти на новую версию".
Ты невнимательно читаешь. Это ровно то, что происходит у Pauel: При траблшутинге они заинтересованы решать всё быстро тк они несут убыток, и все вопросы решаются буквально голосом..
Моё предложение: "Важно получить подверждение от всех клиентов, что они переписали свои приложения на новый API, успешно всё задеплоили и не собираются делать rollback."
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[69]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>А предложенная альтернатива какая? Посылать им хедеры?
Да, совершенно верно. В документации на сервис вы пишете про эти хедеры; в примерах клиентского кода к вашему API вы анализируете эти хедеры в тестовых методах; в клиентских биндингах на C#, Java, Python и Typescript вы прикручиваете интеграцию с лог-сервисами и метриками, в которые заливаете информацию про эти хедеры.
На звонках с разработчиками, которые пилят работу с вашим сервисом, вы объясняете, как важны хедеры с ворнингами — что вы начинаете троттлить тех, кто игнорирует много ворнингов, поэтому крайне желательно встраивать ассерты в интеграционные тесты на их стороне.
Поэтому когда Джон Доу в 2022 году сдаёт модуль интеграции с вами в службу эксплуатации Acme Inc и увольняется навсегда, на той стороне остаётся код, который в далёком 2030 году, когда нынешний API станет устаревшим, зажжот лампочку в дашборде Acme, inc.
И те же люди в Акме, которые звонят Сьюзан "поговори с этими орлами из точка-инк, у них медианный респонс тайм вылез за 700миллисекунд, что за ерунда???", заведут в ихней корпоративной жире (в которую вам, естественно, хода нет) тикет, и этот тикет будет блуждать по очередям и проектам, пока не попадёт к Бобу. Который, собственно, и починит проблему — причём когда он попробует собрать новую версию своего клиента, который ходит к вам, ему CI/CD не даст сделать коммит — интеграционные тесты в других местах API загорятся красненьким, потому что в каждом из них написано Assert.DoesNotContain("X-Api-Warning", response.Headers).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[69]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Моё предложение: "Важно получить подверждение от всех клиентов, что они переписали свои приложения на новый API, успешно всё задеплоили и не собираются делать rollback."
Погодите с подтверждением! Вы всё ещё не нашли почтовые адреса этих клиентов, чтобы их известить о новом API.
Как раз подтверждение на вашей стороне получить очень легко — просто смотрите в свои логи. Вот как только нету обращений к легаси API за какой-то период времени (например, месяц подряд) — ок, всё, можно тушить сервера.
И наоборот: есть в логах эти обращения — значит, гарантированно кто-то всё ещё пользуется API, не взирая на все предупреждения.
Это — гораздо надёжнее, чем любые письма от клиентов с любыми подтверждениями либо опровержениями.
Ситуация, когда клиент АПИ сам не знает, что он использует, а что — нет, — норма в нашем бизнесе.
Когда Microsoft внедрял новую схему авторизации в своём Partner Center API, то сначала они хотели просто отключить старую авторизацию через три месяцаа.
Через три месяца они поняли, что ничего не выйдет, и начали активно приглашать партнёров на звонки для обсуждения этой темы, где все партнёры согласно кивали головами "да-да, мы всё понимаем, мы работаем над этим" или даже "да мы давно уже всё перевели".
Ещё через три месяца они прикрутили в клиентский дашборд метрику "доля запросов, которая пользуется старой схемой авторизации".
Ещё через три месяца они доработали дашборд так, чтобы он показывал эту долю per application и per IP address — потому что партнёры в ужасе смотрели на вот эти "32%" и говорили "да мы уже ВЕЗДЕ посмотрели — всё заменено, всё суперновое, это какой-то глюк". Естественно, каждый раз находилась +1 команда на стороне партнёра, которая сидела себе там в башне, пряла шерсть, и знать не знала ни про какие запреты веретён. И пока их носом не ткнёшь: "вот, ваш же сервис нас тут долбит" — и выяснялось что-нибудь типа ежедневного отчёта, в который шесть лет назад прикрутили сбор данных через этот API. С тех пор отчёт давно изменили, данные PC API из него выкинули, но в датасет они по-прежнему собираются. О чём, естественно, не знает вообще никто из нынешних сотрудников.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[75]: Идемпотентность POST - хорошая ли практика?
мессагу всем L2 и попросить, что бы они разыскали каждый своё? Или нанять человека, кторый будет диспетчером работать? ·>Я предполагаю такой механизм уже должен существовать. Неужели у вас нет способа найти другую команду по request-id?
Ну если бы такой способ существовал — как бы он выглядел?
Как вы его себе представляете?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[75]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Я предполагаю такой механизм уже должен существовать. Неужели у вас нет способа найти другую команду по request-id?
У нас задача — емейл с request-id который надо отослать конкретной L2 команде. Расскажи, по шагам, как это всё будет работать от начала и до конца
Ты пока нигде подробно не показал это, только общие слова "емейл пошлём и всё"
P>>У нас хидер нужден для другого кейса — мы им сообщаем что у них проблема. ·>Почему тогда они прибегают с прода?
Вероятно, это ты сейчас пытаешься подменить тему. У нас кейс — мы уведомляем людей что у них есть некоторых проблемы на их стороне с их реквестами.
P>>Это минимальное условие, которое можно себе позволить. ·>Звучит невероятно.
Если это невероятно, то на емейлы полагаться вовсе не стоит — а ну как их зловред какой откажется форвардить или тикеты создавать?
P>>С email выходит еще хуже. Например, регулярно случается кейс "ой, шота рассылки перестали ходить" ·>chase&escalate. Ведь email это двухсторонний канал. А хедер — односторонний. В этом основная беда.
Ну вот не пришел тебе емейл. Твои действи? Кому ты чего будешь эскалировать? Наверное будешь боссам слать письма "мне ничо не пришло последние пять минут — может вы знаете, что у меня случилось?"
P>>Всё равно нужно искать ту самую команду, а уже потом внутри нее разбираться с произошедшим. То есть — два шага. ·>Ты ж вроде заявлял, что у вас есть трейсы. С 0го шага вбиваешь request-id и трейсишь до той самой команды. И сразу на 6-7 шаг — на адрес их L2 или AD шлёшь мыло-джиру-whatever.
До какой той? Твои трейсы работают в твоей сети. Их трейсы — в их сети. Максимум, что ты можешь получить — что реквест пришел через ваш api gateway или файрвол или лоадбалансер. Это и без трейса известно.
А надо по request-id который пришел тебе найти команду на той стороне. Расскажи подробно, что за механизм, и кто именно за это отвечает.
P>>Ровно то же, только рендерить будем не в хидер, а в энвелоп "диагностика: { варнинг: "<описание или ссылка или еще что>" }" ·>Ты так и не рассказал в энвелоп чего.
Зачем мне это? Ты уклоняешься показать свой вариант решения, но хочешь что бы я подробно рассказал тебе свое видение. Какой в этом смысл?
Re[70]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>А предложенная альтернатива какая? Посылать им хедеры? S>Да, совершенно верно. В документации на сервис вы пишете про эти хедеры; в примерах клиентского кода к вашему API вы анализируете эти хедеры в тестовых методах; в клиентских биндингах на C#, Java, Python и Typescript вы прикручиваете интеграцию с лог-сервисами и метриками, в которые заливаете информацию про эти хедеры.
А в итоге доки не читают, всем плевать на логи, т.к. и так всё работает. Не будут городить огород и выкинут все эти "ненужные навороты, которые только всё замедляют и в коде мешаются".
S>На звонках с разработчиками, которые пилят работу с вашим сервисом, вы объясняете, как важны хедеры с ворнингами — что вы начинаете троттлить тех, кто игнорирует много ворнингов,
Для троттлинга хедер посылать не надо.
S>поэтому крайне желательно встраивать ассерты в интеграционные тесты на их стороне.
В интеграционных тестах можно просто всё смело валить HTTP 400, насмерть роняя тест, а не скромно подсовывать хедер.
S>Поэтому когда Джон Доу в 2022 году сдаёт модуль интеграции с вами в службу эксплуатации Acme Inc и увольняется навсегда, на той стороне остаётся код, который в далёком 2030 году, когда нынешний API станет устаревшим, зажжот лампочку в дашборде Acme, inc.
Каком из дашбордов? И кто на этот дашборд смотрит? И реагирует ли на эти варнинги? С какой скоростью?
S>И те же люди в Акме, которые звонят Сьюзан "поговори с этими орлами из точка-инк, у них медианный респонс тайм вылез за 700миллисекунд, что за ерунда???",
И какую же роль тут сыграл хедер? У клиента убытки, т.к. всё стало медленно работать, и вдруг наконец-то зачесались. Устроить проблемы у клиентов можно и без хедера.
S>заведут в ихней корпоративной жире (в которую вам, естественно, хода нет) тикет, и этот тикет будет блуждать по очередям и проектам, пока не попадёт к Бобу. Который, собственно, и починит проблему — причём когда он попробует собрать новую версию своего клиента, который ходит к вам, ему CI/CD не даст сделать коммит — интеграционные тесты в других местах API загорятся красненьким, потому что в каждом из них написано Assert.DoesNotContain("X-Api-Warning", response.Headers).
Повторюсь, что для ингеграционных тестов из _нашего_ сервиса можно просто возвращать 4xx. А не полагаться что _их_ тесты содержат нужный ассерт или какой-нибудь там новый WAF не порезал неизвестные хедеры. Как правло тест на отсутствие чего либо — плохой тест, ненадёжный.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[70]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Моё предложение: "Важно получить подверждение от всех клиентов, что они переписали свои приложения на новый API, успешно всё задеплоили и не собираются делать rollback." S>Погодите с подтверждением! Вы всё ещё не нашли почтовые адреса этих клиентов, чтобы их известить о новом API. S>Как раз подтверждение на вашей стороне получить очень легко — просто смотрите в свои логи. Вот как только нету обращений к легаси API за какой-то период времени (например, месяц подряд) — ок, всё, можно тушить сервера. S>И наоборот: есть в логах эти обращения — значит, гарантированно кто-то всё ещё пользуется API, не взирая на все предупреждения.
Верно. Но для этого, внезапно, и хедер не нужен. Нужны только наши логи.
S>Это — гораздо надёжнее, чем любые письма от клиентов с любыми подтверждениями либо опровержениями.
Не надёжнее. Они могут решить откатиться, например.
S>Через три месяца они поняли, что ничего не выйдет, и начали активно приглашать партнёров на звонки для обсуждения этой темы, где все партнёры согласно кивали головами "да-да, мы всё понимаем, мы работаем над этим" или даже "да мы давно уже всё перевели". S>Ещё через три месяца они прикрутили в клиентский дашборд метрику "доля запросов, которая пользуется старой схемой авторизации". S>...
И они это сделали варниг-хедером? Какой из них warning header? И могу предположить, что дашборд хостился у самого майкрософта.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[76]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>мессагу всем L2 и попросить, что бы они разыскали каждый своё? Или нанять человека, кторый будет диспетчером работать?
Или тулзу соорудить для трейсинга.
Это очень зависит от конкретной инфраструктуры. У кого к чему есть доступ. Если всё тривиально как у Pauel, можно заглядывать в их логи, то вообще проблем не вижу — заходишь в логи и грепаешь по request-id.
S>·>Я предполагаю такой механизм уже должен существовать. Неужели у вас нет способа найти другую команду по request-id? S>Ну если бы такой способ существовал — как бы он выглядел? S>Как вы его себе представляете?
Ну например, ты сам рассказал как в башне пряли шерсть. Нашли же? И без хедера. ЧТД.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[77]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: ·>Это очень зависит от конкретной инфраструктуры. У кого к чему есть доступ. Если всё тривиально как у Pauel, можно заглядывать в их логи, то вообще проблем не вижу — заходишь в логи и грепаешь по request-id.
Это никак не зависит от конкретной инфраструктуры. В "их логи" вы заглядывать не сможете, ни при каких условиях. Заглядывать будут условные "они".
S>>Как вы его себе представляете? ·>Ну например, ты сам рассказал как в башне пряли шерсть. Нашли же? И без хедера. ЧТД.
Угу. Это заняло примерно полтора года. У компании, у которых ресурсов примерно столько, сколько у РФ.
Байки на эту тему я могу рассказывать долгими зимними вечерами, не повторяясь, несколько лет подряд.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[71]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
S>>И наоборот: есть в логах эти обращения — значит, гарантированно кто-то всё ещё пользуется API, не взирая на все предупреждения. ·>Верно. Но для этого, внезапно, и хедер не нужен. Нужны только наши логи.
Но без хедера в ваших логах всегда будут вызовы к старому API. И поддерживать его придётся и вам и вашим потомкам ·>Не надёжнее. Они могут решить откатиться, например.
Как откатились — так и накатятся. Старая версия тупо не пройдёт интеграционные тесты.
·>И они это сделали варниг-хедером? Какой из них warning header? И могу предположить, что дашборд хостился у самого майкрософта.
Нет, они пошли трудным путём. Если я плохо объяснил, то проговорю явно: это был отрицательный пример.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[71]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: ·>А в итоге доки не читают, всем плевать на логи, т.к. и так всё работает. Не будут городить огород и выкинут все эти "ненужные навороты, которые только всё замедляют и в коде мешаются".
Ну, тогда мы останемся наедине с вашим способом "давайте отправим письмо на несуществующий адрес".
·>Для троттлинга хедер посылать не надо.
И самого по себе его будет недостаточно, потому что всё, чего вы добъётесь — статьи на реддите "не пользуйтесь сервисом от точка-орг, у них пропускная способность два вызова в секунду".
·>В интеграционных тестах можно просто всё смело валить HTTP 400, насмерть роняя тест, а не скромно подсовывать хедер.
От вас опять ускользает простая мысль: интеграционные тесты гоняются на невашей стороне. С вашей стороны они неотличимы от прода, поэтому 400 означает просто отказ в обслуживании клиента.
·>Каком из дашбордов? И кто на этот дашборд смотрит? И реагирует ли на эти варнинги? С какой скоростью?
А это напрямую зависит от того, кто эксплуатирует ваш сервис. Если клиентам на него наплевать, то у них нет ни дашборда, ни метрик, ни логов, ни нужды в continuity. Начали вы им отдавать 400 — ну и хрен с ним, неважно.
Вот если у них mission critical application исполняется, то у них и дашборд, и мониторинг, и дежурный оператор на смене с телеграм-каналом, куда мониторинг валит события типа "сервис X начал плохо себя вести, надо бы разобраться". Задача, которую решает Pauel — дать таким ребятам механизм по построению таких дашбордов.
·>И какую же роль тут сыграл хедер? У клиента убытки, т.к. всё стало медленно работать, и вдруг наконец-то зачесались. Устроить проблемы у клиентов можно и без хедера.
Задача — перед устроением проблем устроить им ворнинги.
·>Повторюсь, что для ингеграционных тестов из _нашего_ сервиса можно просто возвращать 4xx. Расскажите, как вы отличите интеграционные тесты, выполняемые на стороне клиента, от настоящей эксплуатации. А заодно расскажите, что именно будут тестировать интеграционные тесты на вашей стороне.
·>А не полагаться что _их_ тесты содержат нужный ассерт или какой-нибудь там новый WAF не порезал неизвестные хедеры.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[78]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Это очень зависит от конкретной инфраструктуры. У кого к чему есть доступ. Если всё тривиально как у Pauel, можно заглядывать в их логи, то вообще проблем не вижу — заходишь в логи и грепаешь по request-id. S>Это никак не зависит от конкретной инфраструктуры. В "их логи" вы заглядывать не сможете, ни при каких условиях. Заглядывать будут условные "они".
И чем хедер поможет-то контролировать чужие логи?
S>>>Как вы его себе представляете? S>·>Ну например, ты сам рассказал как в башне пряли шерсть. Нашли же? И без хедера. ЧТД. S>Угу. Это заняло примерно полтора года. У компании, у которых ресурсов примерно столько, сколько у РФ.
Круто, но роль хедера не раскрыта.
...А вот был бы хедер, то они бы к обеду справились. Да?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[72]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>>>И наоборот: есть в логах эти обращения — значит, гарантированно кто-то всё ещё пользуется API, не взирая на все предупреждения. S>·>Верно. Но для этого, внезапно, и хедер не нужен. Нужны только наши логи. S>Но без хедера в ваших логах всегда будут вызовы к старому API. И поддерживать его придётся и вам и вашим потомкам
И с хедером — тоже.
S>·>Не надёжнее. Они могут решить откатиться, например. S>Как откатились — так и накатятся. Старая версия тупо не пройдёт интеграционные тесты.
Для этого не нужен хедер. Можно просто возвращать 404.
S>·>И они это сделали варниг-хедером? Какой из них warning header? И могу предположить, что дашборд хостился у самого майкрософта. S>Нет, они пошли трудным путём. Если я плохо объяснил, то проговорю явно: это был отрицательный пример.
А положительный пример есть?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[79]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: ·>И чем хедер поможет-то контролировать чужие логи?
Тем, что он в них будет.
Давайте развернём задачу.
Представьте себя разработчиком какого-то сервиса внутри Акме инк. Ваша компания ежесекундно зависит от нескольких сотен внешних API — курсы валют, валидация адресов в 52 странах присутствия, прогнозы погоды, формирование пакетов для отправки потребителям, управление виртуальными машинами в облаке, етк, етк.
Ваша задача — не пропустить момент, когда кто-то из сотен вендоров этих API соберётся что-то у себя менять, вы своевременно об этом узнали.
Как вы это сделаете?
·>Круто, но роль хедера не раскрыта. ·>...А вот был бы хедер, то они бы к обеду справились. Да?
Нет, уложились бы в изначально запланированные три месяца.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[73]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Для этого не нужен хедер. Можно просто возвращать 404.
И все-все, кто не успел проапгрейдиться, просто встанут? Ну, хорошо, когда вы так можете. В реальности это работает только для нишевых компаний, которые обоих своих клиентов знают лично.
Такой опыт у меня тоже есть — когда я баги в вызовах нашего АПИ чинил рукожопым партнёрам сам, просто сказав "вы задолбали, пришлите мне архив с вашим кодом, я покажу как надо".
За что, кстати, был подвергнут порицанию, и справедливо
S>>Нет, они пошли трудным путём. Если я плохо объяснил, то проговорю явно: это был отрицательный пример. ·>А положительный пример есть?
Положительного примера с large-scale API — нету. Поэтому я с большим вниманием читаю эту ветку, где опытные коллеги, уже побегавшие по тем же граблям, предлагают более совершенные решения известной мне проблемы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[80]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>И чем хедер поможет-то контролировать чужие логи? S>Тем, что он в них будет. S>Давайте развернём задачу. S>Представьте себя разработчиком какого-то сервиса внутри Акме инк. Ваша компания ежесекундно зависит от нескольких сотен внешних API — курсы валют, валидация адресов в 52 странах присутствия, прогнозы погоды, формирование пакетов для отправки потребителям, управление виртуальными машинами в облаке, етк, етк. S>Ваша задача — не пропустить момент, когда кто-то из сотен вендоров этих API соберётся что-то у себя менять, вы своевременно об этом узнали. S>Как вы это сделаете?
Повторюсь. Это административная задача, а не техническая. Хедером не решается.
Внезапно выяснится, что курсы валют у нас идут по multicast udp, где каждый бит на счету, и никаких хедеров да и вообще респонзов нет, а просто price stream.
Валидация адресов тебе по scp закачивают файлик, формат которого иногда немного меняется.
Пакеты отправляются раз в квартал и хедеры пришедшие два месяца назад никакого смысла уже не имеют.
Да и помимо тривиальных сообщений, что нечто deprecated, может быть множество других событий о работоспособности сервисов. Плановые отключения, смена настроек, сертификатов, и т.п. За всем надо следить.
Для каждого канала будет своя саппорт-команда с живыми людьми, которая скурпулёзно отслеживает все анонсы (по какому бы каналу они ни приходили). А шо делать? Какой-нибудь трейдинг использует сотню бирж по всему миру, и у каждой свой особенный протокол и особенности.
S>·>Круто, но роль хедера не раскрыта. S>·>...А вот был бы хедер, то они бы к обеду справились. Да? S>Нет, уложились бы в изначально запланированные три месяца.
Каким образом? Будет у тебя какой-нибудь REST-клиент в виде bash-скрипта с curl-ом. И пофиг на твой супер-хедер. Как ты блин заставишь _всех_ хотя бы тесты прогонять перед релизом? Даже майкрософту с их бюджетом это недоступно.
Т.е. конечно, хедер добавить можно. Но эффект будет прямо пропорционален сложности. В простых случаях он будет работать, но в простых случаях и без хедера просто. А в сложных случаях помогать не будет, только ложное чувство уверенности добавляет и API усложняет.
Так что вместо хедера можно просто в бубен ударять. Полезного эффекта будет ровно столько же.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[81]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
·>Для каждого канала будет своя саппорт-команда с живыми людьми, которая скурпулёзно отслеживает все анонсы (по какому бы каналу они ни приходили).
Стоимость решения представляете себе?
·>Каким образом? Будет у тебя какой-нибудь REST-клиент в виде bash-скрипта с curl-ом. И пофиг на твой супер-хедер. Как ты блин заставишь _всех_ хотя бы тесты прогонять перед релизом? Даже майкрософту с их бюджетом это недоступно.
У вас почему-то выбор строго между баш-скриптом с курлом, и отдельной саппорт-командой, которая 24х7 отслеживает блоги разработчиков, телеграм каналы, и вообще всё подряд.
Хотелось бы построить что-то менее дорогое, чем персональная команда на каждый API, и более надёжное, чем баш-скрипт.
·>Т.е. конечно, хедер добавить можно. Но эффект будет прямо пропорционален сложности. В простых случаях он будет работать, но в простых случаях и без хедера просто. А в сложных случаях помогать не будет, только ложное чувство уверенностпи добавляет и API усложняет.
Ну, всё возможно. Практика — критерий истины. Если у коллеги Pauel такое решение есть и работает, то как минимум я бы его отметать не стал.
Особенно с учётом того, что предлагаемое вами решение я проверял, и оно меня не устраивает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[82]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Для каждого канала будет своя саппорт-команда с живыми людьми, которая скурпулёзно отслеживает все анонсы (по какому бы каналу они ни приходили). S>Стоимость решения представляете себе?
Других вариантов нет, если нужна надёжная система.
Хедер не поможет.
S>·>Каким образом? Будет у тебя какой-нибудь REST-клиент в виде bash-скрипта с curl-ом. И пофиг на твой супер-хедер. Как ты блин заставишь _всех_ хотя бы тесты прогонять перед релизом? Даже майкрософту с их бюджетом это недоступно. S>У вас почему-то выбор строго между баш-скриптом с курлом, и отдельной саппорт-командой, которая 24х7 отслеживает блоги разработчиков, телеграм каналы, и вообще всё подряд. S>Хотелось бы построить что-то менее дорогое, чем персональная команда на каждый API, и более надёжное, чем баш-скрипт.
Я не сказал, что для каждого API должна быть отдельная персональная команда. Я сказал, что за анонсами каждого API должна следить команда. Это может быть одна команда, которая следит за всеми API.
Например, на одной из прошлых работ у была Market Connectivity team. Которая отвечала за всю ~сотню бирж. И там не только deprecated api (куда кстати, хедер пихать в какой-нибудь FIX — неясно), но и всякие аннонсы изменений в opening hours, holidays, data centre relocations, изменения в требованиях аудита, routing rules, переключения между dr/prd и т.д., т.п.
Упихать всё в хедеры — я не представляю какой монстр получится.
S>·>Т.е. конечно, хедер добавить можно. Но эффект будет прямо пропорционален сложности. В простых случаях он будет работать, но в простых случаях и без хедера просто. А в сложных случаях помогать не будет, только ложное чувство уверенностпи добавляет и API усложняет. S>Ну, всё возможно. Практика — критерий истины. Если у коллеги Pauel такое решение есть и работает, то как минимум я бы его отметать не стал.
Так не работает же. К нему с прода с убытками бегают, по его же словам.
S>Особенно с учётом того, что предлагаемое вами решение я проверял, и оно меня не устраивает.
Зато работает.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[83]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали: ·>Других вариантов нет, если нужна надёжная система. ·>Хедер не поможет.
Ну, если его нет — то да, не поможет.
Непонятно, чем будет плохо, если он есть.
·>Я не сказал, что для каждого API должна быть отдельная персональная команда. Я сказал, что за анонсами каждого API должна следить команда.
Вы сказали, что на каждый канал — по одной команде.
Я это интерпретирую так, что за анонсами PC API Microsoft (публикуются на специальной страничке под авторизацией) следит одна команда.
За анонсами S3 API Amazon — другая команда. И так далее.
·>Это может быть одна команда, которая следит за всеми API. ·>Например, на одной из прошлых работ у была Market Connectivity team. Которая отвечала за всю ~сотню бирж. И там не только deprecated api (куда кстати, хедер пихать в какой-нибудь FIX — неясно), но и всякие аннонсы изменений в opening hours, holidays, data centre relocations, изменения в требованиях аудита, routing rules, переключения между dr/prd и т.д., т.п.
Интересно, сколько было народу в этой команде. ·>Упихать всё в хедеры — я не представляю какой монстр получится.
Всё, наверное, не упихаешь. Но вот если мы хотим ввести какое-то ужесточение в существующем API (а это бывает очень часто), или там планируем перенести этот API на другой адрес/в другой DC, то можем это легко проанонсить при помощи тех самых warning. Ну вот появилось у вас в версии 1.2 API поле "адрес получателя денег". Сначала оно optional, чтобы не сломать существующих клиентов. Но — c warning. Чтобы был повод забеспокоиться.
Народ начинает осваивать обязательность, и в версии 1.3 оно становится обязательным, и те, кто игнорировал warninigs, получают 4хх с соответствующим объектом ошибки.
Постепенно клиенты привыкают обращать внимание на warnings, потому что это выгоднее, чем их игнорировать.
S>>Особенно с учётом того, что предлагаемое вами решение я проверял, и оно меня не устраивает. ·>Зато работает.
Как по мне — так нет. Регулярные опоздания с внедрением изменений на 12-18 месяцев — плохой результат. Надо лучше.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[84]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Sinclair, Вы писали:
S>·>Других вариантов нет, если нужна надёжная система. S>·>Хедер не поможет. S>Ну, если его нет — то да, не поможет. S>Непонятно, чем будет плохо, если он есть.
Затем, что это дополнительная функциональность, которую надо проектировать, документировать, тестировать, мейнтейнить и т.п. Плюс риск чего-нибудь поломать. Заспамить нечаяно мониторинг у кого-нибудь, например.
S>·>Я не сказал, что для каждого API должна быть отдельная персональная команда. Я сказал, что за анонсами каждого API должна следить команда. S>Вы сказали, что на каждый канал — по одной команде. S>Я это интерпретирую так, что за анонсами PC API Microsoft (публикуются на специальной страничке под авторизацией) следит одна команда. S>За анонсами S3 API Amazon — другая команда. И так далее.
Э, нет, конечно, да и зачем? Может я оговорился где-то, но не имел в виду такое.
S>·>Это может быть одна команда, которая следит за всеми API. S>·>Например, на одной из прошлых работ у была Market Connectivity team. Которая отвечала за всю ~сотню бирж. И там не только deprecated api (куда кстати, хедер пихать в какой-нибудь FIX — неясно), но и всякие аннонсы изменений в opening hours, holidays, data centre relocations, изменения в требованиях аудита, routing rules, переключения между dr/prd и т.д., т.п. S>Интересно, сколько было народу в этой команде.
Не помню, порядка 5 человек, вроде, в разных таймзонах чтобы. По сути работа не сложная, но нудная... разгребать письма, поддерживать актуальную инфу во всяких документах, да тикеты создавать; знать структуру бизнеса, кто куда как соединяется, етс.
S>·>Упихать всё в хедеры — я не представляю какой монстр получится. S>Всё, наверное, не упихаешь. Но вот если мы хотим ввести какое-то ужесточение в существующем API (а это бывает очень часто), или там планируем перенести этот API на другой адрес/в другой DC, то можем это легко проанонсить при помощи тех самых warning. Ну вот появилось у вас в версии 1.2 API поле "адрес получателя денег". Сначала оно optional, чтобы не сломать существующих клиентов. Но — c warning. Чтобы был повод забеспокоиться. S>Народ начинает осваивать обязательность, и в версии 1.3 оно становится обязательным, и те, кто игнорировал warninigs, получают 4хх с соответствующим объектом ошибки.
Так же можно "наказывать" тех, кто игнорирует емейлы. Вот только емейл будет один, а хедеров миллионы.
S>Постепенно клиенты привыкают обращать внимание на warnings, потому что это выгоднее, чем их игнорировать.
Возможно это и сработает в каких-то случаях, но как универсальное решение ну никак не годится. Так я и представил как в каждое из десятка миллиона сообщений в день вдруг мы запихнём какой-то хедер и заспамим логи и мониторинг.
S>>>Особенно с учётом того, что предлагаемое вами решение я проверял, и оно меня не устраивает. S>·>Зато работает. S>Как по мне — так нет. Регулярные опоздания с внедрением изменений на 12-18 месяцев — плохой результат. Надо лучше.
Так 12-18мес не потому что хедера не было, а потому что люди должны что-то делать. Как десяток тысяч людей заставить что-то сделать быстрее с помощью хедера — не очень понимаю.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[85]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
S>>Непонятно, чем будет плохо, если он есть. ·>Затем, что это дополнительная функциональность, которую надо проектировать, документировать, тестировать, мейнтейнить и т.п. Плюс риск чего-нибудь поломать. Заспамить нечаяно мониторинг у кого-нибудь, например.
Как найти тот самый емейл той самой команды — это вобщем тоже дополнительная функциональность, и надо всех опсов держать в курсе дел, что бы они не подломали рассылки.
И тестировать тоже надо — на тот случай, если с сервиса придет нотификация, нужны гарантии, что их получит нужна команда.
И документировать, и мейнтейнить — поменялся менеджер, надо добавить/удалить емейл из рассылки.
И всё это ручная работа.
Думаешь, человека посадил разгребать емейлы и это не надо тестировать?
S>>·>Например, на одной из прошлых работ у была Market Connectivity team. Которая отвечала за всю ~сотню бирж. И там не только deprecated api (куда кстати, хедер пихать в какой-нибудь FIX — неясно), но и всякие аннонсы изменений в opening hours, holidays, data centre relocations, изменения в требованиях аудита, routing rules, переключения между dr/prd и т.д., т.п. S>>Интересно, сколько было народу в этой команде. ·>Не помню, порядка 5 человек, вроде, в разных таймзонах чтобы. По сути работа не сложная, но нудная... разгребать письма, поддерживать актуальную инфу во всяких документах, да тикеты создавать; знать структуру бизнеса, кто куда как соединяется, етс.
То есть, ты предлагаешь на полную ставку держать цельную команду. Эдакий кол-центр, и с такой нудной работой люди как правило долго не выдерживают, а значит нужно постоянно иметь пул запасных, который надо постоянно пополнять.
Более того, поскольку они обслуживают чудовщиный трафик 100% времени то задержки неизбежны, — перерывы на обед, скорость работы человека-оператора и тд.
S>>Народ начинает осваивать обязательность, и в версии 1.3 оно становится обязательным, и те, кто игнорировал warninigs, получают 4хх с соответствующим объектом ошибки. ·>Так же можно "наказывать" тех, кто игнорирует емейлы. Вот только емейл будет один, а хедеров миллионы.
С емейлами у тебя человеческий фактор во всей красе. Емейл будет один — вот это не совсем ясно, с чего бы так. Похоже, здесь снова неявное предположение.
S>>Постепенно клиенты привыкают обращать внимание на warnings, потому что это выгоднее, чем их игнорировать. ·>Возможно это и сработает в каких-то случаях, но как универсальное решение ну никак не годится. Так я и представил как в каждое из десятка миллиона сообщений в день вдруг мы запихнём какой-то хедер и заспамим логи и мониторинг.
Это гораздо лучше, чем отослать десяток миллионов емейлов.
S>>Как по мне — так нет. Регулярные опоздания с внедрением изменений на 12-18 месяцев — плохой результат. Надо лучше. ·>Так 12-18мес не потому что хедера не было, а потому что люди должны что-то делать. Как десяток тысяч людей заставить что-то сделать быстрее с помощью хедера — не очень понимаю.
Ну должны. Ты думаешь бюджет, планы появятся с приходом одного емейла? А вот тесты прода, которые отвалились благодаря варнингам, или healthcheck, который так же отвалился благодаря варнингам, работают гораздо надежнее.
Здравствуйте, Pauel, Вы писали:
S>>>Непонятно, чем будет плохо, если он есть. P>·>Затем, что это дополнительная функциональность, которую надо проектировать, документировать, тестировать, мейнтейнить и т.п. Плюс риск чего-нибудь поломать. Заспамить нечаяно мониторинг у кого-нибудь, например. P>Как найти тот самый емейл той самой команды — это вобщем тоже дополнительная функциональность, и надо всех опсов держать в курсе дел, что бы они не подломали рассылки.
Это административная проблема, а не техническая.
P>И тестировать тоже надо — на тот случай, если с сервиса придет нотификация, нужны гарантии, что их получит нужна команда.
Для хедера эта проблема тоже стоит. Ибо система мониторинга тоже должна быть правильно настроена и за ней должна следить нужная команда.
P>И документировать, и мейнтейнить — поменялся менеджер, надо добавить/удалить емейл из рассылки. P>И всё это ручная работа. P>Думаешь, человека посадил разгребать емейлы и это не надо тестировать?
Хедер — это часть API, тестировать надо, это ясно. А ты что ещё предлагаешь тестировать?
S>>>·>Например, на одной из прошлых работ у была Market Connectivity team. Которая отвечала за всю ~сотню бирж. И там не только deprecated api (куда кстати, хедер пихать в какой-нибудь FIX — неясно), но и всякие аннонсы изменений в opening hours, holidays, data centre relocations, изменения в требованиях аудита, routing rules, переключения между dr/prd и т.д., т.п. S>>>Интересно, сколько было народу в этой команде. P>·>Не помню, порядка 5 человек, вроде, в разных таймзонах чтобы. По сути работа не сложная, но нудная... разгребать письма, поддерживать актуальную инфу во всяких документах, да тикеты создавать; знать структуру бизнеса, кто куда как соединяется, етс. P>То есть, ты предлагаешь на полную ставку держать цельную команду. Эдакий кол-центр, и с такой нудной работой люди как правило долго не выдерживают, а значит нужно постоянно иметь пул запасных, который надо постоянно пополнять. P>Более того, поскольку они обслуживают чудовщиный трафик 100% времени то задержки неизбежны, — перерывы на обед, скорость работы человека-оператора и тд.
Откуда возьмётся чудовищный трафик? Депрекация API это редкое событие, ну в худшем случае раз в месяц.
Даже если у приложения 1000 зависимостей (а это просто охренительно много), то 1000 емейлов в месяц 2-3 человека разгребут без проблем.
Другое дело, что емейлов будет несколько больше просто потому что емейлы сообщают больше информации, чем могут в себя уместить варнинги. А это значит, что кроме варнингов всё равно потребуется ещё некий канал связи.
S>>>Народ начинает осваивать обязательность, и в версии 1.3 оно становится обязательным, и те, кто игнорировал warninigs, получают 4хх с соответствующим объектом ошибки. P>·>Так же можно "наказывать" тех, кто игнорирует емейлы. Вот только емейл будет один, а хедеров миллионы. P>С емейлами у тебя человеческий фактор во всей красе. Емейл будет один — вот это не совсем ясно, с чего бы так. Похоже, здесь снова неявное предположение.
Ты почему-то предполагаешь, что на каждый response с варнингом надо посылать емейл. Нет, надо один емейл на каждый случай изменения функционирования в сервисе. Т.е. кол-во емейлов в худшем случае пропорционально кол-ву релизов сервиса.
S>>>Постепенно клиенты привыкают обращать внимание на warnings, потому что это выгоднее, чем их игнорировать. P>·>Возможно это и сработает в каких-то случаях, но как универсальное решение ну никак не годится. Так я и представил как в каждое из десятка миллиона сообщений в день вдруг мы запихнём какой-то хедер и заспамим логи и мониторинг. P>Это гораздо лучше, чем отослать десяток миллионов емейлов.
Даже если это случится (правда я не могу представить как), то это не уронит прод.
S>>>Как по мне — так нет. Регулярные опоздания с внедрением изменений на 12-18 месяцев — плохой результат. Надо лучше. P>·>Так 12-18мес не потому что хедера не было, а потому что люди должны что-то делать. Как десяток тысяч людей заставить что-то сделать быстрее с помощью хедера — не очень понимаю. P>Ну должны. Ты думаешь бюджет, планы появятся с приходом одного емейла? А вот тесты прода, которые отвалились благодаря варнингам, или healthcheck, который так же отвалился благодаря варнингам, работают гораздо надежнее.
Ты вначале расскажи, как бюджет и планы появляются с приходом одного хедера.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[87]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Как найти тот самый емейл той самой команды — это вобщем тоже дополнительная функциональность, и надо всех опсов держать в курсе дел, что бы они не подломали рассылки. ·>Это административная проблема, а не техническая.
Между административной и технической нет четкой границы. Конторы решают эти вопросы так, как могут, насколько позволяет бюджет, и тд и тд.
Административные вопросы большей частью автоматизируются, что есть решение техническими способами.
P>>И тестировать тоже надо — на тот случай, если с сервиса придет нотификация, нужны гарантии, что их получит нужна команда. ·>Для хедера эта проблема тоже стоит. Ибо система мониторинга тоже должна быть правильно настроена и за ней должна следить нужная команда.
Именно. И это наименьшее предположение, которое можно сделать. А вот ожидать, что диспетчеры емейлов будут реагировать оперативно 24/7 — это чудовищно большое предположение.
P>>И документировать, и мейнтейнить — поменялся менеджер, надо добавить/удалить емейл из рассылки. P>>И всё это ручная работа. P>>Думаешь, человека посадил разгребать емейлы и это не надо тестировать? ·>Хедер — это часть API, тестировать надо, это ясно. А ты что ещё предлагаешь тестировать?
Ты предложил диспетчеризацию емейлов переложить на некую команду. Вот её и надо тестировать. А если ты решишь автоматизировать такую деятельность, то внезапно окажется так, что автоматизировать емейлы окажется неффективным, т.к. и так слишком много рисков.
P>>Более того, поскольку они обслуживают чудовщиный трафик 100% времени то задержки неизбежны, — перерывы на обед, скорость работы человека-оператора и тд. ·>Откуда возьмётся чудовищный трафик? Депрекация API это редкое событие, ну в худшем случае раз в месяц. ·>Даже если у приложения 1000 зависимостей (а это просто охренительно много), то 1000 емейлов в месяц 2-3 человека разгребут без проблем. ·>Другое дело, что емейлов будет несколько больше просто потому что емейлы сообщают больше информации, чем могут в себя уместить варнинги. А это значит, что кроме варнингов всё равно потребуется ещё некий канал связи.
Ты понаделывал целую кучу предположений.
во первых, мы здесь не только про депрекацию апи. следовательно, емейлов будет много больше и обрабатывать их надо оперативнее.
во вторых, команда из 5 человек в пересчете на зп, налоги и прочие издержки, типа запасные игроки, и тд, съест намного бОльшее количество денег, чем добавление правила в мониторинг и покрытие интеграционными тестами
Теоретически, в емейл ты впихнешь чуть не все подряд. Ну и что? Нам то надо максимально быстрое реагирование, а не количество информации, которое свалится на L2. По барабану, сколько информации в емейле, если идет непрерывный поток таких емейлов.
·>Ты почему-то предполагаешь, что на каждый response с варнингом надо посылать емейл. Нет, надо один емейл на каждый случай изменения функционирования в сервисе. Т.е. кол-во емейлов в худшем случае пропорционально кол-ву релизов сервиса.
Во первых, один емейл спокойно может затеряться по целому ряду причин — вся твоя цепочка зависит от человеческого фактора.
Во вторых, ты рассматриваешь исключительно депрекейт апи. Варнингов может быть на самом деле гораздо больше, по ряду причин.
В третьих, в твоем варианте нет возомжности
1 запретить передеплоймент, например, старого клиента — только вручную "эй, не надо деплоить вон те версии, смотрите еще один список версий в другой рассылке полгода назад"
2 ограничить трафик от старых клиентов — вообще никак
То есть, ты топишь непойми за что
P>>Это гораздо лучше, чем отослать десяток миллионов емейлов. ·>Даже если это случится (правда я не могу представить как), то это не уронит прод.
И хидеры точно так же не уронят прод. Это нормальная фича в хттп апи, response headers, и мониторинг, логирование, итд умеют с этим справляться.
Более того, именно вызывающая сторона должна решать, что ей делать со странной ситуацией.
P>>Ну должны. Ты думаешь бюджет, планы появятся с приходом одного емейла? А вот тесты прода, которые отвалились благодаря варнингам, или healthcheck, который так же отвалился благодаря варнингам, работают гораздо надежнее. ·>Ты вначале расскажи, как бюджет и планы появляются с приходом одного хедера.
Очень просто — упали интеграционные тесты, т.к. интерграционные тесты прода получили варнинги. Релиз автоматически сдвигается, что как правило влечет за собой разбор полетов.
Другой пример — мониторинг покрасился красным, или из за варнингов, или из за тротлинга, или из за количества таймаутов, что влечет за собой разбор полетов, т.к. энд-юзеры начинают жаловаться в суппорт.
В твоем случае был один емейл полгода назад. И что? Я вот вижу, что игнор емейлов существует чуть ли не во всех крупных конторах.
Re[88]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>>>Как найти тот самый емейл той самой команды — это вобщем тоже дополнительная функциональность, и надо всех опсов держать в курсе дел, что бы они не подломали рассылки. P>·>Это административная проблема, а не техническая. P>Между административной и технической нет четкой границы. Конторы решают эти вопросы так, как могут, насколько позволяет бюджет, и тд и тд. P>Административные вопросы большей частью автоматизируются, что есть решение техническими способами.
Верно. Но ты почему-то настаиваешь, что именно одно конкретное техническое решение позволяет решить административную проблему, а остальные, почему-то не позволяют. Важен способ как применено техническое решение, а не решение само по себе. Если мониторинг есть, но за ним не следят или игнорируют — такая же беда, как и игнорирование емейлов|джиры|whatever.
P>>>И тестировать тоже надо — на тот случай, если с сервиса придет нотификация, нужны гарантии, что их получит нужна команда. P>·>Для хедера эта проблема тоже стоит. Ибо система мониторинга тоже должна быть правильно настроена и за ней должна следить нужная команда. P>Именно. И это наименьшее предположение, которое можно сделать. А вот ожидать, что диспетчеры емейлов будут реагировать оперативно 24/7 — это чудовищно большое предположение.
У тебя эти же диспечеры сидят на шаге 7-8.
P>>>Думаешь, человека посадил разгребать емейлы и это не надо тестировать? P>·>Хедер — это часть API, тестировать надо, это ясно. А ты что ещё предлагаешь тестировать? P>Ты предложил диспетчеризацию емейлов переложить на некую команду. Вот её и надо тестировать. А если ты решишь автоматизировать такую деятельность, то внезапно окажется так, что автоматизировать емейлы окажется неффективным, т.к. и так слишком много рисков.
Не очень ясно что такое "тестировать команду". Как вы тестируете свой L2 или девелоперов-менеджеров?
P>·>Откуда возьмётся чудовищный трафик? Депрекация API это редкое событие, ну в худшем случае раз в месяц. P>·>Даже если у приложения 1000 зависимостей (а это просто охренительно много), то 1000 емейлов в месяц 2-3 человека разгребут без проблем. P>·>Другое дело, что емейлов будет несколько больше просто потому что емейлы сообщают больше информации, чем могут в себя уместить варнинги. А это значит, что кроме варнингов всё равно потребуется ещё некий канал связи. P>Ты понаделывал целую кучу предположений. P>во первых, мы здесь не только про депрекацию апи. следовательно, емейлов будет много больше и обрабатывать их надо оперативнее.
Емейлов будет не больше, чем условий варнингов. Скорее на порядки меньше.
P>во вторых, команда из 5 человек в пересчете на зп, налоги и прочие издержки, типа запасные игроки, и тд, съест намного бОльшее количество денег, чем добавление правила в мониторинг и покрытие интеграционными тестами
Если в твоём приложении 1000 зависимостей, то значит у тебя уже довольно сложная система и там только девов будет десятки-сотни. +5 человек это будут доли процента от бюджета.
P>·>Ты почему-то предполагаешь, что на каждый response с варнингом надо посылать емейл. Нет, надо один емейл на каждый случай изменения функционирования в сервисе. Т.е. кол-во емейлов в худшем случае пропорционально кол-ву релизов сервиса. P>Во первых, один емейл спокойно может затеряться по целому ряду причин — вся твоя цепочка зависит от человеческого фактора.
chase&escalate.
P>Во вторых, ты рассматриваешь исключительно депрекейт апи. Варнингов может быть на самом деле гораздо больше, по ряду причин.
Можно примеры?
P>В третьих, в твоем варианте нет возомжности P>1 запретить передеплоймент, например, старого клиента — только вручную "эй, не надо деплоить вон те версии, смотрите еще один список версий в другой рассылке полгода назад"
404. Т.к. мы уже подтвердили голосом-емейлом, что чуваки окончательно зарелизились и избавились от старого клиента.
P>2 ограничить трафик от старых клиентов — вообще никак
А как хедеры ограничат трафик от старых клиентов?
P>>>Это гораздо лучше, чем отослать десяток миллионов емейлов. P>·>Даже если это случится (правда я не могу представить как), то это не уронит прод. P>И хидеры точно так же не уронят прод. Это нормальная фича в хттп апи, response headers, и мониторинг, логирование, итд умеют с этим справляться.
Надеюсь. Впрочем, я говорил о риске, а не о свершившемся событии. Емейлы не уронят прод, т.к. в принципе уронить прод не могут. А хедеры у вас не роняют прод, т.к. вы делаете всё без багов и хедеры ваши все баги гарантировано находят.
P>Более того, именно вызывающая сторона должна решать, что ей делать со странной ситуацией.
Хедер, как механизм спихнуть проблемы на клиента — вещь замечательная, но почему-то мне кажется, что это не самое правильное отношение к клиентам.
P>>>Ну должны. Ты думаешь бюджет, планы появятся с приходом одного емейла? А вот тесты прода, которые отвалились благодаря варнингам, или healthcheck, который так же отвалился благодаря варнингам, работают гораздо надежнее. P>·>Ты вначале расскажи, как бюджет и планы появляются с приходом одного хедера. P>Очень просто — упали интеграционные тесты, т.к. интерграционные тесты прода получили варнинги. Релиз автоматически сдвигается, что как правило влечет за собой разбор полетов.
Это вроде обсуждалось. Ронять интеграционные тесты надёжнее на стороне сервера.
Я не очень понял зачем гонять тесты в проде, но это не важно. Ты сам утвержал, что тесты в проде используют специальные аккаунты-настройки-етс. Следовательно можно просто отдавать 400 вместо варнинга для тестов и не полагаться на корректность ассертов на стороне консьюмеров; это гораздо надёжнее и проще.
P>Другой пример — мониторинг покрасился красным, или из за варнингов, или из за тротлинга, или из за количества таймаутов, что влечет за собой разбор полетов, т.к. энд-юзеры начинают жаловаться в суппорт.
Это уже эпикфейл, проблемы в проде. Доставить проблемы косньюмерам, заставить юзеров жаловаться можно и без хедера.
P>В твоем случае был один емейл полгода назад. И что? Я вот вижу, что игнор емейлов существует чуть ли не во всех крупных конторах.
chase&escalate.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
P>>Между административной и технической нет четкой границы. Конторы решают эти вопросы так, как могут, насколько позволяет бюджет, и тд и тд. P>>Административные вопросы большей частью автоматизируются, что есть решение техническими способами. ·>Верно. Но ты почему-то настаиваешь, что именно одно конкретное техническое решение позволяет решить административную проблему, а остальные, почему-то не позволяют.
Наоборот — я говорил о том, что решение обозначеной проблемы емейлами отсится сюда же. Вопрос только в том, какие эффективнее. И я тебе говорю о том, почему хидер варнинг эффективнее емейлов.
> Важен способ как применено техническое решение, а не решение само по себе. Если мониторинг есть, но за ним не следят или игнорируют — такая же беда, как и игнорирование емейлов|джиры|whatever.
Мониторинг так устроен, что за ним легче следить, чем за потоком емейлов. И емейлы могут перестать ходить по чисто человеческим причинам, что регулярно бывает.
P>>Именно. И это наименьшее предположение, которое можно сделать. А вот ожидать, что диспетчеры емейлов будут реагировать оперативно 24/7 — это чудовищно большое предположение. ·>У тебя эти же диспечеры сидят на шаге 7-8.
Твои диспетчеры нужны только для того, что бы найти ту самую L2 команду. И дальше они форвардят емейл L2 команде. В моем случае 6 и 8 это l2 команда, а фунукции диспетчеризации автоматизированы.
Это что, так трудно понять?
P>>Ты предложил диспетчеризацию емейлов переложить на некую команду. Вот её и надо тестировать. А если ты решишь автоматизировать такую деятельность, то внезапно окажется так, что автоматизировать емейлы окажется неффективным, т.к. и так слишком много рисков. ·>Не очень ясно что такое "тестировать команду". Как вы тестируете свой L2 или девелоперов-менеджеров?
Очень даже понятно — инструктаж, обучение, контроль, метрики типа "время обработки одного емейла". Например L1 суппорт, а твои диспетчеры это чтото навроде L1, именно так и работают.
P>>во первых, мы здесь не только про депрекацию апи. следовательно, емейлов будет много больше и обрабатывать их надо оперативнее. ·>Емейлов будет не больше, чем условий варнингов. Скорее на порядки меньше.
И это проблема. Клиент, у которого нет планов на передеплоймент, нет бюджета, нет команды, вдруг получил емейл. И что ему делать?
Через полгода это появилось. Им что, шерстить емейлы за полгода на предмет "а не было ли чего нибудь важного" от N вендоров API?
А вот если они теперь попытаются передеплить, то с варнингами их ждет отлуп.
P>>во вторых, команда из 5 человек в пересчете на зп, налоги и прочие издержки, типа запасные игроки, и тд, съест намного бОльшее количество денег, чем добавление правила в мониторинг и покрытие интеграционными тестами ·>Если в твоём приложении 1000 зависимостей, то значит у тебя уже довольно сложная система и там только девов будет десятки-сотни. +5 человек это будут доли процента от бюджета.
Ты путаешь команду разработки и команду эксплуатации. Эти диспетчеры есть часть команды эксплуатации, работают 24/7.
P>>·>Ты почему-то предполагаешь, что на каждый response с варнингом надо посылать емейл. Нет, надо один емейл на каждый случай изменения функционирования в сервисе. Т.е. кол-во емейлов в худшем случае пропорционально кол-ву релизов сервиса. P>>Во первых, один емейл спокойно может затеряться по целому ряду причин — вся твоя цепочка зависит от человеческого фактора. ·>chase&escalate.
Подробно расскажи, как обнаружить неполученное письмо, особенно, если ты не знаешь, а было ли оно послано.
Вот например, проверить, работает ли мониторинг, достаточно небольшой инструкции на той стороне.
А как этот кейс будет выглядеть с емейлами? Полагаю "каждые полчаса узнавать у диспетчеров, а не пропустили ли они что нибудь важное?"
P>>В третьих, в твоем варианте нет возомжности P>>1 запретить передеплоймент, например, старого клиента — только вручную "эй, не надо деплоить вон те версии, смотрите еще один список версий в другой рассылке полгода назад" ·>404. Т.к. мы уже подтвердили голосом-емейлом, что чуваки окончательно зарелизились и избавились от старого клиента.
Голосом-емейлом такое не подтверждается. Подтверждают только логи и метрика "вызовы старого апи" == 0 за последние 3 месяца.
P>>2 ограничить трафик от старых клиентов — вообще никак ·>А как хедеры ограничат трафик от старых клиентов?
Тебе уже рассказывали, но ты или не понимаешь, или не читаешь. Элементарно — есть хидер, делаем тротлинг.
P>>И хидеры точно так же не уронят прод. Это нормальная фича в хттп апи, response headers, и мониторинг, логирование, итд умеют с этим справляться. ·>Надеюсь. Впрочем, я говорил о риске, а не о свершившемся событии. Емейлы не уронят прод, т.к. в принципе уронить прод не могут. А хедеры у вас не роняют прод, т.к. вы делаете всё без багов и хедеры ваши все баги гарантировано находят.
Хидеры не роняют прод. Прод может уронить запоздалая реакция на проблему, которая намного вероятнее с человеком, нежели с автоматическим инструментом.
P>>Более того, именно вызывающая сторона должна решать, что ей делать со странной ситуацией. ·>Хедер, как механизм спихнуть проблемы на клиента — вещь замечательная, но почему-то мне кажется, что это не самое правильное отношение к клиентам.
Наоборот — именно клиент знает, как быть в случае той или иной ситуации. А обрубать внезапно, рубильником, только что 200, через секунду — 404 это далеко не самая лучшая стратегия.
P>>Очень просто — упали интеграционные тесты, т.к. интерграционные тесты прода получили варнинги. Релиз автоматически сдвигается, что как правило влечет за собой разбор полетов. ·>Это вроде обсуждалось. Ронять интеграционные тесты надёжнее на стороне сервера.
У нас кейс — не дать задеплоить приложение, которое использует депрекейтед апи. Ты читать то собираешься начать?
·>Я не очень понял зачем гонять тесты в проде, но это не важно. Ты сам утвержал, что тесты в проде используют специальные аккаунты-настройки-етс. Следовательно можно просто отдавать 400 вместо варнинга для тестов и не полагаться на корректность ассертов на стороне консьюмеров; это гораздо надёжнее и проще.
1 Снова у тебя проблема с ассертами. Ассерты должны быть на стороне сервера апи. Они говорят о том, что клиент делает чтото непотребное.
2 тесты прода на той стороне используют те же самые эндпойнты, конфиги и тд, будут разве что тестовые юзеры. Собственно тест прода — это тест сразу после деплоймента прода. Разница меньше некуда — только что какой нибудь тестовый юзерский аккаунт.
P>>Другой пример — мониторинг покрасился красным, или из за варнингов, или из за тротлинга, или из за количества таймаутов, что влечет за собой разбор полетов, т.к. энд-юзеры начинают жаловаться в суппорт. ·>Это уже эпикфейл, проблемы в проде. Доставить проблемы косньюмерам, заставить юзеров жаловаться можно и без хедера.
Алё — проблемы у вызывающей стороны, которую ты не контролируешь. С твоим продом всё в порядке.
P>>В твоем случае был один емейл полгода назад. И что? Я вот вижу, что игнор емейлов существует чуть ли не во всех крупных конторах. ·>chase&escalate.
Общие слова. Что сейчас делать, писать всем диспетчерам "эй, ребята, а не было ли у вас важного письма для нас за последние полгода?"
Re[90]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, Pauel, Вы писали:
P>·>Верно. Но ты почему-то настаиваешь, что именно одно конкретное техническое решение позволяет решить административную проблему, а остальные, почему-то не позволяют. P>Наоборот — я говорил о том, что решение обозначеной проблемы емейлами отсится сюда же. Вопрос только в том, какие эффективнее. И я тебе говорю о том, почему хидер варнинг эффективнее емейлов.
У хедера фатальный недостаток — это односторонний канал передачи. Ты посылаешь хедеры куда-то и никак не можешь узнать кто и как на них отреагировал. Т.е. хедер в принципе не может пофиксить эту административную проблему.
>> Важен способ как применено техническое решение, а не решение само по себе. Если мониторинг есть, но за ним не следят или игнорируют — такая же беда, как и игнорирование емейлов|джиры|whatever. P>Мониторинг так устроен, что за ним легче следить, чем за потоком емейлов. И емейлы могут перестать ходить по чисто человеческим причинам, что регулярно бывает.
Это конкретное устройство вашего мониторинга и вашего потока емейлов, а не закон природы.
P>>>Именно. И это наименьшее предположение, которое можно сделать. А вот ожидать, что диспетчеры емейлов будут реагировать оперативно 24/7 — это чудовищно большое предположение. P>·>У тебя эти же диспечеры сидят на шаге 7-8. P> Твои диспетчеры нужны только для того, что бы найти ту самую L2 команду. И дальше они форвардят емейл L2 команде. В моем случае 6 и 8 это l2 команда, а фунукции диспетчеризации автоматизированы. P>Это что, так трудно понять?
Мне трудно понять почему это у вас является проблемой, несмотря на то, что ты сам рассказал, что у вас уже есть все трейсы и даже доступ к чужим логам.
У нас это проблемой не является, хотя даже доступа к логам нет.
P>>>Ты предложил диспетчеризацию емейлов переложить на некую команду. Вот её и надо тестировать. А если ты решишь автоматизировать такую деятельность, то внезапно окажется так, что автоматизировать емейлы окажется неффективным, т.к. и так слишком много рисков. P>·>Не очень ясно что такое "тестировать команду". Как вы тестируете свой L2 или девелоперов-менеджеров? P>Очень даже понятно — инструктаж, обучение, контроль, метрики типа "время обработки одного емейла". Например L1 суппорт, а твои диспетчеры это чтото навроде L1, именно так и работают.
Это не тестирование. Ну по крайней мере в общепринятом понимании этого термина. Но впрочем, надёжная возможность трейсить запросы, контролируемая QA, конечно, нужна. И ты заявлял, что она у вас уже есть тоже. Следовательно ничего нового к вашему решению с хедерами добавлять не приходится.
P>>>во первых, мы здесь не только про депрекацию апи. следовательно, емейлов будет много больше и обрабатывать их надо оперативнее. P>·>Емейлов будет не больше, чем условий варнингов. Скорее на порядки меньше. P>И это проблема. Клиент, у которого нет планов на передеплоймент, нет бюджета, нет команды, вдруг получил емейл. И что ему делать? P>Через полгода это появилось. Им что, шерстить емейлы за полгода на предмет "а не было ли чего нибудь важного" от N вендоров API?
В случае хедеров, это означает, что их dashboard будет весь сверкать красным с тучей варнигов и юзеры жалуются в их техподдержку.
P>А вот если они теперь попытаются передеплить, то с варнингами их ждет отлуп.
Зачем они что-то будут пытаться передеплоить?
P>>>во вторых, команда из 5 человек в пересчете на зп, налоги и прочие издержки, типа запасные игроки, и тд, съест намного бОльшее количество денег, чем добавление правила в мониторинг и покрытие интеграционными тестами P>·>Если в твоём приложении 1000 зависимостей, то значит у тебя уже довольно сложная система и там только девов будет десятки-сотни. +5 человек это будут доли процента от бюджета. P>Ты путаешь команду разработки и команду эксплуатации. Эти диспетчеры есть часть команды эксплуатации, работают 24/7.
5 человек это по одному челу в каждой tz и пара прозапас на случай отпусков/етс.
P>>>·>Ты почему-то предполагаешь, что на каждый response с варнингом надо посылать емейл. Нет, надо один емейл на каждый случай изменения функционирования в сервисе. Т.е. кол-во емейлов в худшем случае пропорционально кол-ву релизов сервиса. P>>>Во первых, один емейл спокойно может затеряться по целому ряду причин — вся твоя цепочка зависит от человеческого фактора. P>·>chase&escalate. P>Подробно расскажи, как обнаружить неполученное письмо, особенно, если ты не знаешь, а было ли оно послано.
Посмотреть ли был у емейла reply.
P>Вот например, проверить, работает ли мониторинг, достаточно небольшой инструкции на той стороне.
Не достаточно. Надо, как минимум, чтобы эту инструкцию прочитали и исполнили без ошибок.
P>А как этот кейс будет выглядеть с емейлами? Полагаю "каждые полчаса узнавать у диспетчеров, а не пропустили ли они что нибудь важное?"
Поизучай как строятся надёжные процессы в message-driven системах.
P>>>В третьих, в твоем варианте нет возомжности P>>>1 запретить передеплоймент, например, старого клиента — только вручную "эй, не надо деплоить вон те версии, смотрите еще один список версий в другой рассылке полгода назад" P>·>404. Т.к. мы уже подтвердили голосом-емейлом, что чуваки окончательно зарелизились и избавились от старого клиента. P>Голосом-емейлом такое не подтверждается. Подтверждают только логи и метрика "вызовы старого апи" == 0 за последние 3 месяца. А потом они внезапно переключатся на DR-сайт, а там они забыли что-то проапдейтить.
Нет уж, логи могут лишь поддтвердить, что "вызовы старого апи" == 0 за последние 3 месяца, что очень важно для какого-нибудь сервиса, который работает раз в квартал. И всё.
И для этого хедеры не нужны. Нужны только логи.
P>>>2 ограничить трафик от старых клиентов — вообще никак P>·>А как хедеры ограничат трафик от старых клиентов? P>Тебе уже рассказывали, но ты или не понимаешь, или не читаешь. Элементарно — есть хидер, делаем тротлинг.
Это тротлинг ограничит трафик, а не хедер. С таким же успехом можно в бубен бить. "В бубен ударили, делаем тротлинг".
P>>>И хидеры точно так же не уронят прод. Это нормальная фича в хттп апи, response headers, и мониторинг, логирование, итд умеют с этим справляться. P>·>Надеюсь. Впрочем, я говорил о риске, а не о свершившемся событии. Емейлы не уронят прод, т.к. в принципе уронить прод не могут. А хедеры у вас не роняют прод, т.к. вы делаете всё без багов и хедеры ваши все баги гарантировано находят. P>Хидеры не роняют прод. Прод может уронить запоздалая реакция на проблему, которая намного вероятнее с человеком, нежели с автоматическим инструментом.
Бинго. И хедеры никак не влияют не реакцию. Ибо они не позволяют увидеть эту реакцию.
P>>>Более того, именно вызывающая сторона должна решать, что ей делать со странной ситуацией. P>·>Хедер, как механизм спихнуть проблемы на клиента — вещь замечательная, но почему-то мне кажется, что это не самое правильное отношение к клиентам. P>Наоборот — именно клиент знает, как быть в случае той или иной ситуации. А обрубать внезапно, рубильником, только что 200, через секунду — 404 это далеко не самая лучшая стратегия.
Таким образом обрубать тесты — самая лучшая стратегия.
А обрубать по "вызовы старого апи" == 0 — тоже не самая лучшая стратегия.
P>>>Очень просто — упали интеграционные тесты, т.к. интерграционные тесты прода получили варнинги. Релиз автоматически сдвигается, что как правило влечет за собой разбор полетов. P>·>Это вроде обсуждалось. Ронять интеграционные тесты надёжнее на стороне сервера. P> У нас кейс — не дать задеплоить приложение, которое использует депрекейтед апи. Ты читать то собираешься начать?
Вы же после во время деплоя прогоняете тесты? Ну вот и роняйте их 404, чтобы деплой провалить.
P>·>Я не очень понял зачем гонять тесты в проде, но это не важно. Ты сам утвержал, что тесты в проде используют специальные аккаунты-настройки-етс. Следовательно можно просто отдавать 400 вместо варнинга для тестов и не полагаться на корректность ассертов на стороне консьюмеров; это гораздо надёжнее и проще. P>1 Снова у тебя проблема с ассертами. Ассерты должны быть на стороне сервера апи. Они говорят о том, что клиент делает чтото непотребное.
404 это тоже сторона сервера.
P>2 тесты прода на той стороне используют те же самые эндпойнты, конфиги и тд, будут разве что тестовые юзеры. Собственно тест прода — это тест сразу после деплоймента прода. Разница меньше некуда — только что какой нибудь тестовый юзерский аккаунт.
Whatever. Вот для тестовых юзеров и возвращайте 4xx.
P>>>Другой пример — мониторинг покрасился красным, или из за варнингов, или из за тротлинга, или из за количества таймаутов, что влечет за собой разбор полетов, т.к. энд-юзеры начинают жаловаться в суппорт. P>·>Это уже эпикфейл, проблемы в проде. Доставить проблемы косньюмерам, заставить юзеров жаловаться можно и без хедера. P>Алё — проблемы у вызывающей стороны, которую ты не контролируешь. С твоим продом всё в порядке.
Это потому что ты бессовестно спихнул проблему на вызывающую сторону. Тот факт, что у вызывающей стороны возникли проблемы после _твоих_ действий (deprecated api — это твои изменения), говорит, что это проблема твоя. И это твой эпик фейл, что ты не смог разрешить эту проблему до того, как она вызвала жалобы пользователей.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[91]: Идемпотентность POST - хорошая ли практика?
Здравствуйте, ·, Вы писали:
P>>Наоборот — я говорил о том, что решение обозначеной проблемы емейлами отсится сюда же. Вопрос только в том, какие эффективнее. И я тебе говорю о том, почему хидер варнинг эффективнее емейлов. ·>У хедера фатальный недостаток — это односторонний канал передачи. Ты посылаешь хедеры куда-то и никак не можешь узнать кто и как на них отреагировал. Т.е. хедер в принципе не может пофиксить эту административную проблему.
И с емейлом ровно то же — шлешь емейл и даже не в курсе, дойдет ли он, будет ли он прочитан вовремя, будет ли прочитан вообще.
Разница только в том, что решение на хидерах позволяет автоматизировать весь цикл траблшутинга. А вот с емейлами такого хоть тресни, не будет. Емейлы хорошо работают только в идеальном мире.
P>>Мониторинг так устроен, что за ним легче следить, чем за потоком емейлов. И емейлы могут перестать ходить по чисто человеческим причинам, что регулярно бывает. ·>Это конкретное устройство вашего мониторинга и вашего потока емейлов, а не закон природы.
Это именно что закон природы, т.к. в разных конторах ситуация примерно одна и та же.
Свежий пример — несколько не мог восстановить доступ к фейсбуку, т.е. их емейл до меня тупо недоходил. У них — фейсбук, у меня — gmail. Даже обращение в суппорт не помогало. Разрешилось чисто случайно — по прошествии N лет я вдруг начал получать спам от фейсбука. Попробовал ресетнуть пароль и сразу же увидел их письмо в инбоксе.
Вот так работает твой емейл. Кого винить — фейсбук, gmail, еще кого — без понятия.
P>>Это что, так трудно понять? ·>Мне трудно понять почему это у вас является проблемой, несмотря на то, что ты сам рассказал, что у вас уже есть все трейсы и даже доступ к чужим логам.
Ты ухитряешься вычитывать вплоть до наоборот. Доступа к трейсам на той стороне, логам на той стороне просто так ни у кого нет.
P>>Очень даже понятно — инструктаж, обучение, контроль, метрики типа "время обработки одного емейла". Например L1 суппорт, а твои диспетчеры это чтото навроде L1, именно так и работают. ·>Это не тестирование. Ну по крайней мере в общепринятом понимании этого термина. Но впрочем, надёжная возможность трейсить запросы, контролируемая QA, конечно, нужна. И ты заявлял, что она у вас уже есть тоже. Следовательно ничего нового к вашему решению с хедерами добавлять не приходится.
Именно, что ничего нового к решению с хидерами добавлять не нужно. А вот с твоей командой нужны особые приседания приседания
1. понанимать людей в разных таймзонах, сиречь в разных странах
2. понанимать запасных
3. обучить
4. приставить менеджера, который будет обслуживать эту команду
Все нормальные конторы стараются избавлятся от таких команд, заменяя их на автоматические решения. Может вам курьеров нанять, что бы почту носили, понадёжнее всё таки
P>>Через полгода это появилось. Им что, шерстить емейлы за полгода на предмет "а не было ли чего нибудь важного" от N вендоров API? ·>В случае хедеров, это означает, что их dashboard будет весь сверкать красным с тучей варнигов и юзеры жалуются в их техподдержку.
Именно!
P>>А вот если они теперь попытаются передеплить, то с варнингами их ждет отлуп. ·>Зачем они что-то будут пытаться передеплоить?
Обычные изменения, поменялась конфигурация, появились секюрити апдейты, переходят на другой хостинг. И проблема становится видна в очередной раз сразу всем причастным.
P>>Ты путаешь команду разработки и команду эксплуатации. Эти диспетчеры есть часть команды эксплуатации, работают 24/7. ·>5 человек это по одному челу в каждой tz и пара прозапас на случай отпусков/етс.
И это только для того, что бы емейлы добирались до нужных людей
P>>Подробно расскажи, как обнаружить неполученное письмо, особенно, если ты не знаешь, а было ли оно послано. ·>Посмотреть ли был у емейла reply.
Похоже, ты вообще не читаешь Еще раз — у тебя inbox пустой. Как узнать, а он и должен быть пустым или там должны быть письма(те что потерялись)?
P>>Вот например, проверить, работает ли мониторинг, достаточно небольшой инструкции на той стороне. ·>Не достаточно. Надо, как минимум, чтобы эту инструкцию прочитали и исполнили без ошибок.
Это минимальное предположение — что люди будут следовать простым инструкциям. Т.е. предполагаем, что сотрудники добросовестные, а не саботёры.
С емейлами надо предположить наличие цельной команды в разных часовых поясах, запасных людей на бенче и менеджер-два которые обслуживают её.
P>>А как этот кейс будет выглядеть с емейлами? Полагаю "каждые полчаса узнавать у диспетчеров, а не пропустили ли они что нибудь важное?" ·>Поизучай как строятся надёжные процессы в message-driven системах.
То есть, тебе нечего сказать
P>>Голосом-емейлом такое не подтверждается. Подтверждают только логи и метрика "вызовы старого апи" == 0 за последние 3 месяца. ·> А потом они внезапно переключатся на DR-сайт, а там они забыли что-то проапдейтить.
Внезапно никто не переключается.
·>Нет уж, логи могут лишь поддтвердить, что "вызовы старого апи" == 0 за последние 3 месяца, что очень важно для какого-нибудь сервиса, который работает раз в квартал. И всё. ·>И для этого хедеры не нужны. Нужны только логи.
С чего ты взял, что раз в квартал? Снова с потолка?
P>>Тебе уже рассказывали, но ты или не понимаешь, или не читаешь. Элементарно — есть хидер, делаем тротлинг. ·>Это тротлинг ограничит трафик, а не хедер. С таким же успехом можно в бубен бить. "В бубен ударили, делаем тротлинг".
Именно. А тротлинг включается при наличии хидера. Об этом тебе уже говорили.
P>>Хидеры не роняют прод. Прод может уронить запоздалая реакция на проблему, которая намного вероятнее с человеком, нежели с автоматическим инструментом. ·>Бинго. И хедеры никак не влияют не реакцию. Ибо они не позволяют увидеть эту реакцию.
Наоборот — хидеры позволяют автоматизировать чуть не всё, навесить дополнительные капабилити, типа того же тротлинга, мониторинга, логов и тд и тд и тд.
Соответсвенно, лампочка в мониторинге загорится сразу. А в твоём случае — может да, может нет. Может сейчас. А может когда менеджер той команды кому то пистон вставит.
P>>Наоборот — именно клиент знает, как быть в случае той или иной ситуации. А обрубать внезапно, рубильником, только что 200, через секунду — 404 это далеко не самая лучшая стратегия. ·>Таким образом обрубать тесты — самая лучшая стратегия.
Вы там похоже тем и заняты, что обрубаете тесты "а они только время тратят"
P>> У нас кейс — не дать задеплоить приложение, которое использует депрекейтед апи. Ты читать то собираешься начать? ·>Вы же после во время деплоя прогоняете тесты? Ну вот и роняйте их 404, чтобы деплой провалить.
И после деплоя, и после изменений у 3rd-party, инфраструктуры, и даже в моменты пиковой нагрузки.
P>>1 Снова у тебя проблема с ассертами. Ассерты должны быть на стороне сервера апи. Они говорят о том, что клиент делает чтото непотребное. ·>404 это тоже сторона сервера.
Это неприемлемо для консумера. Если можно кидать ошибки направо-налево, оно конечно просто — консумер сам винова. Штука в том, что 60-70% приложений это старые приложения, деплоились вообще хрен знает когда. Ломать крайне нежелательно.
P>>2 тесты прода на той стороне используют те же самые эндпойнты, конфиги и тд, будут разве что тестовые юзеры. Собственно тест прода — это тест сразу после деплоймента прода. Разница меньше некуда — только что какой нибудь тестовый юзерский аккаунт. ·>Whatever. Вот для тестовых юзеров и возвращайте 4xx.
Это значит, что система будет работать по разному для тестовых юзеров и реальных. Т.е. ты не знаешь, а как же она себя поведет для реальных юзеров.
·>Это потому что ты бессовестно спихнул проблему на вызывающую сторону.
А мне кажется, что ты своими емейлами делаешь именно это — используешь заведомо ненадежный канал.