一次可以发布到服务总线主题的消息数

Posted

技术标签:

【中文标题】一次可以发布到服务总线主题的消息数【英文标题】:Number of messages that can be published to service bus topic at a time 【发布时间】:2022-01-15 09:34:02 【问题描述】:

限制是多少 TransactionScopeOption as Suppress.我正在批量发布消息 我尝试批量发布 300 条消息..它们已发布 但是 - 有 400 条消息计数,它们没有被发布两个批次的大小都是小于 256 kb。 使用 .net 核心 3.1 消息数量和大小是否有限制?

    var topicClient= new TopicClient(this.servicebusConnectionString, name);    
    using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
       
                            
            foreach (var batch in GetBatches(messageList, BatchSize))
            
                await this.topicClient.SendAsync(batch.ToList()).ConfigureAwait(false);
            
             scope.Complete();
       

为了创建批次,我使用以下函数:

        public static IEnumerable<IEnumerable<Message>> GetBatches(IList<Message> source, long bucketSize)
    
        List<Message> bucket = null;
        long size = 0;
        foreach (var item in source)
        
            if (bucket == null)
            
                bucket = new List<Message>();
            

            size += item.Size;
            if (size <= bucketSize * ConvertToBytes)
            
                bucket.Add(item);
                continue;
            

            yield return bucket;
            bucket = new List<Message>  item ;
            size = item.Size;
        

        if (bucket?.Count > 0 && size <= bucketSize * ConvertToBytes)
        
            yield return bucket;
        
    

【问题讨论】:

您使用的是什么 .NET SDK?如果是最新的,您的ServiceBusClient 是如何配置的?一个小代码 sn-p 不会提供所有这些信息。 “以及两个批次的大小”是什么意思?介意审查和更新您的问题,让那些想要帮助的人更好地了解您所面临的问题吗?谢谢。 尝试发送 400 时遇到什么异常?批次限制为每批次 4500 条消息,但每个事务限制为 100 条消息docs.microsoft.com/en-us/azure/service-bus-messaging/… @SeanFeldman 我已经添加了所需的信息......我要做的基本上是创建小于 256 kb 的批次(来自消息列表)并发布它们。我正在使用 Microsoft.Azure.ServiceBus 包。 关于这个问题的任何更新?这个答案解决了你的问题吗 是的@DeepDave-MT..最好使用 Azure.Messaging.ServiceBus 【参考方案1】:

发送消息时,是否使用Send-Via 功能(最近重命名为跨实体事务)发送消息很重要。启用跨实体事务时,最大消息数不能超过 100条最大单个消息大小,使用标准层时为 256KB。高级层最多支持 1MB。

当调度不带跨实体事务时,总大小是唯一重要的事情。但是消息大小不仅仅是它的Size 属性。这还不够,因为包含所有用户标头和消息系统属性的整个消息都会影响发送到代理的有效负载的整体大小。

不幸的是,对于较旧版本的 Azure 服务总线 SDK,例如 Microsoft.Azure.ServiceBus,无法获得准确的消息大小来构建用于安全发送的批次。如果你愿意,你可以有点estimate and pad the size,但它非常“有损”。

最新的 SDK,Azure.Messaging.ServiceBus 支持batched sending,它通过引入ServiceBusMessageBatch 的概念并允许添加消息,只要它们的序列化大小不超过最大值即可。使用此 SDK 将帮助您将批次填充到最大数量,并让那些没有因负载大小超过最大值而导致发送操作失败的风险。

【讨论】:

以上是关于一次可以发布到服务总线主题的消息数的主要内容,如果未能解决你的问题,请参考以下文章

如何从.net核心应用程序向服务总线主题发送消息

如何删除 Azure 服务总线主题上的死信消息

Azure 服务总线有序处理消息

Azure 服务总线向队列中添加消息的速度过快

在 web api 中接收服务总线消息队列/主题

Azure 服务总线 - 发布到队列和事务范围内的主题