我们已经开发了一个应用程序使用ASP网络核心的用途有批准被批准。用户将在用户指定的时间收到待批准的电子邮件。
示例
user1将接收电子邮件的时间设置为下午12:55
user2将接收电子邮件的时间设置为下午4点
我们已经在数据库中保存了用户设置时间,目前我们正在timer trigger
上运行Azure Function
应用程序。触发器将每15分钟运行一次,并检查SQL数据库中的用户通知时间。因此,如果用户将时间设置为12.31 pm,则一旦触发器每15分钟运行一次,他将在12.45 pm之后收到电子邮件。问题是用户必须等待15分钟,电子邮件不准时。
我们已经检查了HangFire Recurring jobs
,但问题是它每分钟都会调用我们的SQL数据库,这会导致性能影响。
有没有更好的解决方案可以在用户指定的时间发送电子邮件通知,而无需每分钟调用SQL数据库来检查指定的用户时间是否可用于发送通知?
2条答案
按热度按时间o0lyfsai1#
您可以使用具有延迟传递的队列。
实际上,当创建条目时,您将把消息推入队列,并通过计算DesiredTime - Now来延迟其传递。然后只需实现一个队列侦听器。在所需的时间,一条消息将弹出到队列中,并由您的worker处理。然后将一条新消息推入队列,延迟到下一个所需的时间。
有了这个解决方案,你可以挂起一个非常大量的电子邮件与近0压力对您的数据库。它将横向扩展电子邮件的处理,并立即具有相当好的可靠性。成本也很低,具体取决于您使用的队列。
您可以使用Azure存储队列来执行此操作。
您可能需要做一些额外的事情来确保这是可靠的,例如启用死信队列,并具有重新排队机制,以防在处理消息时出错。
参考资料
CloudQueueMessage.AddMessage
initialVisibilityDelay
Nullable<TimeSpan>
一个TimeSpan,指定从现在起消息不可见的时间间隔。如果为null,则消息将立即可见。
pw136qt22#
创建一个带有计时器触发器的Azure函数来处理计划的消息:
var queueClient = new QueueClient(serviceBusConnectionString, queueName);
...
await queueClient.SendAsync(message);
步骤如下。