You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Service Bus Topic发布消息无报错但未持久化问题排查求助

Azure Function向Service Bus主题发送消息无异常但消息未写入问题

2021年10月20日更新

向队列发布消息功能运行正常,发布到队列的消息会被持久化存储,但向主题发布的消息不会被持久化。

更新

下文新增了可复现相同问题的简单控制台应用代码。

我尝试从Azure Function向Service Bus的主题发送消息,分别测试了两种方案:一是通过Mass Transit使用托管身份发送,二是通过Azure.Messaging.ServiceBus NuGet包使用共享访问密钥发送。两种方案执行都无异常抛出,但主题中始终没有对应消息。

从函数侧发送消息时观测到的指标如下:
Azure Overview Metrics

主题的附加配置如下:
Topic Settings

我可以通过Azure门户内的Service Bus Explorer成功向该主题写入消息。
当前该主题下没有任何订阅,此前测试时曾创建过一个订阅,现已删除。

Mass Transit 配置(Startup.cs)

private void ConfigureMassTransit(IServiceCollection services, IConfiguration config) {
    const string KEY_QUEUE_SERVER  = "REDACTED";
    const string EMAIL_RETRY_TOPIC = "REDACTED";
    const string EMAIL_SENT_TOPIC  = "REDACTED";

    services.AddMassTransit(x => {
        x.UsingAzureServiceBus((context, cfg) => {
            cfg.Host(new Uri(config[KEY_QUEUE_SERVER]), host => {
                host.TokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
            });
            cfg.Message<EmailSentEvent>(m => m.SetEntityName(EMAIL_SENT_TOPIC));
            cfg.Message<TransactionEmailFailedEvent>(m => m.SetEntityName(EMAIL_RETRY_TOPIC));

            cfg.ConfigureEndpoints(context);
        });
    });
}

MassTransitQueueAdapter.cs

public class MassTransitQueueAdapter : IQueueAdapter {
    #region attributes
    private readonly IBus _bus;
    #endregion

    #region ctor
    public MassTransitQueueAdapter(IBus bus) {
        _bus = bus;
    }
    #endregion

    #region methods
    public void PublishFailure(TransactionEmailFailedEvent failedEvent) {
        _bus.Publish(failedEvent);
    }

    public void PublishSuccess(EmailSentEvent sentEvent) {
        _bus.Publish(sentEvent);
    }
    #endregion
}

ServiceBusQueueAdapter.cs

public class ServiceBusQueueAdapter : IQueueAdapter {
    #region attributes
    private readonly QueueContext _context;
    #endregion

    #region ctor
    public ServiceBusQueueAdapter(QueueContext context) {
        _context = context;
    }
    #endregion

    #region methods
    private static ServiceBusClient BuildClient(string connectionString) => new ServiceBusClient(connectionString);

    public void PublishFailure(TransactionEmailFailedEvent failedEvent) {
        throw new System.NotImplementedException();
    }

    public void PublishSuccess(EmailSentEvent sentEvent) {
        ServiceBusClient client = BuildClient(_context.SentTopicConnectionString);
        ServiceBusSender sender = client.CreateSender(_context.SentTopicName);

        Task.Run(() => sender.SendMessageAsync(new ServiceBusMessage(JsonConvert.SerializeObject(sentEvent))));
    }
    #endregion
}

简单控制台应用代码

class Program {
    static void Main() {
        string           cs     = "Endpoint=sb://REDACTED.servicebus.windows.net/;SharedAccessKeyName=test_with_manage;SharedAccessKey=REDACTED;";
        ServiceBusClient client = new ServiceBusClient(cs);
        ServiceBusSender sender = client.CreateSender("test_1");

        sender.SendMessageAsync(new ServiceBusMessage("Hello World!"))
              .Wait();
    }
}

内容的提问来源于stack exchange,提问作者fizch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:24:02