我们使用 ASP Net Core 开发了一个应用程序,其中的使用需要获得批准。用户将在用户指定的时间收到待批准的电子邮件。
示例
user1 将接收电子邮件的时间设置为中午 12.55
user2 将接收电子邮件的时间设置为下午 4 点
我们已将用户设置的时间保存在数据库中,目前我们正在计时器触发器
上运行Azure Function
应用。该触发器将每 15 分钟运行一次,并检查 SQL 数据库中的用户通知时间。因此,如果用户将时间设置为中午 12.31 点,一旦触发器每 15 分钟运行一次,他就会在中午 12.45 点之后收到电子邮件。问题是用户必须等待 15 分钟,并且电子邮件未准时发送。
我们已经检查了 HangFire 重复作业
,但问题是它每分钟都会调用我们的 SQL 数据库,这会导致性能影响。
有没有更好的解决方案可以在用户指定的时间发送电子邮件通知,而不需要每分钟调用 SQL 数据库来检查指定的用户时间是否可以发送通知?
最佳答案
您可以使用延迟传送的队列。
本质上,当创建条目时,您会将消息推送到队列中,并通过计算 DesiredTime - Now 来延迟其传递。然后您只需实现一个队列监听器即可。在所需的时间,一条消息将弹出到队列中并由您的工作人员处理。然后,您将新消息推送到队列中,延迟到下一个所需时间。
使用此解决方案,您可以在数据库压力几乎为零的情况下挂起大量电子邮件。它将水平扩展电子邮件的处理,并且立即具有相当好的可靠性。根据您使用的队列,成本也相当低。
您可以使用 Azure 存储队列来实现此目的。
CloudQueueMessage message = new CloudQueueMessage(requestBody);
// The message will be visible in the queue after 3 days
queue.AddMessage(message, initialVisibilityDelay: TimeSpan.FromDays(3));
您可能需要做一些额外的事情来确保这是可靠的,例如启用死信队列并拥有重新排队机制,以防处理消息时出现错误。
引用文献
initialVisibilityDelay
Nullable<TimeSpan>
A TimeSpan specifying the interval of time from now during which the message will be invisible. If null then the message will be visible immediately.
关于c# - 每天在用户指定时间发送电子邮件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76285321/