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调用后填充,没有任何同步。因此,即使实际的receiveAPI 是线程安全的——对 RuntimeInformation 的后续调用不是——因为很少有人将多个receive调用停放在PartitionReceiver.
在每个组件中创建一个新实例EventHubClient以开始发送消息是默认模式 - ServiceBus SDK 将负责重用底层 MessagingFactory - 它重用相同的物理套接字(如果连接字符串相同)。
如果您正在寻找真正的高吞吐量场景,那么您应该设计一种策略来创建多个 MessagingFactory 对象,然后分别创建一个 EventHubClient。但是 - 在尝试此操作之前,请确保您已经在 Portal 上增加了 EventHub 的吞吐量单位,因为默认值仅为 1 MBPS - 所有 16 个分区的累积。
此外,如果您使用的发送模式是分区发件人——如果你从同一个eventHubClient (.CreatePartitionedSender()) 实例创建所有发件人,它们都将使用相同的底层 MessagingFactory。