NServiceBus 版本 2.5 和 4 之间的不兼容性是什么
What are the incompatibilities between NServiceBus versions 2.5 and 4
我听说很多人说这两者不兼容,但我还没有看到关于这些不兼容的任何明确细节。具体我想知道:
- 什么会阻止我直接将现有的 2.5 端点迁移到最新的 4.x 版本而不先移动到 3.x 端点。
- 在创建新的 4.x 端点时,考虑到它需要与 2.5 端点通信,有什么我应该注意的吗?新端点将需要消耗 2.5 messages\events 并生成 2.5 兼容消息
没有什么可以阻止您直接从 V2.x 迁移到 V4.x,但是,这可能会使过程变得更加困难。默认支持一种版本向后兼容,因此您必须在您的上下文中测试消息版本支持。
这里有一些注意事项:
正在将 2.x 升级到 3.x
注意:您需要分两步完成:第一步:2.6 到 3.3.8(最新 3.x) 第二步:V 3.x 到 v 4.x
正在将 2.x 升级到 3.x 笔记
您可能希望在升级过程中转向非干扰模式,以减少代码中的耦合。
saga 持久化的格式在 SQL 服务器中更改为枚举类型,在 V2 下它们按“名称”存储,在 V3 下枚举的值(即 1,2,3,4)存储在数据库中 table。
此处描述了超时迁移:http://docs.particular.net/nservicebus/migrating-to-nservicebus-3.0-timeouts
V2 中的 DI 抽象将注入一个声明为“public static”的 属性,但在 V3 中它不会注入一个静态 属性。如果你有在 V2 下“工作”的静态属性,它们在 V3 下将是空的,直到你使它们不是静态的。
正在将 2.x 升级到 3.x 链接:
https://github.com/Particular/NServiceBus/releases/tag/3.3.8 http://www.youtube.com/watch?v=LH0qeienRpg http://andreasohlund.net/2012/01/27/convention-over-configuration-in-nservicebus-3-0/ http://andreasohlund.net/2012/03/08/nservicebus-3-0/ Migration patch from NServiceBus 2.6 to NServiceBus 3.0
升级3.x到4.x应该比较简单。
如果您使用的是 nuget
对于每个NServiceBus包,在nuget管理控制台输入
更新包 NServiceBus -vresion 4.
先决条件:NServiceBus V4.0 需要 RavenDB 2.0.0.2261 或更高版本
NServiceBus V4.0 需要在同一台机器上安装最新的 RavenDB v2.x。
名称空间更改为类型和接口
INeedInitialization
在 NServicebus 4.0 之前,接口 INeedInitialization 是在 NServiceBus.Config 中定义的。在 NServicebus 4.0 中,它被定义在更高的命名空间级别,即 NServiceBus。如果您收到以下编译器错误,请删除对 NServiceBus.Config 的使用引用并使用 NServiceBus 解决:错误 CS0104:
'INeedInitialization' 是 'NServiceBus.INeedInitialization' 和 'NServiceBus.Config.INeedInitialization' 之间的模糊引用
使用错误和审计队列
管理服务(现在称为 ServiceConbtrol)(与 NServiceBus V4.0 一起安装)使用来自定义的 MSMQ 错误和审核队列的消息。当管理服务处于 运行ning 时,您可以通过查看 Error.log 队列来查看错误消息,并且可以使用 ServiceInsight 查看审核数据。
自动订阅
只有标记为事件(IEvent 或 DefiningEventsAs())的消息才会被自动订阅。
默认事务隔离级别
默认的事务隔离级别现在是 ReadCommitted。要恢复为可序列化,请使用此代码:
Configure.Transactions.Advanced(设置=>
settings.IsolationLevel(IsolationLevel.Serializable));
SecondLevelRetries:SecondLevelRetries 类型(在 NServiceBus.Management.Retries 命名空间中用于配置重试和超时策略)已移至 NServiceBus.Features 命名空间。虽然版本 3.3.x 有一个单独的策略来管理二级重试和超时,但它已被合并到 NServiceBus 4.0 中新的 RetryPolicy 中,并且能够实现这两个功能。
重大更改
PowerShell cmdlet
NServiceBus.Host 不再支持 /installinfrastructure。请改用 PowerShell cmdlet。 PowerShell cmdlet 已重命名,因此它们不会与任何现有 cmdlet 冲突。
NServiceBus.WebService:
使用 NServiceBus.Webservice 将端点公开为 WebService 已在 4.0 中弃用。请改用 WcfService 选项。例如:
你的WcfService:WcfService
交易运输
过去在命名空间 NServiceBus.Unicast.Transport.Transactional 中定义的类型 TransactionalTransport 已重命名为 TransportReceiver 并移至命名空间 NServiceBus.Unicast.Transport。如果您收到以下编译器错误,请使用上面指定的新命名空间解决。
错误 CS0246:找不到类型或命名空间名称 'TransactionalTransport'(是否缺少 using 指令或程序集引用?)
新的传输支持和配置
这些新的传输示例已添加到 NServiceBus 示例中,说明了如何配置新的传输:
Messaging.ActiveMQ
Messaging.RabbitMQ
Messaging.SqlServer
Messaging.MSMQ
新配置 APIs
简化传输配置并使其在所有传输中保持一致。在您的配置文件中,指定一个连接字符串,如下所示:
然后您有两个选项来指定传输:将其指定为 IConfigureThisEndpoint class 声明的一部分,例如:
publicclass端点配置:IConfigureThisEndpoint,AsA_Server,
使用交通工具
或者在IWantCustomInitialization.Init方法中指定,
publicclass端点配置:IConfigureThisEndpoint,AsA_Server,
我要自定义初始化
{
public无效初始化(){
Configure.With().DefaultBuilder()
.UseTransport()
}
}
用于新传输的新 NuGet 包
这些 NuGet 包也可用:
NServiceBus.SqlServer
NServiceBus.ActiveMQ
NServiceBus.RabbitMQ
如何安装 NServiceBus.ActiveMQ 软件包
的示例
PM> 安装包 NServiceBus.ActiveMQ
新传输 DLL
添加对新传输 DLL 的引用(在 Binaries 目录中):
NServiceBus.Transports.RabbitMQ.dll
NServiceBus.Transports.SQlServer.dll
NServiceBus.Transports.ActiveMQ.dll
MSMQ 目前在 NServiceBus.Core.dll 中,不需要任何额外的参考。 NuGet 自动添加引用。
配置更改
XmlMessageSerializer
现在支持不将消息包装在单个消息的元素中。这使得与其他系统的互操作性更容易。要启用此功能:
.XmlSerializer( dontWrapSingleMessages: true )
MsmqTransportConfig
MsmqTransportConfig 部分已被弃用,取而代之的是 TransportConfig 部分,如下所示:
INeedToInstallSomething
INeedToInstallSomething 接口现在通过容器解析。
NHibernate 配置
NHibernate 设置已经简化,如下:
性能计数器
新的吞吐量性能计数器和更新的性能计数器可用:
每台机器安装的 NServiceBus 许可证
现在可以在 HKLM 中安装许可证,允许您为每台服务器安装一个许可证,而不是为每个端点或每个 Windows 帐户安装一个许可证。
LicenseInstaller.exe C:\License.xml
Powershell cmdlet 更新
NServiceBus PowerShell cmdlet 已移至 NServiceBus.PowerShell.dll。要导入它,运行 这个:
PM> 导入模块 .\NServiceBus.PowerShell.dll
NServiceBus Powershell cmdlet 已重命名,因此它们不会与任何现有 cmdlet 冲突:
安装 NServiceBus 许可证文件。安装 NServiceBusLicense
显示队列中的所有消息。获取 NServiceBusMSMQMessage
显示 NServiceBus 安装的版本。获取 NServiceBusVersion
在机器上安装 DTC。安装 NServiceBusDTC
在机器上安装 RavenDB。安装-NServiceBusRavenDB
在计算机上安装 NServiceBus 性能计数器。安装 NServiceBusPerformanceCounters
在计算机上安装 MSMQ。安装 NServiceBusMSMQ
验证机器上是否安装了 DTC 和 运行ning。测试NServiceBusDTC安装
确保 RavenDB 在机器上。测试NServiceBusRavenDB安装
验证 NServiceBus 性能计数器是否已正确安装在计算机上。测试NServiceBusPerformanceCounters安装
验证 MSMQ 是否正确安装在计算机上。测试NServiceBusMSMQ安装
将所需的配置部分添加到配置文件。添加 NServiceBusMessageForwardingInCaseOfFaultConfig
显示默认的错误和审计队列。获取 NServiceBusLocalMachineSettings
允许指定默认错误和审计队列。一组 NServiceBusLocalMachineSettings
NServiceBus.Host 不再支持 /installinfrastructure。请改用 PowerShell cmdlet。
新端点配置 API
示例用法:
Configure.Endpoint.AsSendOnly()
.Advanced(设置=> settings.DisableDurableMessages());
Configure.Transactions.Enable()
.Advanced(设置=> settings.IsolationLevel(IsolationLevel.Serializable)
.DefaultTimeout(TimeSpan.FromSeconds(40))
.DisableDistributedTransactions());
嵌入式 RavenDB
RavenDB 不再被合并。它是嵌入的,使用 https://github.com/Fody/Costura#readme。嵌入支持客户端更新(但可能需要绑定重定向)。它还允许传递您自己的 DocumentStore,从而提供完整的配置灵活性。审计和错误队列默认值
现在可以在注册表中指定审核和错误队列的服务器默认值(请参阅上面的新 PowerShell cmdlet Get/Set-NServiceBusLocalMachineSettings)。
有关详细信息,请查看发行说明(https://github.com/Particular/NServiceBus/releases/tag/4.0.0)
===============
HTH
我听说很多人说这两者不兼容,但我还没有看到关于这些不兼容的任何明确细节。具体我想知道:
- 什么会阻止我直接将现有的 2.5 端点迁移到最新的 4.x 版本而不先移动到 3.x 端点。
- 在创建新的 4.x 端点时,考虑到它需要与 2.5 端点通信,有什么我应该注意的吗?新端点将需要消耗 2.5 messages\events 并生成 2.5 兼容消息
没有什么可以阻止您直接从 V2.x 迁移到 V4.x,但是,这可能会使过程变得更加困难。默认支持一种版本向后兼容,因此您必须在您的上下文中测试消息版本支持。
这里有一些注意事项:
正在将 2.x 升级到 3.x
注意:您需要分两步完成:第一步:2.6 到 3.3.8(最新 3.x) 第二步:V 3.x 到 v 4.x
正在将 2.x 升级到 3.x 笔记
您可能希望在升级过程中转向非干扰模式,以减少代码中的耦合。 saga 持久化的格式在 SQL 服务器中更改为枚举类型,在 V2 下它们按“名称”存储,在 V3 下枚举的值(即 1,2,3,4)存储在数据库中 table。 此处描述了超时迁移:http://docs.particular.net/nservicebus/migrating-to-nservicebus-3.0-timeouts V2 中的 DI 抽象将注入一个声明为“public static”的 属性,但在 V3 中它不会注入一个静态 属性。如果你有在 V2 下“工作”的静态属性,它们在 V3 下将是空的,直到你使它们不是静态的。 正在将 2.x 升级到 3.x 链接:
https://github.com/Particular/NServiceBus/releases/tag/3.3.8 http://www.youtube.com/watch?v=LH0qeienRpg http://andreasohlund.net/2012/01/27/convention-over-configuration-in-nservicebus-3-0/ http://andreasohlund.net/2012/03/08/nservicebus-3-0/ Migration patch from NServiceBus 2.6 to NServiceBus 3.0
升级3.x到4.x应该比较简单。
如果您使用的是 nuget
对于每个NServiceBus包,在nuget管理控制台输入
更新包 NServiceBus -vresion 4.
先决条件:NServiceBus V4.0 需要 RavenDB 2.0.0.2261 或更高版本
NServiceBus V4.0 需要在同一台机器上安装最新的 RavenDB v2.x。
名称空间更改为类型和接口
INeedInitialization
在 NServicebus 4.0 之前,接口 INeedInitialization 是在 NServiceBus.Config 中定义的。在 NServicebus 4.0 中,它被定义在更高的命名空间级别,即 NServiceBus。如果您收到以下编译器错误,请删除对 NServiceBus.Config 的使用引用并使用 NServiceBus 解决:错误 CS0104:
'INeedInitialization' 是 'NServiceBus.INeedInitialization' 和 'NServiceBus.Config.INeedInitialization' 之间的模糊引用 使用错误和审计队列
管理服务(现在称为 ServiceConbtrol)(与 NServiceBus V4.0 一起安装)使用来自定义的 MSMQ 错误和审核队列的消息。当管理服务处于 运行ning 时,您可以通过查看 Error.log 队列来查看错误消息,并且可以使用 ServiceInsight 查看审核数据。
自动订阅
只有标记为事件(IEvent 或 DefiningEventsAs())的消息才会被自动订阅。
默认事务隔离级别
默认的事务隔离级别现在是 ReadCommitted。要恢复为可序列化,请使用此代码:
Configure.Transactions.Advanced(设置=> settings.IsolationLevel(IsolationLevel.Serializable)); SecondLevelRetries:SecondLevelRetries 类型(在 NServiceBus.Management.Retries 命名空间中用于配置重试和超时策略)已移至 NServiceBus.Features 命名空间。虽然版本 3.3.x 有一个单独的策略来管理二级重试和超时,但它已被合并到 NServiceBus 4.0 中新的 RetryPolicy 中,并且能够实现这两个功能。
重大更改
PowerShell cmdlet
NServiceBus.Host 不再支持 /installinfrastructure。请改用 PowerShell cmdlet。 PowerShell cmdlet 已重命名,因此它们不会与任何现有 cmdlet 冲突。
NServiceBus.WebService:
使用 NServiceBus.Webservice 将端点公开为 WebService 已在 4.0 中弃用。请改用 WcfService 选项。例如:
你的WcfService:WcfService 交易运输
过去在命名空间 NServiceBus.Unicast.Transport.Transactional 中定义的类型 TransactionalTransport 已重命名为 TransportReceiver 并移至命名空间 NServiceBus.Unicast.Transport。如果您收到以下编译器错误,请使用上面指定的新命名空间解决。
错误 CS0246:找不到类型或命名空间名称 'TransactionalTransport'(是否缺少 using 指令或程序集引用?) 新的传输支持和配置
这些新的传输示例已添加到 NServiceBus 示例中,说明了如何配置新的传输:
Messaging.ActiveMQ Messaging.RabbitMQ Messaging.SqlServer Messaging.MSMQ 新配置 APIs
简化传输配置并使其在所有传输中保持一致。在您的配置文件中,指定一个连接字符串,如下所示:
然后您有两个选项来指定传输:将其指定为 IConfigureThisEndpoint class 声明的一部分,例如:
publicclass端点配置:IConfigureThisEndpoint,AsA_Server, 使用交通工具 或者在IWantCustomInitialization.Init方法中指定,
publicclass端点配置:IConfigureThisEndpoint,AsA_Server, 我要自定义初始化 { public无效初始化(){ Configure.With().DefaultBuilder() .UseTransport() } } 用于新传输的新 NuGet 包
这些 NuGet 包也可用:
NServiceBus.SqlServer NServiceBus.ActiveMQ NServiceBus.RabbitMQ 如何安装 NServiceBus.ActiveMQ 软件包
的示例PM> 安装包 NServiceBus.ActiveMQ 新传输 DLL
添加对新传输 DLL 的引用(在 Binaries 目录中):
NServiceBus.Transports.RabbitMQ.dll NServiceBus.Transports.SQlServer.dll NServiceBus.Transports.ActiveMQ.dll MSMQ 目前在 NServiceBus.Core.dll 中,不需要任何额外的参考。 NuGet 自动添加引用。
配置更改
XmlMessageSerializer
现在支持不将消息包装在单个消息的元素中。这使得与其他系统的互操作性更容易。要启用此功能:
.XmlSerializer( dontWrapSingleMessages: true ) MsmqTransportConfig
MsmqTransportConfig 部分已被弃用,取而代之的是 TransportConfig 部分,如下所示:
INeedToInstallSomething
INeedToInstallSomething 接口现在通过容器解析。
NHibernate 配置
NHibernate 设置已经简化,如下:
性能计数器
新的吞吐量性能计数器和更新的性能计数器可用:
每台机器安装的 NServiceBus 许可证
现在可以在 HKLM 中安装许可证,允许您为每台服务器安装一个许可证,而不是为每个端点或每个 Windows 帐户安装一个许可证。
LicenseInstaller.exe C:\License.xml Powershell cmdlet 更新
NServiceBus PowerShell cmdlet 已移至 NServiceBus.PowerShell.dll。要导入它,运行 这个:
PM> 导入模块 .\NServiceBus.PowerShell.dll NServiceBus Powershell cmdlet 已重命名,因此它们不会与任何现有 cmdlet 冲突:
安装 NServiceBus 许可证文件。安装 NServiceBusLicense 显示队列中的所有消息。获取 NServiceBusMSMQMessage 显示 NServiceBus 安装的版本。获取 NServiceBusVersion 在机器上安装 DTC。安装 NServiceBusDTC 在机器上安装 RavenDB。安装-NServiceBusRavenDB 在计算机上安装 NServiceBus 性能计数器。安装 NServiceBusPerformanceCounters 在计算机上安装 MSMQ。安装 NServiceBusMSMQ 验证机器上是否安装了 DTC 和 运行ning。测试NServiceBusDTC安装 确保 RavenDB 在机器上。测试NServiceBusRavenDB安装 验证 NServiceBus 性能计数器是否已正确安装在计算机上。测试NServiceBusPerformanceCounters安装 验证 MSMQ 是否正确安装在计算机上。测试NServiceBusMSMQ安装 将所需的配置部分添加到配置文件。添加 NServiceBusMessageForwardingInCaseOfFaultConfig 显示默认的错误和审计队列。获取 NServiceBusLocalMachineSettings 允许指定默认错误和审计队列。一组 NServiceBusLocalMachineSettings NServiceBus.Host 不再支持 /installinfrastructure。请改用 PowerShell cmdlet。 新端点配置 API
示例用法:
Configure.Endpoint.AsSendOnly() .Advanced(设置=> settings.DisableDurableMessages()); Configure.Transactions.Enable() .Advanced(设置=> settings.IsolationLevel(IsolationLevel.Serializable) .DefaultTimeout(TimeSpan.FromSeconds(40)) .DisableDistributedTransactions()); 嵌入式 RavenDB
RavenDB 不再被合并。它是嵌入的,使用 https://github.com/Fody/Costura#readme。嵌入支持客户端更新(但可能需要绑定重定向)。它还允许传递您自己的 DocumentStore,从而提供完整的配置灵活性。审计和错误队列默认值 现在可以在注册表中指定审核和错误队列的服务器默认值(请参阅上面的新 PowerShell cmdlet Get/Set-NServiceBusLocalMachineSettings)。
有关详细信息,请查看发行说明(https://github.com/Particular/NServiceBus/releases/tag/4.0.0)
===============
HTH