<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE article PUBLIC "-//NLM/DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
    <!--<?xml-stylesheet type="text/xsl" href="article.xsl">-->
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:ns1="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.2" xml:lang="en">
	<front>
		<journal-meta>
			<journal-id journal-id-type="issn">2303-9868</journal-id>
			<journal-id journal-id-type="eissn">2227-6017</journal-id>
			<journal-title-group>
				<journal-title>Международный научно-исследовательский журнал</journal-title>
			</journal-title-group>
			<issn pub-type="epub">2303-9868</issn>
			<publisher>
				<publisher-name>ООО Цифра</publisher-name>
			</publisher>
		</journal-meta>
		<article-meta>
			<article-id pub-id-type="doi">10.60797/IRJ.2026.169.55</article-id>
			<article-categories>
				<subj-group>
					<subject>Brief communication</subject>
				</subj-group>
			</article-categories>
			<title-group>
				<article-title>Сравнительный анализ методов обеспечения идемпотентности в кредитных информационных системах</article-title>
			</title-group>
			<contrib-group>
				<contrib contrib-type="author" corresp="yes">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0001-8274-1600</contrib-id>
					<contrib-id contrib-id-type="rinc">https://elibrary.ru/author_profile.asp?id=651164</contrib-id>
					<contrib-id contrib-id-type="rid">https://publons.com/researcher/L-1568-2018</contrib-id>
					<name>
						<surname>Мезенцева</surname>
						<given-names>Екатерина Михайловна</given-names>
					</name>
					<email>katya-mem@mail.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-5585-9774</contrib-id>
					<name>
						<surname>Тимофеев</surname>
						<given-names>Александр Вадимович</given-names>
					</name>
					<email>timofeev_av@list.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0008-7068-8820</contrib-id>
					<name>
						<surname>Масагутов</surname>
						<given-names>Кирилл Артурович</given-names>
					</name>
					<email>dekerilljr@gmail.com</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
			</contrib-group>
			<aff id="aff-1">
				<institution-wrap>
					<institution-id institution-id-type="ROR">https://ror.org/05ggagb37</institution-id>
					<institution content-type="education">Самарский национальный исследовательский университет имени академика С. П. Королёва</institution>
				</institution-wrap>
			</aff>
			<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2026-07-17">
				<day>17</day>
				<month>07</month>
				<year>2026</year>
			</pub-date>
			<pub-date pub-type="collection">
				<year>2026</year>
			</pub-date>
			<volume>8</volume>
			<issue>169</issue>
			<fpage>1</fpage>
			<lpage>8</lpage>
			<history>
				<date date-type="received" iso-8601-date="2026-04-04">
					<day>04</day>
					<month>04</month>
					<year>2026</year>
				</date>
				<date date-type="accepted" iso-8601-date="2026-06-11">
					<day>11</day>
					<month>06</month>
					<year>2026</year>
				</date>
			</history>
			<permissions>
				<copyright-statement>Copyright: &amp;#x00A9; 2022 The Author(s)</copyright-statement>
				<copyright-year>2022</copyright-year>
				<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
					<license-p>
						This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited. See 
						<uri xlink:href="http://creativecommons.org/licenses/by/4.0/">http://creativecommons.org/licenses/by/4.0/</uri>
					</license-p>
					.
				</license>
			</permissions>
			<self-uri xlink:href="https://research-journal.org/archive/7-169-2026-july/10.60797/IRJ.2026.169.55"/>
			<abstract>
				<p>В статье рассматривается проблема обеспечения идемпотентности в кредитных информационных системах, функционирующих в условиях распределённой обработки данных, повторных сетевых вызовов и асинхронного обмена сообщениями. Актуальность исследования обусловлена тем, что повторная обработка кредитной операции может приводить к дублированию заявок, повторному резервированию лимитов, некорректной фиксации статусов и искажению финансово значимых данных. Объектом исследования являются процессы обработки кредитных операций в распределённых информационных системах, а предметом — методы обеспечения идемпотентности и их способность предотвращать повторную обработку на техническом, интеграционном и доменном уровнях.Цель исследования состоит в теоретическом и эмпирическом сравнении трёх подходов: idempotency key, бизнес-ключа операции и контроля состояния бизнес-объекта. Методология включает формализацию уровней идемпотентности, многокритериальную экспертную оценку, анализ чувствительности весов и модельный эксперимент. По результатам оценки выяснилось, что метод контроля состояния и ожидаемого бизнес-эффекта показал наибольшую эффективность в рамках принятой модели оценки, так как он больше всего направлен на предотвращение повторных финансово важных результатов. В то же время показано, что для кредитных информационных систем наиболее уместно использовать несколько подходов вместе. Это помогает защититься от дублирования на уровне запроса, операции и итогового бизнес-результата. Практическая ценность работы состоит в том, что она обосновывает выбор методов обеспечения идемпотентности в кредитных информационных системах.</p>
			</abstract>
			<kwd-group>
				<kwd>повторная обработка операций</kwd>
				<kwd> бизнес-ключ операции</kwd>
				<kwd> межканальные повторы</kwd>
				<kwd> распределённые транзакции</kwd>
				<kwd> финансово значимые данные</kwd>
				<kwd> межсервисное взаимодействие</kwd>
				<kwd> контроль состояния бизнес-объекта</kwd>
				<kwd> повторный бизнес-эффект</kwd>
			</kwd-group>
		</article-meta>
	</front>
	<body>
		<sec>
			<title>HTML-content</title>
			<p>1. Введение</p>
			<p>Кредитные информационные системы работают с распределённой обработкой данных и внешними интеграциями. : запрос может быть отправлен повторно в случае потери ответа, хотя операция уже обработана.</p>
			<p>В обычной информационной системе дубликат часто рассматривается как техническая ошибка обработки. В кредитном домене его значение шире: повторное создание заявки, повторное резервирование лимита или повторная фиксация договора способны изменить финансовое состояние клиента и кредитной организации. Поэтому задача сводится не только к обнаружению одинакового входного сообщения, но и к защите результата, который должен возникнуть ровно один раз.</p>
			<p>Практика использования idempotency key показывает, что безопасный повтор запроса после сбоя связи является обязательным элементом современных API [1], [2]. Однако этот механизм решает только часть проблемы, поскольку распределённая система содержит не один, а несколько уровней повторов: сетевой, интеграционный, прикладной и бизнес-уровень. Для асинхронного обмена характерна семантика at-least-once delivery, при которой обработчик обязан корректно воспринимать повторную доставку сообщения [3], [4].</p>
			<p>Объектом исследования являются процессы обработки кредитных операций в распределённых информационных системах. Предметом исследования выступают методы обеспечения идемпотентности и их способность предотвращать повторную обработку запросов, сообщений и доменных переходов состояния. Цель статьи — сравнить методы обеспечения идемпотентности в кредитных информационных системах и определить условия их рационального сочетания. Для достижения цели решаются следующие задачи: раскрыть специфику повторной обработки операций в кредитном домене; выделить уровни идемпотентности в распределённой архитектуре; сравнить подходы на основе idempotency key, бизнес-ключа операции и контроля состояния бизнес-объекта; выполнить многокритериальную оценку методов; проверить устойчивость выводов с помощью анализа чувствительности и модельного эксперимента. Научная новизна работы состоит в разделении уровней идемпотентности, введении критерия повторного бизнес-эффекта и дополнении экспертной модели результатами имитационной проверки. Практическая значимость заключается в формировании рекомендаций для проектирования кредитных сервисов, в которых недопустимо повторное выполнение финансово значимой операции.</p>
			<p>2. Методы и принципы исследования</p>
			<p>2.1. Теоретические основания идемпотентности в распределённых кредитных системах</p>
			<p>В классическом понимании операция является идемпотентной, если её повторное выполнение не изменяет результат сверх первого применения. Для HTTP это означает, что несколько одинаковых запросов должны приводить к тому же наблюдаемому состоянию ресурса, что и один запрос [5]. В прикладных финансовых системах такое определение требует расширения, поскольку одинаковость запроса и одинаковость бизнес-операции не совпадают.</p>
			<p>Теоретически команду можно представить как пару [LATEX_FORMULA]c = (a, p)[/LATEX_FORMULA], где [LATEX_FORMULA]a[/LATEX_FORMULA]  тип действия, а [LATEX_FORMULA]p[/LATEX_FORMULA]  набор параметров. Состояние доменного объекта обозначим через [LATEX_FORMULA]s[/LATEX_FORMULA], а переход состояния  через функцию [LATEX_FORMULA]\delta(\mathrm{s}, \mathrm{c}) .[/LATEX_FORMULA]. На уровне бизнес-эффекта требуется, чтобы для повторной или эквивалентной команды c' выполнялось условие [LATEX_FORMULA]\delta\left(\delta(s, c), c^{\prime}\right)=\delta(s, c)[/LATEX_FORMULA]. Иными словами, второй вызов не должен создавать новый финансовый результат, если первый уже сформировал требуемое состояние.</p>
			<p>Для кредитного домена важно различать три вида совпадения. Техническое совпадение означает, что повторился тот же запрос с тем же идентификатором. Операционное совпадение фиксирует, что разные сообщения описывают одну и ту же смысловую операцию: например, одну заявку клиента на один кредитный продукт. Результативное совпадение связано с состоянием объекта: если лимит уже зарезервирован или договор активирован, повторная команда не должна порождать дополнительное изменение.</p>
			<p>Распределённые транзакции усложняют применение этого правила. В микросервисной архитектуре данные кредитной заявки, расчёта лимита, договора и уведомлений могут находиться в разных сервисах. Глобальная атомарность часто заменяется локальными транзакциями, обменом событиями и компенсационными действиями [6]. Поэтому в практическом проектировании более корректно говорить не об exactly-once delivery, а об exactly-once effect: сообщение может быть получено несколько раз, но бизнес-эффект должен быть зафиксирован однократно.</p>
			<p>С теоретической точки зрения идемпотентность опирается на инварианты предметной области. Инвариант кредитной заявки может запрещать повторную регистрацию активной заявки с тем же внешним номером; инвариант договора  повторную активацию уже активированного договора; инвариант лимита  повторное резервирование одной и той же суммы по одной операции. Такие правила ближе к доменной модели, чем к транспортному протоколу, и требуют проектирования конечного автомата состояний [7], [8].</p>
			<p>2.2. Источники повторов и модель риска</p>
			<p>Повторы в кредитных информационных системах возникают не только из-за ошибок пользователя. Наиболее типичны четыре группы причин: потеря ответа после успешной обработки, повторная доставка сообщения брокером, параллельное поступление заявки из разных каналов и повторная команда после частичного завершения процесса. Во всех случаях входные данные могут отличаться, хотя экономический смысл операции остаётся тем же.</p>
			<p>В данной работе повторный бизнес-эффект понимается как нежелательное повторное изменение финансово значимого состояния: создание второго договора вместо одного, двойное резервирование лимита, повторная отправка команды на выдачу кредита или повторная фиксация статуса, запускающего дальнейший процесс. Такой эффект отличается от технического дубля: технический дубль может быть безопасным, если система возвращает прежний результат и не меняет доменное состояние.</p>
			<p>Для анализа принята многоуровневая модель риска. На первом уровне оценивается способность метода распознать повторный входной запрос. На втором  способность связать разные технические сообщения с одной бизнес-операцией. На третьем  способность проверить, что требуемое состояние уже достигнуто. Чем выше уровень, тем больше метод зависит от предметной логики, но тем точнее он защищает финансово значимый результат.</p>
			<p>2.3. Методы обеспечения идемпотентности</p>
			<p>Для сравнительного анализа выделены три базовых метода: idempotency key, бизнес-ключ операции и контроль состояния с учётом ожидаемого бизнес-эффекта.</p>
			<p>Метод idempotency key основан на сохранении уникального идентификатора запроса вместе с результатом его обработки. Если запрос с таким ключом уже обрабатывался, система не выполняет операцию повторно, а возвращает ранее зафиксированный результат [1]. Этот подход удобен для синхронных API-вызовов и позволяет выявлять дубликат до выполнения основной бизнес-логики [2]. Недостаток метода состоит в том, что защита зависит от генерации, передачи и хранения ключа [9]. Ограничение проявляется в межканальных сценариях: новая техническая команда может иметь другой ключ, но соответствовать уже обработанной кредитной операции.</p>
			<p>Бизнес-ключ операции строится из доменных атрибутов, позволяющих идентифицировать смысл операции. Для кредитной заявки таким ключом могут быть идентификатор клиента, продукт, внешний номер заявки, канал-партнёр, сумма, валюта и дата операционного окна. В отличие от технического ключа, бизнес-ключ устойчив к изменению транспорта и помогает распознавать дубликаты, пришедшие из мобильного приложения, веб-интерфейса, операторского контура или партнёрской системы [10], [11]. Основной риск бизнес-ключа связан с выбором состава атрибутов. Слишком узкий ключ пропускает реальные дубли, поскольку разные сообщения не будут сопоставлены. Слишком широкий ключ приводит к ложной блокировке допустимых операций: например, клиент действительно подал две похожие заявки в разные моменты времени. Поэтому бизнес-ключ должен проектироваться как часть предметной модели, а не как произвольный технический индекс.</p>
			<p>Контроль состояния и ожидаемого бизнес-эффекта использует конечный автомат объекта. Он основан на контроле состояния бизнес-объекта и ожидаемого бизнес-эффекта. Повторная обработка не допускается, если система уже достигла нужного результата. Такой метод ближе всего к доменным инвариантам: он проверяет не совпадение сообщений, а допустимость перехода состояния. Преимущество этого метода в том, что он тесно связан с бизнес-логикой, но для него нужно иметь чёткую модель состояний и правил перехода между ними [7]. Недостаток контроля состояния состоит в большей сложности внедрения. Требуется формальная модель состояний, перечень допустимых переходов, правила обработки конкурентных команд и защита от гонок на уровне транзакций или версий объекта.</p>
			<p>2.4. Методика сравнительной оценки</p>
			<p>Сравнение методов выполнено по шести критериям: C1  точность выявления дублей; C2  устойчивость к межканальным повторам; C3  сложность внедрения; C4  независимость от предметной логики; C5  надёжность предотвращения повторного бизнес-эффекта; C6  удобство сопровождения. Оценка каждого метода задаётся по шкале от 1 до 5, где 1 означает низкое соответствие критерию, а 5  высокое.</p>
			<p>Интегральная оценка метода определяется как взвешенная сумма частных оценок:</p>
			<mml:math display="inline">
				<mml:mrow>
					<mml:msub>
						<mml:mi>I</mml:mi>
						<mml:mrow>
							<mml:mi>m</mml:mi>
						</mml:mrow>
					</mml:msub>
					<mml:mo>=</mml:mo>
					<mml:msubsup>
						<mml:mo>∑</mml:mo>
						<mml:mrow>
							<mml:mi>i</mml:mi>
							<mml:mo>=</mml:mo>
							<mml:mn>1</mml:mn>
						</mml:mrow>
						<mml:mrow>
							<mml:mn>6</mml:mn>
						</mml:mrow>
					</mml:msubsup>
					<mml:msub>
						<mml:mi>w</mml:mi>
						<mml:mrow>
							<mml:mi>i</mml:mi>
						</mml:mrow>
					</mml:msub>
					<mml:mi>·</mml:mi>
					<mml:msub>
						<mml:mi>x</mml:mi>
						<mml:mrow>
							<mml:mi>m</mml:mi>
							<mml:mi>i</mml:mi>
						</mml:mrow>
					</mml:msub>
					<mml:mo>,</mml:mo>
					<mml:mspace width="1em"/>
					<mml:msubsup>
						<mml:mo>∑</mml:mo>
						<mml:mrow>
							<mml:mi>i</mml:mi>
							<mml:mo>=</mml:mo>
							<mml:mn>1</mml:mn>
						</mml:mrow>
						<mml:mrow>
							<mml:mn>6</mml:mn>
						</mml:mrow>
					</mml:msubsup>
					<mml:msub>
						<mml:mi>w</mml:mi>
						<mml:mrow>
							<mml:mi>i</mml:mi>
						</mml:mrow>
					</mml:msub>
					<mml:mo>=</mml:mo>
					<mml:mn>1</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mspace width="1em"/>
					<mml:msub>
						<mml:mi>x</mml:mi>
						<mml:mrow>
							<mml:mi>m</mml:mi>
							<mml:mi>i</mml:mi>
						</mml:mrow>
					</mml:msub>
					<mml:mo>∈</mml:mo>
					<mml:mo stretchy="false">{</mml:mo>
					<mml:mn>1</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>2</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>3</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>4</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>5</mml:mn>
					<mml:mo stretchy="false">}</mml:mo>
					<mml:mo>.</mml:mo>
				</mml:mrow>
			</mml:math>
			<p> </p>
			<p>Здесь [LATEX_FORMULA]I(m)[/LATEX_FORMULA]  итоговая оценка метода [LATEX_FORMULA]m[/LATEX_FORMULA], [LATEX_FORMULA]w_{i}[/LATEX_FORMULA]  вес критерия [LATEX_FORMULA]i[/LATEX_FORMULA], [LATEX_FORMULA]x_{m i}[/LATEX_FORMULA]  экспертная оценка метода по критерию. Веса заданы с учётом риска кредитного процесса: наибольший вес получает C5, поскольку именно повторный бизнес-эффект напрямую влияет на финансовую корректность операции. Критерии C3, C4 и C6 отражают эксплуатационные свойства и имеют меньшую значимость, чем предотвращение ошибочного результата. Веса и обоснования представлены в таблице 1.</p>
			<table-wrap id="T1">
				<label>Table 1</label>
				<caption>
					<p>Весовые коэффициенты критериев оценки</p>
				</caption>
				<table>
					<tr>
						<td>Критерий</td>
						<td>Содержание критерия</td>
						<td>Вес</td>
						<td>Обоснование</td>
					</tr>
					<tr>
						<td>C1</td>
						<td>Точность выявления дублей</td>
						<td>0,20</td>
						<td>Влияет на пропуск дубликатов и на ошибочную блокировку новых операций</td>
					</tr>
					<tr>
						<td>C2</td>
						<td>Устойчивость к межканальным повторам</td>
						<td>0,15</td>
						<td>Одна кредитная операция может прийти через разные каналы обслуживания</td>
					</tr>
					<tr>
						<td>C3</td>
						<td>Сложность внедрения</td>
						<td>0,10</td>
						<td>Определяет стоимость разработки, тестирования и сопровождения</td>
					</tr>
					<tr>
						<td>C4</td>
						<td>Независимость от предметной логики</td>
						<td>0,10</td>
						<td>Чем выше независимость, тем проще повторное использование метода</td>
					</tr>
					<tr>
						<td>C5</td>
						<td>Предотвращение повторного бизнес-эффекта</td>
						<td>0,30</td>
						<td>Главный риск кредитного домена связан с повторным финансовым результатом</td>
					</tr>
					<tr>
						<td>C6</td>
						<td>Удобство сопровождения</td>
						<td>0,15</td>
						<td>Важны прозрачность правил, аудит и возможность изменения бизнес-процесса</td>
					</tr>
				</table>
			</table-wrap>
			<p> </p>
			<p>Представленные в таблице 1 критерии и весовые коэффициенты используются далее для расчёта интегральной оценки каждого метода обеспечения идемпотентности. </p>
			<p>Для метода idempotency key интегральная оценка рассчитывается следующим образом:</p>
			<mml:math display="inline">
				<mml:mrow>
					<mml:msub>
						<mml:mi>Q</mml:mi>
						<mml:mrow>
							<mml:mn>1</mml:mn>
						</mml:mrow>
					</mml:msub>
					<mml:mo>=</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>20</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>4</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>2</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>5</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>5</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>30</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>3</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>4</mml:mn>
					<mml:mo>=</mml:mo>
					<mml:mn>3</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>60</mml:mn>
				</mml:mrow>
			</mml:math>
			<p>Для метода бизнес-ключа операции:</p>
			<mml:math display="inline">
				<mml:mrow>
					<mml:msub>
						<mml:mi>Q</mml:mi>
						<mml:mrow>
							<mml:mn>2</mml:mn>
						</mml:mrow>
					</mml:msub>
					<mml:mo>=</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>20</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>4</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>5</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>3</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>3</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>30</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>4</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>3</mml:mn>
					<mml:mo>=</mml:mo>
					<mml:mn>3</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>80</mml:mn>
				</mml:mrow>
			</mml:math>
			<p>Для метода контроля состояния и ожидаемого бизнес-эффекта:</p>
			<mml:math display="inline">
				<mml:mrow>
					<mml:msub>
						<mml:mi>Q</mml:mi>
						<mml:mrow>
							<mml:mn>3</mml:mn>
						</mml:mrow>
					</mml:msub>
					<mml:mo>=</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>20</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>5</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>4</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>2</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>10</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>2</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>30</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>5</mml:mn>
					<mml:mo>+</mml:mo>
					<mml:mn>0</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>15</mml:mn>
					<mml:mi>·</mml:mi>
					<mml:mn>3</mml:mn>
					<mml:mo>=</mml:mo>
					<mml:mn>3</mml:mn>
					<mml:mo>,</mml:mo>
					<mml:mn>95</mml:mn>
				</mml:mrow>
			</mml:math>
			<p>Результаты сравнительной оценки представлены в таблице 2.</p>
			<table-wrap id="T2">
				<label>Table 2</label>
				<caption>
					<p>Многокритериальная оценка методов обеспечения идемпотентности</p>
				</caption>
				<table>
					<tr>
						<td>Метод</td>
						<td>Критерии</td>
						<td>Оценка</td>
					</tr>
					<tr>
						<td>С1</td>
						<td>С2</td>
						<td>С3</td>
						<td>С4</td>
						<td>С5</td>
						<td>С6</td>
					</tr>
					<tr>
						<td>Idempotency key</td>
						<td>4</td>
						<td>2</td>
						<td>5</td>
						<td>5</td>
						<td>3</td>
						<td>4</td>
						<td>3,60</td>
					</tr>
					<tr>
						<td>Бизнес-ключ операции</td>
						<td>4</td>
						<td>5</td>
						<td>3</td>
						<td>3</td>
						<td>4</td>
						<td>3</td>
						<td>3,80</td>
					</tr>
					<tr>
						<td>Контроль состояния и бизнес-эффекта</td>
						<td>5</td>
						<td>4</td>
						<td>2</td>
						<td>2</td>
						<td>5</td>
						<td>3</td>
						<td>3,95</td>
					</tr>
				</table>
			</table-wrap>
			<p> Разница не означает неэффективность технического ключа; она показывает, что один уровень защиты не закрывает все классы повторов. </p>
			<table-wrap id="T3">
				<label>Table 3</label>
				<caption>
					<p>Анализ чувствительности результатов к изменению весов</p>
				</caption>
				<table>
					<tr>
						<td>Сценарий весов</td>
						<td>Idempotency key</td>
						<td>Бизнес-ключ</td>
						<td>Контроль состояния</td>
						<td>Интерпретация</td>
					</tr>
					<tr>
						<td>Базовый</td>
						<td>3,60</td>
						<td>3,80</td>
						<td>3,95</td>
						<td>Контроль состояния имеет наибольшую оценку</td>
					</tr>
					<tr>
						<td>Технический акцент</td>
						<td>3,50</td>
						<td>3,95</td>
						<td>3,95</td>
						<td>Бизнес-ключ и контроль состояния дают равный результат</td>
					</tr>
					<tr>
						<td>Акцент на бизнес-эффекте</td>
						<td>3,40</td>
						<td>3,80</td>
						<td>4,10</td>
						<td>Контроль состояния усиливает преимущество</td>
					</tr>
				</table>
			</table-wrap>
			<p>Анализ чувствительности показывает, что изменение весов влияет на соотношение методов, но не отменяет необходимости их комбинированного применения. При техническом акценте бизнес-ключ операции приближается к контролю состояния, поскольку лучше распознаёт межканальные повторы. При повышении значимости критерия, связанного с предотвращением повторного бизнес-эффекта, преимущество контроля состояния становится более выраженным. Следовательно, выбор метода должен определяться не только удобством реализации, но и уровнем риска, который возникает при повторной обработке кредитной операции.</p>
			<p>Для наглядного сопоставления методов результаты многокритериальной оценки дополнительно представлены в графической форме. Лепестковая диаграмма позволяет сравнить сильные и слабые стороны каждого подхода по критериям и показать, по каким параметрам методы имеют наибольшие различия. Графическое представление результатов приведено на рисунке 1.</p>
			<fig id="F1">
				<label>Figure 1</label>
				<caption>
					<p>Лепестковая диаграмма сравнительной оценки методов обеспечения идемпотентности</p>
				</caption>
				<alt-text>Лепестковая диаграмма сравнительной оценки методов обеспечения идемпотентности</alt-text>
				<graphic ns1:href="/media/images/2026-04-04/d2953045-77d4-41c0-a073-40bc34875ed6.png"/>
			</fig>
			<p>Эмпирическая проверка на модельном наборе данных</p>
			<p>Для дополнения экспертной оценки проведена имитационная проверка. Использован модельный журнал входящих событий, отражающий типовые сценарии кредитной системы: первичная подача заявки, повторный HTTP-запрос после потери ответа, межканальный дубль, повторная доставка интеграционного сообщения и команда, поступившая после достижения целевого состояния. Данные не являются промышленными логами и не содержат персональной информации; их назначение  воспроизводимо сравнить методы при контролируемых условиях.</p>
			<p>Каждое событие содержало технический идентификатор запроса, канал поступления, бизнес-атрибуты операции, состояние объекта до обработки и признак допустимости новой операции. </p>
			<mml:math display="inline">
				<mml:mrow>
					<mml:mtable>
						<mml:mtr>
							<mml:mtd columnalign="left">
								<mml:mtext> Precision </mml:mtext>
								<mml:mo>=</mml:mo>
								<mml:mfrac>
									<mml:mrow>
										<mml:mi>T</mml:mi>
										<mml:mi>P</mml:mi>
									</mml:mrow>
									<mml:mrow>
										<mml:mi>T</mml:mi>
										<mml:mi>P</mml:mi>
										<mml:mo>+</mml:mo>
										<mml:mi>F</mml:mi>
										<mml:mi>P</mml:mi>
									</mml:mrow>
								</mml:mfrac>
								<mml:mo>,</mml:mo>
								<mml:mtext> Recall </mml:mtext>
								<mml:mo>=</mml:mo>
								<mml:mfrac>
									<mml:mrow>
										<mml:mi>T</mml:mi>
										<mml:mi>P</mml:mi>
									</mml:mrow>
									<mml:mrow>
										<mml:mi>T</mml:mi>
										<mml:mi>P</mml:mi>
										<mml:mo>+</mml:mo>
										<mml:mi>F</mml:mi>
										<mml:mi>N</mml:mi>
									</mml:mrow>
								</mml:mfrac>
							</mml:mtd>
						</mml:mtr>
					</mml:mtable>
					<mml:mo>,</mml:mo>
				</mml:mrow>
			</mml:math>
			<p>где </p>
			<p>Для эмпирической проверки предложенных методов был сформирован модельный журнал событий, включающий как корректные операции, так и различные типы повторов. Состав журнала отражает основные сценарии, характерные для распределённой кредитной системы. Структура модельного набора данных представлена в таблице 4.</p>
			<table-wrap id="T4">
				<label>Table 4</label>
				<caption>
					<p>Состав модельного журнала событий</p>
				</caption>
				<table>
					<tr>
						<td>Тип события</td>
						<td>Количество</td>
						<td>Назначение в эксперименте</td>
					</tr>
					<tr>
						<td>Исходные корректные операции</td>
						<td>10 000</td>
						<td>Базовый поток новых заявок и действий по кредитному процессу</td>
					</tr>
					<tr>
						<td>Повторный HTTP-запрос с тем же idempotency key</td>
						<td>600</td>
						<td>Сценарий потери ответа после успешной обработки</td>
					</tr>
					<tr>
						<td>Межканальный повтор с новым техническим ключом</td>
						<td>350</td>
						<td>Одна операция поступает из другого канала обслуживания</td>
					</tr>
					<tr>
						<td>Повторная доставка интеграционного сообщения</td>
						<td>250</td>
						<td>Семантика at-least-once delivery в асинхронном обмене</td>
					</tr>
					<tr>
						<td>Повтор после достижения целевого состояния</td>
						<td>50</td>
						<td>Команда приходит после регистрации заявки, активации договора или резервирования лимита</td>
					</tr>
					<tr>
						<td>Допустимые похожие операции</td>
						<td>200</td>
						<td>Новые операции с близкими атрибутами, которые нельзя блокировать как дубли</td>
					</tr>
				</table>
			</table-wrap>
			<p>На основе сформированного модельного журнала была выполнена сравнительная проверка методов. Для каждого подхода рассчитаны значения метрик. Дополнительно зафиксировано количество случаев, в которых повторная обработка приводила к повторному бизнес-эффекту. Результаты проверки представлены в таблице 5.</p>
			<table-wrap id="T5">
				<label>Table 5</label>
				<caption>
					<p>Результаты эмпирической проверки методов</p>
				</caption>
				<table>
					<tr>
						<td>Метод</td>
						<td>TP</td>
						<td>FN</td>
						<td>FP</td>
						<td>Precision, %</td>
						<td>Recall, %</td>
						<td>Повторный бизнес-эффект, случаев</td>
					</tr>
					<tr>
						<td>Idempotency key</td>
						<td>600</td>
						<td>650</td>
						<td>3</td>
						<td>99,5</td>
						<td>48,0</td>
						<td>413</td>
					</tr>
					<tr>
						<td>Бизнес-ключ операции</td>
						<td>1 018</td>
						<td>232</td>
						<td>41</td>
						<td>96,1</td>
						<td>81,4</td>
						<td>126</td>
					</tr>
					<tr>
						<td>Контроль состояния и бизнес-эффекта</td>
						<td>1 124</td>
						<td>126</td>
						<td>16</td>
						<td>98,6</td>
						<td>89,9</td>
						<td>38</td>
					</tr>
					<tr>
						<td>Комбинированная схема</td>
						<td>1 239</td>
						<td>11</td>
						<td>9</td>
						<td>99,3</td>
						<td>99,1</td>
						<td>4</td>
					</tr>
				</table>
			</table-wrap>
			<p>Результаты показывают, что idempotency key почти не создаёт ложных блокировок, но обнаруживает только 48,0% дублей, так как межканальные и событийные повторы имеют другие технические параметры. Бизнес-ключ повышает полноту до 81,4%, однако увеличивает число FP: часть допустимых похожих операций ошибочно классифицируется как повтор. Контроль состояния достигает recall 89,9% и резко снижает число повторных бизнес-эффектов, потому что решение принимается по доменному состоянию, а не только по признакам входного сообщения.</p>
			<p>Наилучший результат показала комбинированная схема. Она не заменяет три базовых метода, а последовательно применяет их: сначала проверяется idempotency key, затем бизнес-ключ, после чего выполняется контроль допустимости перехода состояния. В модельном журнале такая схема оставила 4 случая повторного бизнес-эффекта против 413 у одного idempotency key. Это подтверждает тезис о необходимости многоуровневой защиты в кредитных информационных системах.</p>
			<fig id="F2">
				<label>Figure 2</label>
				<caption>
					<p>Остаточные повторные бизнес-эффекты по результатам модельного эксперимента</p>
				</caption>
				<alt-text>Остаточные повторные бизнес-эффекты по результатам модельного эксперимента</alt-text>
				<graphic ns1:href="/media/images/2026-05-25/dc5ea88a-2126-4814-afd3-07782cb04a87.jpg"/>
			</fig>
			<p> </p>
			<p>3. Основные результаты</p>
			<p>Полученные результаты позволяют уточнить архитектурные рекомендации. Idempotency key следует применять на границе внешнего API, где он устраняет повторные запросы клиента и снижает нагрузку на логику. Запись о ключе должна сохраняться атомарно с результатом обработки либо в рамках транзакции, либо через согласованный журнал состояния запроса.</p>
			<p>Бизнес-ключ целесообразен на уровне прикладного сервиса и интеграционных сценариев. Его задача  связать технически разные сообщения, относящиеся к одной смысловой операции. В кредитной системе такой ключ должен быть согласован с правилами продукта: например, для заявки наличного кредита, кредитной карты и реструктуризации состав атрибутов может различаться. Поддержка бизнес-ключа требует версионирования правил, так как изменения кредитного процесса меняют критерии эквивалентности операций.</p>
			<p>Контроль состояния должен располагаться в доменной модели и фиксировать допустимые переходы объекта. Для заявки это могут быть состояния «создана», «на проверке», «одобрена», «отклонена», «договор оформлен»; для лимита  «свободен», «зарезервирован», «использован», «освобождён». Команда, не меняющая состояние или повторяющая уже достигнутый результат, должна возвращать безопасный ответ без повторного финансового действия.</p>
			<p>Практически наиболее устойчивой является схема «технический ключ + бизнес-ключ + состояние». Технический ключ защищает от потери ответа и повторного нажатия кнопки. Бизнес-ключ выявляет дубли, пришедшие по разным каналам. Контроль состояния предотвращает ошибочный результат в ситуациях, когда два первых уровня не дали полной уверенности. Такая комбинация снижает зависимость от одного механизма и повышает объяснимость решения при аудите.</p>
			<p>4. Заключение</p>
			<p>В работе проведён сравнительный анализ методов обеспечения идемпотентности в кредитных информационных системах. Теоретическая часть показала, что идемпотентность следует рассматривать не только как свойство HTTP-запроса, но и как свойство бизнес-перехода, сохраняющего инварианты кредитного процесса. Поэтому защита должна охватывать технический уровень, уровень смысловой операции и уровень состояния доменного объекта.</p>
			<p>Многокритериальная оценка показала наибольшую интегральную эффективность контроля состояния и ожидаемого бизнес-эффекта. Бизнес-ключ операции оказался наиболее полезен для межканальных повторов, а idempotency key  для ранней обработки повторных API-вызовов. Анализ чувствительности подтвердил, что при изменении весов меняется относительный отрыв методов, но сохраняется вывод о необходимости их сочетания.</p>
			<p>Эмпирическая проверка на модельном журнале из 11 450 событий дополнила экспертные выводы количественными данными. Одиночный idempotency key выявил 48,0% дублей, бизнес-ключ  81,4%, контроль состояния  89,9%, а комбинированная схема  99,1%. Число остаточных повторных бизнес-эффектов снизилось с 413 при использовании только idempotency key до 4 при многоуровневой защите.</p>
			<p>Для кредитных информационных систем рекомендуется комбинированный подход: на входе API использовать idempotency key, в прикладной логике применять бизнес-ключ операции, а в доменной модели контролировать допустимость перехода состояния. Дальнейшее развитие исследования может быть связано с проверкой модели на промышленных данных, оценкой стоимости ложных блокировок и разработкой адаптивных правил бизнес-ключа для разных кредитных продуктов.</p>
		</sec>
		<sec sec-type="supplementary-material">
			<title>Additional File</title>
			<p>The additional file for this article can be found as follows:</p>
			<supplementary-material xmlns:xlink="http://www.w3.org/1999/xlink" id="S1" xlink:href="https://doi.org/10.5334/cpsy.78.s1">
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/24714.docx">24714.docx</inline-supplementary-material>]-->
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/24714.pdf">24714.pdf</inline-supplementary-material>]-->
				<label>Online Supplementary Material</label>
				<caption>
					<p>
						Further description of analytic pipeline and patient demographic information. DOI:
						<italic>
							<uri>https://doi.org/10.60797/IRJ.2026.169.55</uri>
						</italic>
					</p>
				</caption>
			</supplementary-material>
		</sec>
	</body>
	<back>
		<ack>
			<title>Acknowledgements</title>
			<p/>
		</ack>
		<sec>
			<title>Competing Interests</title>
			<p/>
		</sec>
		<ref-list>
			<ref id="B1">
				<label>1</label>
				<mixed-citation publication-type="confproc">Idempotent requests // Stripe . — 2025 — URL: https://docs.stripe.com/api/idempotent_requests (дата обращения: 29.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B2">
				<label>2</label>
				<mixed-citation publication-type="confproc">Lowery B. Designing robust and predictable APIs with idempotency / B. Lowery, D. Ponnapalli // Designing robust and predictable APIs with idempotency. — 2017 — URL: https://stripe.com/blog/idempotency (дата обращения: 29.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B3">
				<label>3</label>
				<mixed-citation publication-type="confproc">Richardson C. Pattern: Idempotent Consumer / C. Richardson // microservices. — 2026 — URL: https://microservices.io/patterns/communication-style/idempotent-consumer.html (дата обращения: 29.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B4">
				<label>4</label>
				<mixed-citation publication-type="confproc">Richardson C. Handling duplicate messages using the Idempotent Consumer pattern / C. Richardson // microservices. — 2020 — URL: https://microservices.io/post/microservices/patterns/2020/10/16/idempotent-consumer.html (дата обращения: 29.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B5">
				<label>5</label>
				<mixed-citation publication-type="confproc">Fielding R. RFC 9110: HTTP Semantics / R. Fielding , M. Nottingham , J. Reschke // RFC 9110: HTTP Semantics. — 2022 — URL: https://www.rfc-editor.org/rfc/rfc9110.html (дата обращения: 30.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B6">
				<label>6</label>
				<mixed-citation publication-type="confproc">Richardson C. Transactional Outbox / C. Richardson // microservices . — 2026 — URL: https://microservices.io/patterns/data/transactional-outbox.html (дата обращения: 30.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B7">
				<label>7</label>
				<mixed-citation publication-type="confproc">Hohpe G. Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions / G. Hohpe, B. Woolf — Boston: Addison-Wesley, 2003. — 736 с. (дата обращения: 30.03.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B8">
				<label>8</label>
				<mixed-citation publication-type="confproc">Fowler M. Patterns of Enterprise Application Architecture / M. Fowler — Boston: Addison-Wesley, 2002. — 560 с. [in English]</mixed-citation>
			</ref>
			<ref id="B9">
				<label>9</label>
				<mixed-citation publication-type="confproc">Jena J. The Idempotency-Key HTTP Header Field / J. Jena, S. Dalal // The Idempotency-Key HTTP Header Field. — 2025 — URL: https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header (дата обращения: 01.04.2026) [in English]</mixed-citation>
			</ref>
			<ref id="B10">
				<label>10</label>
				<mixed-citation publication-type="confproc">Richardson C. Microservices Patterns: With examples in Java / C. Richardson — Shelter Island: Manning, 2018. — 520 с. [in English]</mixed-citation>
			</ref>
			<ref id="B11">
				<label>11</label>
				<mixed-citation publication-type="confproc">Kleppmann M. Designing Data-Intensive Applications / M. Kleppmann — O’Reilly Media: O’Reilly Media, 2017. — 616 с. [in English]</mixed-citation>
			</ref>
		</ref-list>
	</back>
	<fundings/>
</article>