如何在 ASP.NET 核心应用程序中连续收听 Pub/Sub 消息?

How to listen for Pub/Sub messages in an ASP.NET Core app continuously?

我想实现一个 ASP.NET 核心 API,它不响应 HTTP 请求,但在启动时开始侦听 Google 云 Pub/Sub 消息,它会在其整个生命周期中无限期地收听。

使用官方 Pub/Sub SDK 实现此功能的首选方法是什么?

我可以想到两个办法:

方法一:只用一个SimpleSubscriber,然后在Startup.Configure开始收听消息:

public void Configure(IApplicationBuilder app)
{
    var simpleSubscriber = await SimpleSubscriber.CreateAsync(subscriptionName);
    var receivedMessages = new List<PubsubMessage>();

    simpleSubscriber.StartAsync((msg, cancellationToken) =>
    {
        // Process the message here.

        return Task.FromResult(SimpleSubscriber.Reply.Ack);
    });

    ...
}

方法二:使用专门创建的库来周期性地运行一个作业,例如Quartz、Hangfire或FluentScheduler,每次作业被触发时,拉取带有 SubscriberClient.

的新消息

哪个是首选方法?第一个好像比较简单,但是不知道靠谱不。

第一种方法绝对是打算如何使用它。

但是,请参阅 StartAsync 的文档:

Starts receiving messages. The returned Task completes when either StopAsync(CancellationToken) is called or if an unrecoverable fault occurs. This method cannot be called more than once per SubscriberClient instance.

因此您确实需要处理因无法恢复的错误而意外 StartAsync 关闭。最简单的做法是使用外部循环,尽管考虑到这些错误被认为是不可恢复的,但在调用成功之前可能需要更改一些内容。

代码可能如下所示:

while (true)
{
    // Each SubscriberClientinstance must only be used once.
    var subscriberClient = await SubscriberClient.CreateAsync(subscriptionName);
    try
    {
        await subscriberClient.StartAsync((msg, cancellationToken) =>
        {
            // Process the message here.
            return Task.FromResult(SimpleSubscriber.Reply.Ack);
        });
    }
    catch (Exception e)
    {
        // Handle the unrecoverable error somehow...
    }
}

如果这没有按预期工作,请let us know

编辑SimpleSubscriber 在库中已重命名为 SubscriberClient,因此答案已相应编辑。