C# 如何在ASP.NET核心应用程序中连续侦听发布/订阅消息?
我想实现一个ASP.NET核心API,它不响应HTTP请求,但在启动时开始侦听Google Cloud发布/订阅消息,并在其生命周期中无限期地侦听 使用官方发布/订阅SDK实现此功能的首选方式是什么 我可以想出两种方法: 方法1:只需使用C# 如何在ASP.NET核心应用程序中连续侦听发布/订阅消息?,c#,asp.net-core,google-cloud-platform,google-cloud-pubsub,C#,Asp.net Core,Google Cloud Platform,Google Cloud Pubsub,我想实现一个ASP.NET核心API,它不响应HTTP请求,但在启动时开始侦听Google Cloud发布/订阅消息,并在其生命周期中无限期地侦听 使用官方发布/订阅SDK实现此功能的首选方式是什么 我可以想出两种方法: 方法1:只需使用SimpleSubscriber,然后在启动中。配置开始收听消息: public void Configure(IApplicationBuilder app) { var simpleSubscriber = await SimpleSubscribe
SimpleSubscriber
,然后在启动中。配置开始收听消息:
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);
});
...
}
public void配置(IApplicationBuilder应用程序)
{
var simpleSubscriber=await simpleSubscriber.CreateAsync(subscriptionName);
var receivedMessages=新列表();
simpleSubscriber.StartAsync((msg,cancellationToken)=>
{
//在这里处理消息。
返回Task.FromResult(SimpleSubscriber.Reply.Ack);
});
...
}
方法2:使用专门创建的库定期运行作业,例如Quartz、Hangfire或FluentScheduler,每次触发作业时,使用SubscriberClient
提取新消息
哪一种是首选方法?第一种方法似乎更简单,但我不确定它是否真的可靠。第一种方法肯定是如何使用它
但是,请参见StartAsync
的文档:
开始接收消息。返回的任务
在以下任一情况下完成
调用StopAsync(CancellationToken)
,或者如果无法恢复
出现故障。此方法每次调用次数不能超过一次
SubscriberClient
实例
因此,您确实需要处理意外的StartAsync
shutdown(不可恢复的错误)。最简单的方法是使用外部循环,尽管这些错误被认为是不可恢复的,但在调用成功之前,可能需要更改调用的某些内容
代码可能如下所示:
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...
}
}
如果这不符合预期,请
编辑:SimpleSubscriber
在库中重命名为SubscriberClient
,因此答案已相应编辑。@Flater这是一个运行在Kubernetes中的ASP.NET核心应用程序。我希望应用程序同时具有一些REST端点,并继续收听一些发布/订阅消息。(我知道我可以把这两件事分成两个部分,但如果可能的话,为了方便起见,我想把它作为一个部分。)我会从最简单的方法开始,然后如果需要的话,搬到图书馆。在您的示例中,我只添加代码,用于将simpleSubscriber
保存在静态字段中的某个位置,以保护对象不受GCA的影响。据我所知,第一种方法应该可以-但我正在与了解更多信息的同事联系。感谢您提供的信息!所谓不可恢复的错误,您指的是堆栈溢出或内存不足之类的情况,所以它不会因为短暂的网络故障或类似的情况而停止,对吗?顺便问一下,监听是如何实现的,SimpleSubscriber
是内部轮询还是Pub/Sub支持类似WebSocket的连接?@MarkVincze SimpleSubscriber源代码在这里:您可以自己查看;)它使用一个长时间运行的流式RPC调用,该调用在第613行启动。@MarkVincze“unrecoverable”表示一个不可恢复的RPC错误。可恢复的RPC错误列表如下:所有其他错误都不可恢复。请注意,SimpleSubscriber已重命名为SubscriberClient。新的GitHub链接: