Azure Service Bus发布成功但消费者找不到主题的问题排查
Azure Service Bus消费者抛出MessagingEntityNotFound异常问题排查
配置信息(appsettings.Development.json)
"EventSettings": { "Events": { "TenantEvents": { "ConnectionString": "Endpoint=sb://<servicebusname>.servicebus.windows.net/;SharedAccessKeyName=SendPolicy;SharedAccessKey=<key>", "TopicName": "tenantevents" }, "AcknowledgmentEvents": { "ConnectionString": "Endpoint=sb://<servicebusname>.servicebus.windows.net/;SharedAccessKeyName=send-and-recieve;SharedAccessKey=<key>", "TopicName": "acknowledgmentevents" } } }
消费者代码
public async Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("Starting EventAcknowledgmentConsumer..."); var eventConfig = _eventSettings.Events["AcknowledgmentEvents"]; _client = new ServiceBusClient(eventConfig.ConnectionString); _receiver = _client.CreateReceiver(eventConfig.TopicName); _logger.LogInformation("EventAcknowledgmentConsumer configured with Topic: {TopicName}", eventConfig.TopicName); // Start receiving messages await ReceiveMessagesAsync(cancellationToken); _logger.LogInformation("EventAcknowledgmentConsumer started."); }
发布者代码(发布功能正常)
app.MapPost("/events/publish", async (IEventPublisher eventPublisher, EventDto eventDto) => { var eventAcknowledgment = new EventAcknowledgment(eventDto.EventId, eventDto.ConsumerId, Enum.Parse<EventAcknowledgment.AcknowledgmentStatus>(eventDto.Status)) { Timestamp = eventDto.Timestamp }; await eventPublisher.PublishAsync(eventAcknowledgment); return Results.Ok(new { Message = "Event published successfully", EventId = eventAcknowledgment.EventId }); });
public async Task PublishAsync<TEvent>(TEvent @event) { var eventConfig = GetEventConfig(@event); await using var client = new ServiceBusClient(eventConfig.ConnectionString); var sender = client.CreateSender(eventConfig.TopicName); var message = new ServiceBusMessage(JsonSerializer.Serialize(@event)) { ContentType = "application/json", SessionId = Guid.NewGuid().ToString() // Set a unique SessionId }; await sender.SendMessageAsync(message); } private EventConfig GetEventConfig<TEvent>(TEvent @event) { return @event switch { TenantCreatedEvent => _eventSettings.Events["TenantEvents"], TenantUpdatedEvent => _eventSettings.Events["TenantEvents"], TenantDeletedEvent => _eventSettings.Events["TenantEvents"], EventAcknowledgment => _eventSettings.Events["AcknowledgmentEvents"], // Add other event types and their corresponding configurations here _ => throw new ArgumentOutOfRangeException(nameof(@event), @event, null) }; }
错误信息
2025-03-03 06:34:54 Azure.Messaging.ServiceBus.ServiceBusException: The messaging entity '<servicebusname>:topic:acknowledgmentevents~15|amqps://<servicebusname>.servicebus.windows.net/-a46a10d0;0:5:6:source(address:/acknowledgmentevents,filter:[])' could not be found. To know more visit https://aka.ms/sbResourceMgrExceptions. TrackingId:bcdbc70c-95ea-47b7-aabd-e6aa3db58423_B6, SystemTracker:gi::G7:Recv:1646104:638765501148700000:<servicebusname>:topic:acknowledgmentevents~15:F0:C11, bi::in-connection2278(G7-1156480)::session2286::link10087117, Timestamp:2025-03-03T05:34:54 TrackingId:fb67cf36800149079d2f511a4d83f734_G7, SystemTracker:gateway10, Timestamp:2025-03-03T05:34:54 (MessagingEntityNotFound). For troubleshooting information, see https://aka.ms/azsdk/net/servicebus/exceptions/troubleshoot. 2025-03-03 06:34:54 at Azure.Messaging.ServiceBus.Amqp.AmqpReceiver.ReceiveMessagesAsyncInternal(Int32 maxMessages, Nullable`1 maxWaitTime, TimeSpan timeout, CancellationToken cancellationToken) 2025-03-03 06:34:54 at Azure.Messaging.ServiceBus.Amqp.AmqpReceiver.<>c.<<ReceiveMessagesAsync>b__44_0>d.MoveNext()
问题
已验证端点名称与主题名称不存在大小写不敏感的重复情况,请问导致该问题的原因是什么?还有哪些排查及解决步骤?
可能的原因
- 直接从主题接收消息的错误用法:Azure Service Bus的主题不能直接通过
CreateReceiver接收消息,必须通过主题下的**订阅(Subscription)**来获取消息。发布者将消息发送到主题后,消息会分发到该主题的所有订阅,消费者只能从订阅中拉取消息。 - 订阅不存在:如果目标主题下没有创建对应的订阅,消费者无法找到可接收消息的实体。
- 会话消息与订阅配置不匹配:发布者发送的消息设置了
SessionId,但对应的订阅未启用会话支持,导致无法识别该消息实体。 - 权限不足:连接字符串对应的Shared Access Policy缺少
Listen权限,即使主题存在,消费者也无法访问。
排查及解决步骤
- 修正消费者代码,通过订阅接收消息:
将CreateReceiver的调用修改为指定订阅名称,示例:
推荐使用// 替换为实际的订阅名称,比如"acknowledgment-subscription" _receiver = _client.CreateReceiver(eventConfig.TopicName, "your-subscription-name");ServiceBusProcessor来更高效地处理消息,示例:var processor = _client.CreateProcessor(eventConfig.TopicName, "your-subscription-name"); processor.ProcessMessageAsync += MessageHandler; processor.ProcessErrorAsync += ErrorHandler; await processor.StartProcessingAsync(cancellationToken); - 确认订阅存在并配置正确:
登录Azure Portal,进入对应的Service Bus命名空间,查看acknowledgmentevents主题下是否存在目标订阅;如果没有,手动创建订阅。 - 启用订阅的会话支持:
由于发布的消息包含SessionId,需要在订阅的设置中勾选“启用会话”选项,确保订阅可以处理会话消息。 - 验证权限配置:
检查连接字符串中的SharedAccessKeyName对应的Shared Access Policy,确认其包含Listen权限("send-and-recieve"策略默认包含Send、Listen、Manage权限,可在Portal的“共享访问策略”中确认)。 - 核对主题和订阅名称:
再次确认代码中使用的主题名称、订阅名称与Azure Portal中的完全一致,注意特殊字符和空格。 - 检查命名空间状态:
确认Service Bus命名空间处于正常运行状态,没有出现停机或配额超限的情况。
内容的提问来源于stack exchange,提问作者Dilanka M
相关产品推荐
相关产品推荐

