Стратегии повторного упорядочения для заказанной доставки в BizTalk:
Я недавно ответил на вопрос пользователя пользователя LinkedIn о заказанных способах доставки в BizTalk.
Я подумал, что людям было бы полезно понять некоторые стратегии повторного упорядочения сообщений с помощью BizTalk.
Зачастую, как разработчик BizTalk, вы должны интегрироваться в бизнес-системы, которые нельзя изменить. Это может быть по одной или нескольким различным причинам. Например, стоимость замены системы может быть слишком высокой или лицензия поставщика заявляет, что поддержка может быть отозвана в случае замены системы.
Обычно это не представляет проблему, если поставщик предоставил продуманно разработанный API в качестве конечной точки точки интеграции. Однако, как быстро учатся многие разработчики интеграции, это происходит очень редко.
Что я подразумеваю под продуманным API? Ну, кроме всех принципов SODA (состав службы, контракты на отказ и т. Д.), Наиболее важной особенностью API является поддержка потребления данных, которые поступают в неправильном порядке .
Это довольно простая вещь. Например, если вы поставщик и в качестве точки интеграции вы предоставляете HTTP-операцию, то одним из полей, которые вы можете указать в своей операции, является отметка времени или, что еще лучше, порядковый номер. Это означает, что если вызов сделан с устаревшей полезной нагрузкой, соответствующий механизм компенсации может включиться - что может быть так же просто, как и сброс данных.
В этой статье обсуждается, что делать, если поставщик не встроил эту функцию в API, и поэтому как интегратор вы вынуждены внедрять сквозную заказанную доставку как часть вашего интеграционного решения.
Как указано в моем ответе на сообщение пользователя в LinkedIn (см. Ссылку выше), в BizTalk заказанная доставка в любом, но простейшем из сценариев в лучшем случае сложна и в худшем случае может привести к огромным затратам в повышенная сложность, как с точки зрения разработки, так и поддержки. Основная причина заключается в том, что BizTalk спроектирован так, чтобы быть одновременно массовым для обеспечения высокой пропускной способности, и существует прямой и неизбежный конфликт между параллелизмом и упорядочением. Заказанная поставка E-EE в решение BizTalk опирается на такие артефакты, как одноэлементные оркестровки, которые привносят сложность и увеличивают как частоту отказов, так и число затрат на отказ.
Намного лучшим решением будет поддерживать параллельную обработку как можно ближе к конечным точкам бизнес-системы, а затем внедрить так называемую оболочку повторного секвенсора вокруг каждой из конечных точек, которая требовать, чтобы данные были доставлены в правильном порядке.
Как реализовать такую оболочку в BizTalk, зависит от некоторых факторов, которые описаны в следующей таблице:
|Sequencing |Messages|Database |Wrapper |
|field |are |integration?|strategy |
| |deltas? | | |
|--------------|--------|------------|----------------------------------|
|n of a total m| N | Y |Stored procedure |
|n of a total m| N | N |Singleton orchestration |
|n of a total m| Y | Y |Batched singleton orchestration |
|n of a total m| Y | N |Batched singleton orchestration |
|Timestamp | N | Y |Stored procedure |
|Timestamp | N | N |Singleton orchestration |
|Timestamp | Y | Y |Buffer table with staggered reader|
|Timestamp | Y | N |Buffer table with staggered reader|
Первый фактор Поле секвенирования относится к идее, что для реализации любого вида оболочки повторного секвенсора, как минимум, вам потребуется, чтобы данные вашего сообщения содержали некоторую информацию о последовательности. Это может принимать форму метки времени источника; однако лучший, хотя и более редкий вид информации о последовательности состоит из порядкового номера в сочетании с общим количеством сообщений, например, сообщение 1 из 10, 2 из 10 и т. д.
Второй фактор Сообщения являются дельтами? относится к тому, содержит ли полезная нагрузка вашего сообщения одно изменение состояния данных или сумму всех прошлых изменений данных , Другими словами, возможно ли восстановить полное текущее состояние данных из этого сообщения? Если полезная нагрузка сообщения содержит только одно изменение, то может оказаться невозможным восстановить состояние данных из одного сообщения, и в этом случае ваше сообщение представляет собой delta .
Третий фактор Интеграция базы данных? относится к тому, является ли точка входа интеграции в систему базой данных. Причина, по которой это имеет значение, заключается в том, что интеграция на уровне базы данных является довольно распространенным сценарием интеграции и, если он доступен, может значительно упростить обработку повторного упорядочения.
Стратегии из приведенной выше таблицы подробно описаны ниже:
Хранитель хранимых процедур
Это самая простая из стратегий повторного упорядочения. Создается новая хранимая процедура, которая запрашивает целевые данные, прежде чем принять решение о необходимости обновления целевых данных. Решение может быть таким же простым, как . Имеются ли у меня данные новее, чем данные в целевой системе?
Конечно, чтобы реализовать эту стратегию, целевые данные также должны включать поле последовательности исходных данных, хотя при необходимости можно сделать приближение, полагаясь на существующие временные метки, которые могут уже существовать в целевом. данные. Оболочка хранимой процедуры может содержаться либо в целевой базе данных, либо в идеале в отдельной базе данных.
Оболочка оркестровки Singleton
Идея этой стратегии - оркестровка синглтона. Это шаблон, который вы можете реализовать, чтобы гарантировать, что в любой момент времени будет существовать только один экземпляр оркестровки. В Интернете есть много статей, демонстрирующих, как реализовать этот шаблон в BizTalk.
Суть идеи заключается в том, что синглтон просто отслеживает последовательность самого последнего успешно обработанного сообщения (или отметку времени). Если синглтон получает сообщение, которое старше, чем самая последняя последовательность, он просто отбрасывается. Это работает, потому что сообщения non-deltas , поэтому целевая система может зафиксировать только самое последнее из ряда сообщений, и данные будут в самом последнем состоянии. Только после успешной фиксации данных обновляется самая последняя последовательность, содержащаяся в синглтоне.
Пакетная одноэлементная оркестровая оболочка
Эта стратегия основана на приведенной выше оболочке оркестровки Singleton, за исключением того, что она более сложная. Вместо того, чтобы хранить только самую последнюю информацию о последовательности в памяти, синглетон должен создать и хранить в памяти рабочий набор сообщений, которые он будет переупорядочивать, а затем обрабатывать, как только все ожидаемые сообщения из пакета поступят , Это связано с тем, что сообщения являются дельтами, поэтому целевая система ДОЛЖНА получать каждое сообщение в том порядке, в котором они были предназначены. Как только партия была успешно отправлена, синглтон может прекратить работу.
Для этого необходимо, чтобы исходные данные содержали корреляционный идентификатор некоторого описания, который позволяет определить пакет сообщений . Например, при обработке определенного набора заказов от клиента входящие сообщения должны содержать идентификатор для клиента. Затем его можно использовать для маршрутизации сообщений в единичный экземпляр оркестровки, связанный с этим клиентом. Кроме того, доступное поле последовательности сообщений должно иметь форму n общей формы m .
Как только синглтон инициализируется, он собирает рабочий набор сообщений в памяти и продолжает заполнять его по мере поступления новых сообщений. Один из способов сделать это - использовать System.Collections.Generic.List в качестве контейнера для рабочего набора. После того, как список заполнен полностью (длина списка = m), предполагается, что все сообщения в пакете были получены, и оркестровка затем последовательно проходит по рабочему набору и обрабатывает сообщения в целевой системе.
Одним из преимуществ пакетной одноэлементной оболочки оркестровки является возможность одновременной обработки по идентификатору корреляции. В приведенном выше примере это означает, что сообщения от двух клиентов будут обрабатываться одновременно.
Буферный стол с шахматной упаковкой для считывателя Возможно, это самая сложная из представленных стратегий, это решение следует использовать, когда у вас есть дельта-сообщения с полем последовательности на основе меток времени. Это может быть реализовано с базой данных некоторого описания, которая действует как буфер повторного секвенирования .
Стоит отметить, что эта упаковка для повторного упорядочения не гарантирует заказанную доставку, но при правильном использовании делает заказанную доставку весьма вероятной.
По мере поступления сообщений они записываются в буфер, и в ходе одной и той же операции буфер переупорядочивается, так что порядок сообщений, содержащихся в буфере, всегда является правильным.
Чтобы создать средство чтения буфера, необходимо иметь место приема, которое считывает сообщения в буфере, прежде чем передавать сообщения на порт отправки с включенной заказанной доставкой, который затем будет обрабатывать сообщения в целевой системе. Вы также можете использовать одноэлементную оркестровку в качестве посредника, если семантика API вашей целевой системы слишком сложна для порта отправки.
Однако использование этой обертки, как я ее описал выше, не разрешит упорядоченную доставку, поскольку сообщения почти наверняка будут отправлены в буфер в неправильном порядке, что приведет к обработке сообщений в целевой системе в тот же (неправильный) порядок. Вот где приходит ступенчатый запрос . Это причудливый способ сказать, что ваш буферный запрос должен выбирать данные только с интервалами времени T , И выбирать только те строки, где строка -номер меньше, чем общее количество строк в буфере минус C .
Это дает эффект того, что последовательность происходит в течение соответствующего промежутка времени . T будет знаком большинству разработчиков BizTalk как интервал опроса некоторых адаптеров (таких как адаптер WCF-SQL ). C установить немного сложнее, но, увеличив это число, вы уменьшаете вероятность того, что при опросе вы пропустите сообщение, более старое, чем последнее в вашем наборе полученных данных.
Что T и C зависит от многих вещей, хотя эти значения должны основываться на вашем SLA с задержкой и объеме вашего сообщения (или пропускной способности). Как правило, если у вас есть SLA для доставки данных в целевую систему в течение 30 секунд, и вы обрабатываете 10 сообщений в секунду, тогда T должно составлять около 10 секунд, а C - около 100 рядов.
Конечно, это работает, только если ваши сообщения для данного идентификатора корреляции отправляются исходной системой в течение короткого промежутка времени (в идеале, спина к спине). Чем дольше интервал между отправками, тем больше требуемое значение C и тем менее эффективным становится оболочка.
Одним из преимуществ этой стратегии является то, что вы также можете выполнять дедупликацию сообщений в буфере, если ваш источник данных склонен к отправке дублирующих сообщений и ваша конечная точка целевой системы не идемпотентна. Вы также можете использовать буфер для реализации FILO и другой нестандартной семантики очередей.
Выводы
Стратегии, которые я обсуждал здесь, - это способы заставить BizTalk выполнить задачу, для которой она не предназначена. В результате у каждого есть предостережения относительно стоимости и сложности для поддержки, а также может не работать в определенных сценариях. Я хотел бы услышать от любого, кто внедрил другие шаблоны для заказанной доставки в BizTalk.