BizTalk部署:无需导入MSI仅安装DLL到GAC的允许变更
在BizTalk生产环境搞部署,最头疼的就是导入MSI会强制停掉业务流程、终止运行中的实例——毕竟生产环境能少折腾就少折腾。其实有些场景下,你完全不用走MSI导入那一套,只要把更新后的DLL装到GAC,再重启对应应用的主机实例就搞定了,对业务的影响小很多。下面具体说哪些变更属于这类情况:
非破坏性的架构(Schema)变更:要是你只是给Schema加了个可选字段、改了字段的描述文本、调整了非关键的约束规则,而且没有修改消息的核心结构(比如根节点名称、必填字段类型),那直接把更新后的Schema DLL替换到GAC里,重启对应主机实例就生效。这种变更不会影响现有消息的解析,BizTalk运行时会自动加载GAC里的最新版本。
映射(Map)的逻辑调整:只要映射的输入输出Schema没做兼容性破坏的改动,只是修改了映射规则——比如调整字段的映射关系、给脚本functoid改了逻辑、新增了几个字段的转换——那更新GAC里的映射DLL,重启主机实例就行。BizTalk处理映射时会直接从GAC取最新的逻辑,不用重新导入MSI触发流程停止。
业务流程(Orchestration)内部逻辑修改:如果只是改了流程内部的逻辑,比如调整分支判断条件、加了个日志输出、优化了变量处理逻辑,没碰端口绑定、消息类型定义、流程的起始/终止节点,也没改流程DLL的强名称,那把新的Orchestration DLL装到GAC,重启对应主机实例就可以。这里要注意:已经在跑的实例会继续用旧版本的逻辑,新启动的实例才会用新版本,要是需要所有实例都用新逻辑,可能得等旧实例跑完,或者评估后再操作。
自定义辅助类库的更新:如果你的BizTalk应用用到了自己写的辅助类库(比如通用工具类、数据访问组件),只要类库的接口没做破坏性变更(比如没删方法、没改参数类型),直接把新的类库DLL装到GAC,重启主机实例,BizTalk应用就会自动加载新版本的类库,完全不用动BizTalk应用的MSI。
关键注意事项
别光顾着省事,这些场景有几个前提要记牢:
- 所有变更的DLL强名称版本号最好不要变,要是版本号改了,得确保BizTalk应用里的引用已经指向了新版本——生产环境尽量别随便改版本号,避免不必要的依赖问题。
- 重启主机实例的时候,只需要重启对应BizTalk应用关联的那几个主机实例,不用停掉所有BizTalk服务,这样对业务的影响降到最低。
- 要是变更涉及到端口绑定、应用配置、Schema的破坏性修改(比如删了必填字段、改了根节点名称),那必须通过管理控制台导入MSI,因为这些变更需要更新BizTalk的配置数据库,光靠GAC更新是覆盖不了的。
内容的提问来源于stack exchange,提问作者Piotr Grudzień

