Пуллинг что это такое
Кэш-пулинг – эффективная система распределения средств и особенности ее в РФ
Из этой статьи вы узнаете:
Кэш-пулинг – это система, позволяющая контролировать одновременно несколько банковских счетов. Остающиеся на них средства либо позднее собираются на едином мастер-счете, либо используются компанией по отдельности с целью снижения налоговых отчислений и увеличения ликвидности. Далее подробнее поговорим о рисках и преимуществах работы с такой системой.
Зачем нужен кэш-пулинг
В общем смысле кэш-пулинг – это консолидация денежных средств группы компаний на едином счете. Такой подход дает возможность использовать одним фирмам-участницам временно свободные денежные средства со счетов других для снижения потребности в краткосрочном кредитовании. Данный процесс может вестись в реальной или виртуальной форме, поэтому выделяют:
Система кэш-пулинга подходит для использования группами компаний, имеющих разную структуру: отдельные юридические лица, объединенные под управлением единого казначейского центра, сетевые компании с развитой сетью филиалов или крупные корпорации с большим количеством дочерних фирм.
Вне зависимости от структуры и выбранного вида, данный инструмент применяют, чтобы:
Такой подход дает возможность избежать ситуаций, в которых одним членам группы приходится брать кредиты для финансирования текущих операций, тогда как другие имеют избыток ликвидности и размещают свободные средства на депозитах. А превышение кредитных ставок одних участников группы над депозитными для других (зачастую находящихся в разных банках) отрицательно сказывается на финансовом результате группы в целом.
У конкретного банка под общим наименованием «кэш-пулинг» может подразумеваться целый ряд продуктов этой линейки. Также отметим, что даже в одном таком финансовом учреждении для каждого клиента используются индивидуальные настройки. Немаловажно и то, что все крупные сетевые компании и корпорации обладают сложными структурами, которые имеют разную степень централизации, развитости казначейской функции и различное географическое распределение. По этой причине выбор и внедрение кэш-пулинга требуют вдумчивого и даже креативного подхода.
Но все виды кэш-пулинга объединяет одно важное общее условие: нужно, чтобы все счета участвующих компаний находились в одном банке. Поэтому, хотя такие финансовые учреждения и берут относительно небольшую комиссию за данную услугу, они развивают данный продукт, стремясь привлечь в число своих клиентов крупные холдинги с большими оборотами.
В нашей стране пока только некоторые банки могут предложить этот продукт своим клиентам, в их число входят: Citi, HSBC, ВТБ, «РайффайзенБанк», «Газпромбанк», «Банк Россия», «Промсвязьбанк», «ЮниКредит» и «Альфабанк».
Распространенность кэш-пулинга в России
В Россию этот финансовый инструмент пришел в середине 2000-х годов, но до сих пор не многие предприниматели готовы им пользоваться. Для этого существует немало причин, в первую очередь, низкая финансовая грамотность, а также запутанное и противоречивое законодательство.
Бизнесменам легче немного, но стабильно терять на казначейских издержках, нежели погружаться в финансовый менеджмент и заниматься кэш-пулингом. Ведь во втором случае всегда есть серьезный риск быть непонятым налоговыми службами и даже оказаться вовлеченным в судебное разбирательство.
Основная сложность в том, что в законе отсутствует определение и пояснение кэш-пулинга. А значит, всегда есть представители налоговых органов, для которых такая система работы – это только повод придраться к компании.
Но не стоит отчаиваться, во многих банках уже создана оптимальная законная схема, доступная для любого владельца бизнеса с несколькими юридическими лицами в рамках единого холдинга.
С 2009 года наблюдается тенденция роста популярности кэш-пулинга среди предпринимателей, тогда как до кризиса 2008 года было очень немного банков, которые предоставляли эту услугу.
С формальной точки зрения кэш-пулинг – договор внутригруппового займа между компаниями. По мнению специалистов, данная услуга включает в себя все признаки таких взаимоотношений, поэтому законна. Повторим, единственное требование – чтобы все компании холдинга имели счета в одном банке. Движение денег в рамках внутригруппового займа ведется с учетом потребностей каждого участника группы.
Благодаря кэш-пулингу можно быстро решать текущие проблемы, не расходуя на это лишние средства. Представим ситуацию: у одного подразделения кассовый разрыв, а у другого на данный момент есть свободные финансы – можно использовать эти средства, а не брать кредит, обслуживать его, платить проценты и комиссии.
Банк помогает своим клиентам выходить из трудных ситуаций, используя ресурсы холдинга. В результате уменьшаются размеры неиспользуемых остатков на счетах, а предприятие может распоряжаться всей совокупностью средств. А также снижаются издержки на казначейские операции и учет средств в рамках компании, ведь за все эти процессы отвечает банк (см. также опасные условия кредитного договора).
Материальный кэш-пулинг
Материальный кэш-пулинг предполагает автоматический сбор финансов участников пула с избыточной ликвидностью на мастер-счете и распределение данных средств на платежи тех участников, у которых недостаточно денег на счетах.
Каковы экономические результаты применения такого подхода к обращению финансов? Материальный кэш-пулинг дает больший экономический эффект, если сравнивать его с виртуальной разновидностью. Дело в том, что централизация денежных средств в этом случае производится наиболее полно: вся ликвидность группы компаний физически группируется на одном мастер-счете, благодаря чему централизованному казначейству легко ею управлять посредством стандартного набора услуг банка.
К последним относятся РКО, размещение временно свободных денежных средств, привлечение краткосрочного финансирования для закрытия групповых кассовых разрывов, пр. В то же время данный подход связан с минимальными расходами на банковское обслуживание, ведь на нашем рынке перечисление средств между счетами является недорогой услугой либо вовсе бесплатной, если речь идет о счетах, открытых в одном банке.
Вы можете спросить: для чего разработан другой пулинг, если физический наиболее продуктивен, при этом выгоден?
Ответ на этот вопрос относится к правовому оформлению пулинговой системы. Вся сложность кроется в обосновании платежей между мастер-счетом и счетами участников пула согласно нормам действующего законодательства РФ.
Для корпорации с большим количеством филиалов и одним юридическим лицом эта проблема обычно неактуальна. А значит, в большинстве случаев лучшим вариантом становится работа именно с материальным кэш-пулингом.
Если же корпорация включает в себя группу отдельных, с юридической точки зрения, предприятий, выбор оказывается менее очевиден.
Модель материального пулинга будет наиболее выигрышной при условии, что переводы средств между входящими в пул счетами соответствуют определенной хозяйственной деятельности. Однако на практике такое бывает нечасто.
Чаще для обоснования платежей внутри пула прибегают к внутрикорпоративным заимствованиям, для чего подписывают договоры займа между владельцем мастер-счета и всеми участниками объединения. В результате возникает ряд ограничений, из-за чего снижается экономическая эффективность материального пулинга. В первую очередь, ведение и учет заимствований всегда сопряжены с дополнительными операционными расходами. А использование внутрикорпоративных заимствований нередко влечет за собой рост налогооблагаемой базы.
Таким образом расходы корпорации на материальный пулинг возрастают, снижая привлекательность данного подхода. Если требуется построить систему учета внутрикорпоративных займов, может быть полезна соответствующая автоматизированная банковская услуга, тогда как оценивать влияние второго фактора на совокупную стоимость пулинга руководителям корпорации придется своими силами.
Чтобы избежать необходимости обоснования платежей между счетами (в связи с отсутствием таковых) при пулинговом управлении средствами, можно воспользоваться виртуальным пулингом.
Виртуальный кэш-пулинг
В этом случае положительные и отрицательные остатки средств при подсчете процентов складываются друг с другом. В результате не нужно переводить деньги от предприятий на мастер-счет. Отметим, что такое понятие, как «мастер-счет», в принципе не используется при виртуальном подходе, а для клиентских счетов устанавливаются одинаковые параметры. Общий размер заемных денежных средств снижается, если одни подразделения получают их от банка, а другие, имея средства в достаточном количестве, хранят их на счетах в том же банке.
При виртуальном кэш-пулинге для каждого подразделения создается отдельный счет, но средства между ними не переводятся, а формируется номинальный пул, в котором содержатся данные о финансах группы. Как и в случае с материальным пулингом, счета клиентов обнуляются к началу каждого рабочего дня, а в конце смены подсчитывается образовавшийся остаток и ликвидность группы.
Далее все средства перечисляются с обычного счета подразделения на соответствующий ему пулинговый, а баланс становится нулевым. Если остаток на таком счете оказывается положительным, банк берет с него процент, а также списывается процент за овердрафт. Так ведется работа в теории, но на практике каждый банк предлагает свои условия реализации схемы.
Технология виртуального кэш-пулинга становится хорошим выходом для предприятий, у которых одни подразделения имеют избыточные суммы, а другие страдают от недостатка средств.
При помощи грамотного использования денег, остающихся свободными, можно увеличить доход компании – для этого сегодня существует множество разных методик. Здесь самыми главными факторами, от которых зависит рост прибыли, считается точность и глубина прогнозирования перемещения средств подразделений.
Назовем достоинства виртуального кэш-пулинга:
Безусловно, и у виртуального кэш-пулинга есть определенные недостатки. Так, существуют страны, где использование этого подхода запрещено на официальном уровне. В них компании, которые нуждаются в реализации мультивалютной системы, вынуждены прибегать к помощи транснациональных банков, требующих достаточно высокую плату за свои услуги.
Топ-3 статей, которые будут полезны каждому руководителю:
Налоговые риски при кэш-пулинге
Поскольку мы затронули тему межфирменных договоров займа, нужно уточнить, может ли некредитная организация регулярно финансировать другие предприятия, предоставляя им денежные средства? Будет ли подобная деятельность относиться к банковской? Поскольку кэш-пулинг пока остается новым направлением для нашей страны, нет точного ответа на этот вопрос, а значит, необходимо четко разделять такие понятия, как кредитный договор и договор займа, и опираться на случаи из судебной практики.
Напомним, что с 2012 года в НК РФ существует раздел V.I, устанавливающий порядок проведения сделок между взаимозависимыми лицами. При этом важную роль играет оценка влияния одной из взаимозависимых сторон на решение другой. Поэтому участие одной компании в капитале других оценивается исходя из заключенного между ними соглашения, а также наличия иных возможностей влиять на деятельность, осуществляемую прочими лицами.
С 2013 года ведется контроль операций между взаимозависимыми лицами при условии, что сумма доходов по совокупности заключенных между ними сделок оказывается свыше:
На данные сделки распространяются определенные правила трансфертного ценообразования – используемые методы определения трансфертных цен указаны в ст. 105.7 НК РФ.
В международной практике обоснование рыночной ставки процента по займам обычно производится с использованием метода сопоставимых рыночных цен. Тогда как в НК РФ указаны довольно общие правила по установлению трансфертных цен, разъяснений на эту тему пока немного, поэтому правильное определение цены для конкретной сделки оказывается трудной задачей.
Определяя предельную сумму процентов, признаваемую расходом по долговым обязательствам, участники кэш-пулинга должны основываться на п.1 ст. 269 НК РФ. Но это не все тонкости налогообложения для организаций, применяющих в виде источника финансирования иностранные инвестиции – нельзя забывать о правилах тонкой капитализации. Международные корпорации пользуются разнообразными способами наиболее эффективного использования механизма тонкой капитализации, основным из достоинств которого называют получение налоговых выгод.
Отметим, что эта схема пока остается достаточно новой для наших налоговых служб, особенно если речь идет о регионах. В результате такой подход часто рассматривается как попытка материнской компании снизить налоговое бремя, поэтому происходит доначисление налогов либо применяются другие санкции.
Также налоговики могут решить, что расходы по обслуживанию кредита или овердрафта должны ложиться только на плечи использующей его компании либо что расходы «материнской» компании необоснованны, тогда банк учитывает все средства для погашения овердрафта. Другой возможный подход налоговых служб – попытка рассчитать займ по рыночным процентным ставкам и включить доход по ним в налогооблагаемую базу. Кроме того, могут появиться претензии к банку, если проверяющим покажется, что по операциям кэш-пуллинга предоставляются иные процентные ставки.
Компании придется прибегнуть к помощи опытных адвокатов и финансистов, чтобы в суде отстоять свою правоту. Именно так произошло в судебном споре между ИФНС по Челябинской области и компанией ООО «Газпромнефть-Челябинск». Представители налоговой службы посчитали нужным снизить объем убытков почти на 100 млн рублей на основании того, что предприятие выдавало и обслуживало кредиты своей материнской компании под разные процентные ставки, что было экономически неоправданно.
«Газпромнефть-Челябинск» аргументировал экономическую оправданность своих действий, объясняя суть кэш-пулинга. Материнская компания инвестировала на долгосрочный период в свою «дочку», а краткосрочные кредиты были необходимы, чтобы обеспечивать текущие процессы. В итоге ИФНС проиграла, однако суд мог сохранить санкции фискальных органов, если бы не была предоставлена достаточная доказательная база.
О чем стоит помнить тем, кто хочет опробовать систему кэш-пулинга? В нашей стране услуги финансового менеджмента на данный момент остаются не полноценным банковским инструментом, а инициативой крупного бизнеса.
Выбирая банк, обратите внимание на такие особенности:
Далеко не каждый банк способен обеспечить выполнение всех требований компаний. В итоге предприятиям приходится вкладывать большие средства и упускать возможности для развития.
Нельзя забывать и о сложностях ведения бизнеса на международном уровне или в случае, когда собственник дочерней компании находится за рубежом. В этом случае на предприятие распространяются ограничения валютного законодательства и особенности работы в условиях трансфертного ценообразования.
Однако эксперты финансового сообщества отмечают позитивные перемены в области кэш-пулинга: об этой системе сегодня знают не только крупные игроки, ею интересуются и представители среднего и мелкого бизнеса.
Бухгалтерские проводки при физическом кэш-пулинге
Кэш-пулинг требует знания ряда бухгалтерских проводок. Так, в рамках бухучета головной компании отражается движение средств на мастер-счете, которое производится с задействованием субсчета к счету 55. Допустим, 55/4 – это мастер-счет. Счет 55 прописан в Плане счетов как «Специальные счета в банках», поэтому учет средств на нем ведется отдельно от остальных.
Все действия, связанные с выдачей займов, отражаются по требованиям ПБУ 15/2008 «Учет займов и кредитов и затрат по их обслуживанию». Зачисление средств со счетов подразделений компании на мастер-счет рассматривается как получение займа, учет которого происходит на счете 66/1, а отражение процентов – на счете 66/2. Их раздельное отражение предписывает ПБУ 15/2008.
Проводки для головной организации:
Объединенные в группу подразделения тоже имеют счет 55/4 – он требуется для списания с них средств и последующего переведения на мастер-счет. Также в нем содержатся сведения о количестве процентов, начисленных на положительный остаток. Здесь используются проводки, о которых мы уже сказали выше, кроме проводок о переводе денег на мастер-счет и получении займа. В этом случае применяется счет 51.
Если сравнивать с номинальным, физический кэш-пулинг более привлекателен для компаний. Первый дает возможность снизить процентные расходы и сократить накопление остатков, а второй позволяет предприятию добиваться более серьезных финансовых результатов. При отображении процессов кэш-пулинга в 1С проблем не возникает, так как Положения по бухучету и План счетов допускают вариативность учета заемных финансов.
В законодательстве РФ целый раздел посвящен сделкам между лицами, оказывающими друг на друга взаимное влияние в деле ценообразования. Не менее педантично рассматриваются вопросы, связанные с тонкой капитализацией.
Физический кэш-пулинг сопряжен с большими трудозатратами в бухучете, чем виртуальный. Нужно не только вести учет средств с отражением начисляемых процентов на субсчете к 51 счету, но и формировать отчетность по движению денег на мастер-счете. С этой целью создается субсчет к счету 55. Чтобы учитывать все операции, связанные с предоставлением займов другим организациям, субсчет 55 используется в корреспонденции со счетом 58 «Финансовые вложения», а учет заплаченных по займу процентов производится на счете номер 76 «Расчеты с разными дебиторами и кредиторами».
Заключение договора внутрикорпоративного беспроцентного займа крайне нежелательно. Уровень ставки должен соответствовать рыночному и быть равным для всех клиентов группы. В соглашениях с банком нет сведений относительно порядка выплат по займу, а значит, данные правила устанавливаются самими компаниями. Речь идет о краткосрочных займах, поэтому получаемые от них проценты относятся к прочим доходам. Стремясь упростить связанные с этим расчетные операции, банки позволяют автоматизировать некоторые проводки при помощи электронных выписок.
Способы взаимодействия сервисов друг с другом. Пулинг/пуш. Достоинства/недостатки. Выбор
Курьер доставил заказ. По смене статуса заказа надо уведомить заинтересованные стороны об этих событиях.
Клиент отправляет сообщение в чат поддержки. Нужно уведомить сервисы поддержки о поступивших данных от клиента.
Построение отчёта завершено. Ожидающий отчёт пользователь может его загрузить. Надо его уведомить об этом.
Знакомые/типовые ситуации. Одному сервису надо уведомить другой (другие) о происшедших событиях.
Давайте немного усложним:
Какие способы уведомления есть?
Активность со стороны сервера
Это, в общем-то, типовое решение. Сервер держит список заинтересованных сторон. По мере появления событий выполняет HTTP-запросы к клиентам.
Подвариант этого решения: Websocket. Сервер отправляет события в сокеты всем подписанным сторонам.
Повторы, обработка ошибок
Рано или поздно любой TCP/HTTP-канал сталкивается с недоступностью другой стороны. Что делать после возникновения ошибки? Повторять запросы? Что делать с вновь поступающими запросами? Ждать, пока успешно выполнятся предыдущие?
Рассмотрим виды ошибок:
Получив неустранимую ошибку, клиент может только записать её в лог. То есть, если полная остановка доставки сообщений не приемлема, то, получив неустранимую ошибку, типовым решением будет считать, что «уведомление доставлено», и переходить к доставке следующих уведомлений. Вероятно, это единственный нормальный путь.
Идя по этому пути, надо постоянно и внимательно следить за мониторами таких ошибок. Анализировать трафик на тему «почему возникла неустранимая ошибка?» и «можно ли жить дальше с этой ошибкой».
Но это не самая большая проблема.
Более интересными являются проблемы:
500-е ошибки
Мы выполняем запрос-передачу данных для сервера X. Происходит 500-я ошибка. Что это?
Возможны два варианта:
Сервис-приёмник данных по какой-то причине именно сейчас не работает (перегружается, переключается БД итп). В этом случае повтор запроса в дальнейшем приведёт нас к успеху.
В сервисе допущена ошибка, приводящая к 500. В этом случае, сколько бы повторов мы ни сделали, до исправления кода в приёмнике ситуация не изменится.
То есть, по повторяемости запросов ошибки у нас делятся на три вида:
Те, которым повтор поможет (сетевые, устранимые 500-ки).
Те, которым повтор не поможет, но выглядят как те, которым поможет (неустранимые 500-ки).
Те, которым повтор не поможет (например 40x-ки).
Разрабатывая политику повторов, помимо указанной проблемы, имеем ещё множество других проблем:
Как часто повторять запросы?
Не будем ли мы «укладывать» внешний сервис, повторяя запросы?
Не будем ли сами «укладываться», если одна из внешних систем по какой-то причине имеет некорректный TCP-стек ( iptables DROP )?
Если посмотреть на систему повторов запросов, то обнаружится, что практически в каждом случае она выбирается индивидуально.
Если сервис, генерирующий событие, и занимается доставкой его до заинтересованных сторон, то имеем
минимальный лаг доставки
минимальная нагрузка на хранилище сообщений;
необходимость повторов в случае неуспеха доставок
необходимость ведения реестра, кому что доставлено и кому что нужно доставить
двусмысленность некоторых ошибок: непонятно, можно (нужно) ли повторять, или нет
система повторов может быть причиной DDoS для клиентских сервисов.
Также есть некоторое количество организационных минусов:
После того, как клиент прекратил де-факто работу (тут два варианта: сервера выключены, сервера не выключены), система продолжает доставлять ему уведомления.
Вебсокет в режиме клиент-сервер
Часть описанных проблем решает постоянное соединение, инициируемое клиентом. Однако именно часть.
Пулинг
Достоинства пулинга
Максимально быстрое восстановление работоспособности после факапов.
Недостатки пулинга
минимальный лаг доставки сообщений равен интервалу пулинга, который обычно выбирается ненулевым
множество сервисов пулящих один создают существенно бОльшую нагрузку, нежели случай с активным сервисом. Сервисы, для которых нет сейчас никаких сообщений, всё равно создают нагрузку на подсистему доставки сообщений.
Ещё один неочевидный, организационный недостаток пулинга: часто способ получения новой порции данных связан со структурой хранения данных.
отсутствие двусмысленности, описанной выше
наиболее быстрое восстановление работоспособности после сбоя
максимальная независимость от сетевого стека TCP на клиенте
нет необходимости хранить/майнтенить список клиентов.
Лаг доставки
Как правило, запросы для пулинга формулируются как «есть ли данные для меня; если есть, то какие?». Такие запросы (в случае, если они некорректно спроектированы) зачастую имеют следующие проблемы:
при перегрузках количество данных в ответе может расти, или время выполнения запроса ухудшаться.
В случае, если получение очередной порции данных сопровождается простой выборкой из BTREE индекса, то и ответ на вопрос «есть ли данные?», как правило, сравнительно бесплатен. Об индексах поговорим ниже.
А сейчас давайте рассмотрим алгоритм работы традиционного пулера.
Обрабатываем полученные данные
Пауза соответствующая интервалу
Если рассматривать этот алгоритм, то видим, что переменная index и есть то, что связывает нас со структурой хранения данных.
Такой алгоритм, как правило, используют новички и. приводят себя к трудноустранимой проблеме: запросы с большими значениями index сделать индексируемыми крайне сложно. Почти невозможно.
Почему разработчик попадает в такую ситуацию? Потому что проектирует БД и API отдельно друг от друга. А нужно посмотреть на все компоненты в целом и на влияние их друг на друга.
Проблема состоит в том, что в БД, как правило, данные хранятся в виде плоских таблиц. Когда мы получаем очередную порцию данных с одними и теми же условиями фильтрации, то приходится делать что-то вроде следующего:
Как сделать план независящим от положения смещения? Использовать вместо смещения выборку из индекса:
Первичная инициализация. index := 0
Выполняем запрос limit данных, передавая в запрос index
Пауза, соответствующая интервалу
В системе с такой архитектурой, как правило, уже нет существенных препятствий к снижению интервала до минимальных значений (вплоть до нуля).
Но давайте ещё порефлексируем над архитектурой. Что плохого в ней?
Алгоритм привязан к структуре данных
Выполняется практически полностью на стороне клиента
Вследствие предыдущей проблемы сложно, например, централизованно модифицировать его на иную работу после факапов/проблем.
Пользователь может сам подставлять в index произвольные значения. Иногда это может быть нежелательно или приводить к багам, которые разработчику сервера сложно понять.
Давайте ещё раз модифицируем алгоритм. Заменим index на state и управлять им будем с сервера:
Выполняем запрос limit данных, передавая в запрос значение state
Что мы получили? Гибкость.
Переменная state определяется только сервером и не обязана быть привязанной к числу смещения. При желании в этой переменной можем хранить JSON со многими полями.
Если в переменной state хранится не только позиция окна, а, например, и значения фильтров и криптоподпись, то эту переменную имеет смысл называть курсором. Переименуем переменную ещё раз и избавимся от постоянных задержек:
Если данные были, перейти к шагу 2
Таким образом, получаем алгоритм, минимизирующий число запросов, если данных для клиента нет, и запрашивающий данные с максимальной производительностью, если таковые имеются.
Рекомендации по работе с курсорами:
Поскольку хранением курсора между запросами озадачен клиент, то имеет смысл хранить в курсоре и версию ПО сервера. В этом случае можно написать дополнительный код, обеспечивающий обратную совместимость (конвертацию форматов курсоров).
Во избежание трудных багов весь набор фильтров, полученных в первом запросе, хорошо хранить в курсоре и в последующих запросах игнорировать параметры фильтрации не из курсора. Перфекционисты могут даже выделить инициализацию курсора в отдельный запрос.
Во избежание введения в соблазн пользователей использовать в своём коде какие-то данные из курсора, лучше не использовать человекочитаемую строку в значении курсора. JSON, пропущенный через base64-кодирование (и криптоподписанный) подходит идеально.
Пример. Изменение алгоритма после сбоя.
Любая система гарантированной доставки сообщений из точки А в точку B в случае факапов будет накапливать пул недоставленных сообщений. После восстановления работоспособности будет период времени, когда приёмник данных сильно отстаёт от источника.
В случае, если порядок доставки сообщений возможно нарушать, то обработчик запроса с курсором может (продетектировав значительное отставание) начать возвращать два потока данных: тот, на который подписан клиент, и тот же, но с более актуальными данными.
Таким образом, пользователи, запросившие отчёт прямо во время факапа, продолжат его ждать (и дождутся). А пользователи, запросившие отчёт после факапа, получат его с небольшой задержкой.
Пример алгоритма серверной стороны, включающего второй поток в случае сильного отставания, приведён на рисунке.
Пофантазировав, схему можно дополнить не одним, а несколькими фолбеками.
Курсорная репликация
Описанные курсоры можно использовать для репликации данных с сервиса на сервис.
Часто один сервис должен иметь у себя кеш/реплику части данных другого сервиса. При этом требований синхронности к этой реплике нет. Поменялись данные в сервисе A. Они должны максимально быстро поменяться и в сервисе B.
Например, мы хотим реплицировать табицу пользователей с сервиса на сервис.
Для такой репликации можно использовать что-то готовое из инструментария баз данных, а можно сделать небольшой «велосипед». Предположим, что пользователи хранятся в БД PostgreSQL. Тогда делаем следующее:
модифицируем изменяющие пользователей запросы, чтобы на каждое изменение записи пользователя значение lsn устанавливалось бы из растущей последовательности
строим по полю lsn (уникальный) BTREE индекс.
В этом случае обновление записи пользователя будет выглядеть примерно так:
А запрос для работы курсора будет выглядеть как-то так:
Итоги
Почти во всех случаях, когда применяется активная система уведомлений зависимых сервисов, её можно заменить описанной курсорной подпиской.
При этом проблемы доступности клиентов, настроек, работоспособности TCP-стека останутся у клиентов
Максимально быстрое и простое восстановление после простоя/сбоев. Отсутствие двусмысленностей в кодах ошибок.