• Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    ключ идемпонентности (Idempotence-Key) и id платежа (payment_id) - это разные вещи. Вы чего?

    Возможно - мне лень читать всю доку.

    Упростим просто для примера Idempotence-Key до номера договора.

    Если у вас УЖЕ есть уникальное поле, которое можно использовать как параметр идемпотентности, тогда ваш изначальный вопрос как его хранить или как генерировать вообще о чем? Вы не знаете как хранить номер договора? Или что значит "что использовать для ключа идемпотентности" - у вас же номер договора?

    Мдяяяя мама была права. Сколько лет то говорите?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Зачем, по вашему, создавать новый объект платежа, если данные неизменны?

    Потому что реализация идемпотентности требует ресурсов сервера? А если у вас не поделка на 3 пользователей в год к таким вещам стоит относится бережно? Потому что реализация идемпотентности требует дополнительного кода? А если у вас кодовая база не на 5 строк, а на сотни тысяч или миллионы - не нужный функционал это плохо? Потому что реализация идемпотентности требует времени программиста? А если у вас зп не аникейщика 50к в месяц, а нормальный миддл от 150к, этот праздник за их счет не нужен конторе?

    Зачем API ЮКассы обеспечивает идемпонентность запросов в 100% случаев?
    Напомню, что вы не сможете обратиться к API ЮКассы без ключа. Никак.

    АПИ ЮКассы имеет возможность идемпонентности запросов. Но обязательным оно не является что можно увидеть в доке, или в коде оф. библиотеки. Сам id платежа, ну или ключ в этой дискуссии - является обязательным потому что именно по нему вы будете обмениваться с ЮКассой о том успешен ли ваш платеж или нет.

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

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

    Мужчину судят за самогоноварение, так как нашли у него дома самогонный аппарат.
    - Вы признаете, что гоните самогон?
    - Нет, не гоню!
    - Аппарат есть, значит гоните!
    - Не гоню!
    - Ваше последнее слово!
    - Прошу судить меня также и за изнасилование!
    - А вы еще и кого-то изнасиловали?!
    - Нет, но аппарат есть!


    Требование такое, чтобы по одному и тому же номеру договора, платеж может быть только один.
    Это годами устоялось, клиент привык к такому поведению и осознанно не желает это менять.
    Привык, т.к. основной метод приема платежей работает именно так, ЮКасса подключается как дополнительный, альтернативный способ.

    Он и будет один. У вас будет сто попыток платежа, и только один успешный - который и будет считаться собственно платежом. То что у ста прежних попыток платежа будет тот же номер договора - вам как мешать то будет? Вы собираетесь строить пользователю список не успешных платежей? Или чего? Как это вообще может коснуться пользователя?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Я не спрашивал нужна или нет. Вы не найдете такого вопроса здесь.

    Вы спросили как ее реализовать - вам задали вопрос - нахрена.

    Итак - я НЕ смогу ответить вам более подробно, чем описано в статье "Стажёр Вася и его истории об идемпотентности API", ссылку на которую я давал вам выше.

    И в 3 раз вам говорят, в вашей статье вызов АПИ блочит ресурсы, меняет состояние обьектов, вне зависимости от того успешный он или нет. Там нужна идемпотентность потому что 100 запросов утерянных по пути - приведет к тому что все ресурсы будут заблокированы, и даже сам клиент не сможет ими воспользоваться - не говоря о других клиентах. В вашем случае запрос ничего не заблокирует, если он не успешен, вы можете отправить миллион не успешных запросов - это никак не изменит состояние ресурсов, обьектов, ровно до того момента как запрос не станет успешным, как он только станет успешным вам прилетит постбэк абсолютно не связанный с плохим интернетом клиента. То есть в статье описана одна ситуация, в вашей конкретно ситуации совершенно другая. Не я понимаю что слово идемпотентность красивое звонкое, но в айти любой подход, любой инструмент, любой паттерн/антипаттерн имеет свою область применения. И вашем случае разница между этим двумя вариантами ровно одна - второй вариант потребует чуть больше кода. Все, точка - области применения нет. Выгод вы с этого не получите, только нарушение принципа KISS - Keep It Simple, Stupid - не надо тащить функционал поверх необходимого. Этот вывод можно было сделать по первому моему вопросу, если бы вы взяли на себя труд задуматься.
    По этому вы не ответили. вопрос звучал как "В чем КОНКРЕТНО в вашей ситуации". Я даже выделили заглавными буквами. Окей давайте подчеркну еще раз:
    В чем КОНКРЕТНО в вашей ситуации 2 вариант будет иметь преимущество? Две строки, один вопрос. Сможете осилить?

    Зачем яндексу - видно из статьи. Блокировка ресурсов. Более того я и раньше знал зачем нужна идемпотентность. Но мы говорим о вашем конкретном случае - обращении к АПИ платежного шлюза ЮКассы. В вашем конкретном случае - выгода в чем?

    З.Ы. Слушайте если не секрет - сколько вам лет? Обьясняю контекст вопроса - у меня мама заслуженный учитель, высшая категория, все регалии, все дела. Слава богу давно уже на пенсии, но тем не менее - у нас есть с ней давний спор, она говорит что нынешняя молодежь имеет "клиповое мышление", оно не в состоянии строить цепочки. Я всегда отвечал что мол каждое прежнее поколение ныло что молодежь глупеет. Но вот я встретил вас, человека который умудрился заблудиться в 3 фактах, и мне тупо интересно - я уже проиграл или нет?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Вы вообще со мной разговариваете? Ответы сервиса видите? - Нет!!! Сервис НЕ будет генерить ключ. Вообще. Никак. Точка! Он будет возвращать "invalid_request". Очнитесь.

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

    На этом все. Дальше можно только ходить по кругу.

    А давайте совсем просто. Что бы моя младшая дочь смогла осилить. Берем две ситуации:

    1. Ложим болт на имподентность - генерим ключ при каждой попытке оплаты. Отправляем каждый раз новый ключ.
    2. Не ложим болт на имподентность - генерим ключ один раз, сохраняем его, или пишем какую нибудь функцию генерации на основе какого нибудь Order ID, и его содержимого и отправляем один и тот же ключ.

    В чем КОНКРЕТНО в вашей ситуации 2 вариант будет иметь преимущество? Две строки, один вопрос. Сможете осилить?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    спасибо, но это именно то, что я вам скидывал и хотел, чтобы вы прочитали. Вы молодец, справились.
    Буду спать спокойно.

    Т.е. через оф. клиента платеж будет создан в любом случае, это видно в исходниках и я провел тесты.
    Да при каждой попытке оплаты они будут генерить ключ. Имподентности нет и хрен с ней. Можете считать что Idempotence-Key это у вас какой то Invoice Id. Никакая имподентность вам нахрен не нужна. Каждый раз тупо генерите ключ.

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

    Клиент зашел на оплату вы сгенереровали ключ - отправили запрос, запрос сдох в пути, клиент вернулся вы сгенерировали еще раз - и так пока клиент не вылезет из туннеля и не дойдет до успеха в платеже. После этого вам на интернет клиента становится плевать - ибо вам на postback url прилетит уведомление от шлюза что платеж с таким то ключом успешен - бабло зачислено, вы помечаете заказ или что у вас там - оплаченым и клиент внезапно увидит что заказ оплачен и кнопочка оплатить не активна. Алллилуя. Ровно как в оф библиотеке. При этом да. Внезапно этот ключ будет необходим - потому что платежный шлюз хочет быть увереным в том что вы его где то храните и когда вам прилетит уведомление об успешной оплате или неуспешной - вы сможете это обработать

    ИИИИИИ вопрос повторяется - зачем вам этот гемморой с повторным использованием ключа? Какие ресурсы вы блокируете что бы париться? Бабки клиента? Уверяю вас если найдется платежный шлюз который будет так обращаться с бабками клиента - он вылетит в трубу. В чем цимес? Какова прибыль? Зачем? Почему? Сядьте и подумайте.

    Стоят верблюд-сын и верблюд-отец. Сын спрашивает:
    — Папа, а зачем нам на спине нужен горб?
    — В горбу, сынок мы накапливаем воду. Когда мы идём по пустыне, нас не мучает жажда.
    — Папа, а зачем нам такие копыта?
    — Это чтобы в пустыне ноги не проваливались в песок.
    — А зачем нам такие большие и жёсткие губы?
    — Это чтобы в пустыне можно было есть колючки.
    — Тогда, папа, объясни мне, на кой чёрт нам весь этот тюнинг в Саратовском зоопарке?..

    И так. Нахрена вам повторное использование ключа?

    Вы, возможно, скажете, мол как же так

    Я вам скажу одну вещь точно. Если вы пришли на какой то ресурс за помощью и вам внезапно задают вопросы - это не потому что кто то что то не знает. А потому что пытаются уточнить контекст задачи, ибо серебрянной пули не существует - и в одном контексте это решение будет необходимом, в другом - нахер не нужным. По этому не стоит им давать ссылки на статьи, обьяснять какие то термины - нужно обьяснять контекст. В вашем случае - вот уже нцатое время вы не можете обьяснить зачем вам горб в саратовском зоопарке
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov,
    Расскажите потом, удалось убедить разрабов сервиса, что ключ не нужен, лишний и вот эту историю с собакой. Тут всем будет полезно.

    Обязательно. Но тут в чем трабла, попробую обьяснить проще. Ключ идемпонентности, будет ключом идемпонентности только в случае того что вы его будете хранить и использовать в повторных запросах. А без этого это будет банальный id запроса без которого никуда. А если взять и пойти чуток дальше первой строчки документации: это можно прочитать
    Если вы повторяете запрос с теми же данными и тем же ключом, API обрабатывает его как повторный. Если данные в запросе те же, а ключ идемпотентности отличается, запрос выполняется как новый.


    А если открыть скажем официальную библиотеку для работы с юкассой можно встретить код:

    if ($idempotenceKey) {
                $headers[self::IDEMPOTENCY_KEY_HEADER] = $idempotenceKey;
            } else {
                $headers[self::IDEMPOTENCY_KEY_HEADER] = UUID::v4();
            }

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

    Иииии так - нахрена? У вас остались подсказки - помощь зала, звонок другу и 50 на 50

    З.Ы. Чего нибудь включилось? Зашуршало?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    Andrey Dontsov, Пробую. В вашей ссылке обращение к апи приводили к выделению/освобождению ресурсов (такси) - и тут да, нужна идемпонентность. И если бы вы работали напрямую с счетом пользователя - да. Заблочили средства, запрос умер, повторили - а денег насчету уже не хватает, первый запрос по таймауту умер, а второй не выполнится. Потеряли свою прибыль. Куда без нее.

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

    iMedved2009
    @iMedved2009
    Andrey Dontsov, очень красивая история. В вашем случае - случае вызова платежного шлюза, оно зачем? Бабки через такси будут передаваться?
  • Как обеспечить идемпотентность запросов к API?

    iMedved2009
    @iMedved2009
    А зачем отправлять повторно с тем же ключом?
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, потому что это не утечка. Просто процесс менеджер жрет для себя что то и не сразу освобождает
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну если держится стабильно - то утечек нет.
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну массив в пхп вещь тяжелая.
    <?php
    while(true){
       $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
       var_dump(memory_get_usage(true));
       unset($data);
       var_dump(memory_get_usage(true));
    }


    а если это в консоли запустить?
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga,
    var_dump(memory_get_usage(true));
    $data = array();
    for($i = 0; $i<2000000; $i++) {
        $data[] = array(
            'id' => $i
            );
    }
    var_dump(memory_get_usage(true));
    unset($data);
    var_dump(memory_get_usage(true));
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, ну я так понимаю это вы одновременно максимум хреначите? Попробуйте дергать сколько то - на протяжении длительного времени
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    ligaliga, дык перед этим unset сделайте. Вы вызов коллектора делаете до того как для него работа появится
  • Почему возникает утечка памяти в php-fmp?

    iMedved2009
    @iMedved2009
    Сборка мусора вещь ресурсоемкая зачем без нужды запускать?

    Запустите на пару часов раз в секунду дергать скрипт и посмотрите отвалится ли чего. Сильное подозрение что нет
  • Laravel почему запрос слишком долгий?

    iMedved2009
    @iMedved2009
    JebKel, ну для влупите какой нибудь middleware где записывайте стату.
  • Laravel почему запрос слишком долгий?

    iMedved2009
    @iMedved2009
    Причин может быть миллион. Хотя бы канал до сервера. Запрос долгий - именно ожидание?