在进行系统集成时,经常需要将源系统的数据映射到目标系统。在某些情况下,为了正确地插入或更新目标系统的记录,必须先在目标系统上查找相应的值。例如,更新一个带有货币值的支付记录时,需要先获取该货币值(例如USD)的GUID,然后再向目标系统发送另一个请求以更新支付记录。这种频繁调用目标系统的做法被称为“chatty calls”,即对目标系统的调用次数过多,这并不是一个好的方法。
为了改善这种情况,可以构建一个缓存,并定期刷新它。缓存将包含所有目标映射值,例如示例场景中的各种货币的GUID。
为什么要缓存映射值?
缓存映射值可以显著提高系统性能,至少可以提高两倍。缓存将包含所有目标映射值,例如各种货币的GUID。典型的缓存数据库将包含GUID值,可以通过传递货币代码和目标代码来检索。这个缓存表由编排定期更新,这将帮助减少对目标系统的方法调用量,从而提高性能。
步骤1:循环直到缓存中有数据
声明一个布尔标志来决定何时退出主循环。仔细观察编排结构,如果将终止标志设置为false(默认值),编排将在刷新缓存之前等待预定义的时间。
步骤2:编写编排的核心代码
使用异常范围来调用一个web服务,以检索构建值映射缓存的所有值。请注意,这个编排仅用于在自定义集成数据库中构建缓存。
步骤3:缓存刷新周期
使用时间跨度对象来配置编排的延迟形状。这将确定缓存刷新周期之间的时间延迟。
步骤4:不要忘记添加配置条目
需要在BizTalk配置文件或使用SSO DB配置中配置终止标志和延迟时间,以刷新缓存。
好消息是,确实有更简单的替代方案。特别是使用BizTalk Xref Data,Michael Stephenson的文章对此有详细的描述,可以参考参考资料部分。
以下是使用C#编写的缓存映射值的示例代码:
public void UpdatePaymentRecord(string currencyCode, decimal paymentAmount)
{
string currencyGUID = GetCurrencyGUID(currencyCode);
UpdatePaymentRecordInDestinationSystem(currencyGUID, paymentAmount);
}
private string GetCurrencyGUID(string currencyCode)
{
// 从缓存中获取货币GUID
string currencyGUID = CacheManager.GetCurrencyGUID(currencyCode);
if (string.IsNullOrEmpty(currencyGUID))
{
// 如果缓存中没有找到,从目标系统获取
currencyGUID = FetchCurrencyGUIDFromDestinationSystem(currencyCode);
// 将获取到的GUID添加到缓存
CacheManager.AddOrUpdateCurrencyGUID(currencyCode, currencyGUID);
}
return currencyGUID;
}
private void UpdatePaymentRecordInDestinationSystem(string currencyGUID, decimal paymentAmount)
{
// 调用目标系统的更新接口
DestinationSystem.UpdatePaymentRecord(currencyGUID, paymentAmount);
}