TLDR:
- .NET SDK 中的所有关键运行时操作(也称为数据平面)都是线程安全的。
- 创建
EventHubClient
对象一次并重复使用
故事
ServiceBus SDK 公开了两种模式来创建发送者:
- 基本的
- 先进的
Basic 版本 - 开发者将直接使用EventHubClient.CreateFromConnectionString()
API,无需担心管理MessagingFactory
对象(连接 gu's)。SDK 将处理MessagingFactory
所有EventHubClient
实例的重用,只要connection string
相同 - 所有键和值的文字匹配 - 在 SDK 中完成此重用。
对于需要在连接级别进行更多控制的高级开发人员,SB SDK 提供MessagingFactory.CreateFromConnectionString()
并且可以从该开发人员创建EventHubClient
实例。
EventHubClient
- 发送到 EventHubs 的所有实例方法都是严格线程安全的。一般来说,所有数据平面操作都是......但是,在从 EventHubs 读取时,API 已针对此模式进行了优化。
while(true) {
var events = eventHubPartitionReceiver.receive(100);
processMyEvents(events);
}
因此,例如:像EventHubReceiver.RuntimeInformation
- 这样的属性在每次receive
调用后填充,没有任何同步。因此,即使实际的receive
API 是线程安全的——对 RuntimeInformation 的后续调用不是——因为很少有人将多个receive
调用停放在PartitionReceiver
.
在每个组件中创建一个新实例EventHubClient
以开始发送消息是默认模式 - ServiceBus SDK 将负责重用底层 MessagingFactory - 它重用相同的物理套接字(如果连接字符串相同)。
如果您正在寻找真正的高吞吐量场景,那么您应该设计一种策略来创建多个 MessagingFactory 对象,然后分别创建一个 EventHubClient。但是 - 在尝试此操作之前,请确保您已经在 Portal 上增加了 EventHub 的吞吐量单位,因为默认值仅为 1 MBPS - 所有 16 个分区的累积。
此外,如果您使用的发送模式是分区发件人——如果你从同一个eventHubClient (.CreatePartitionedSender()) 实例创建所有发件人,它们都将使用相同的底层 MessagingFactory。