Рассмотрим следующий поток сообщений в BizTalk.
У нас есть несколько портов/местоположений получения MLLP, получающих сообщения HL7v2 в одном приложении. Каждый из этих портов получает немного разные типы сообщений.
Назовем это RP1
В другом приложении у нас есть порты отправки, которые подписываются на каждый соответствующий порт приема. Каждый из этих портов отправки имеет исходящую карту, которая преобразует сообщения в HL7v3 и отправляет их в службу WCF (запрос/ответ).
Назовем это SP1
Затем служба WCF обрабатывает и проверяет HL7v3 и отправляет обратно сообщение подтверждения HL7v3. Порт отправки SP1 имеет настраиваемые компоненты конвейера отправки и получения. Получение (из ответа WCF) просто принимает сообщение и продвигает определенные поля, которые будут использоваться позже для подписок.
Затем есть еще два порта отправки. SP2, который подписывается на положительные ACK. SP3 на отрицательный на основе полей, продвинутых выше. Положительные ACK просто потребляются, а отрицательные ACK отправляются по электронной почте в службу поддержки.
Проблема в том, что примерно в 10% сообщений появляется одно из этих двух сообщений об ошибках:
A response message for two-way receive port "SP.CDX.LAB_MICRO.SubmitCDA.WCFCustom" is being suspended as the messaging engine could not correlate the response to an existing request message. This usually happens when the host process has been recycled.
MessageId: {731623F3-995B-4C57-BD21-12865AD78717}
InstanceID: {084BD473-C857-4C5E-A49B-8A86EA2CAC39}
The following stored procedure call failed: " { call [dbo].[bts_UpdateMsgbox_BizTalkServerReceive]( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}". SQL Server returned error string: "The statement has been terminated.;Cannot insert duplicate key row in object 'dbo.InstancesSuspended' with unique index 'IX_InstancesSuspended_InstanceID'. The duplicate key value is (084bd473-c857-4c5e-a49b-8a86ea2cac39, afa466c7-3bd2-4cde-a293-3df3fb5d8543)."
Обычно за этим следует приостановленный экземпляр службы в средстве просмотра группы:
The instance completed without consuming all of its messages. The instance and its unconsumed messages have been suspended
Имя службы приостановленного экземпляра — это имя службы RP1. Тип сообщения неиспользованного сообщения — это тип ACK из пакета обновления 1 (поэтому это ответ WCF). Это странно, потому что, на мой взгляд, RP1 никогда не должен ожидать этого ответного сообщения, И существуют порты отправки (SP2, SP3), подписанные на типы ответных сообщений.
Еще один момент, который я забыл сделать, это то, что есть 3 порта приема, таких как RP1, каждый из которых имеет 3 местоположения получения и 3 порта отправки, подписанных на соответствующие порты приема.
BizTalk Server установлен на 2 физических серверах, совместно использующих 1 BizTalkMgmtDb/Messagebox.
До этого у нас было такое же количество поступающих сообщений, но оно было объединено (на стороне отправки) в одно место получения. В старом решении было несколько оркестраций, но эта проблема никогда не возникала.
Почему теперь ответные сообщения WCF (HL7v3) теряются и приостанавливаются в экземпляре RP1 (HL7v2)?
Вот основное изображение того, как это выглядит.